Академический Документы
Профессиональный Документы
Культура Документы
Esas instrucciones pueden ser una simple instrucción de SQL, o bien complejos
bloques de código, con variables, condicionales, repetitivas, y tal (a diferencia
de Access, donde las Queries pueden contener una única instrucciónSQL).
Estos tres componentes son las vistas (Views), las funciones almacenadas (Stored
Functions) y los procedimientos almacenados (Stored Procedures). Los Stored
Procedures y las Stored Functions se agrupan en un conjunto llamado rutinas
(Routines).
Las vistas no nos interesan demasiado, ya que no sirven para el uso que solemos
darle a las bases de datos, así que vamos a concentrarnos en los otros dos
elementos.
Los Stored Procedures son más parecidos a las Queries de Access: permiten
almacenar instrucciones SQL, tanto de lectura como de escritura, guardados bajo
un nombre, y ejecutarlos desde C#. Puede recibir parámetros para ser utilizados
en la ejecución.
Si bien un Stored Procedure de MySQL puede almacenar un gran bloque de
instrucciones, en nuestro primer ejemplo vamos a crear y utilizar un SP simple con
una instrucción única, con parámetros.
La instruccion call indica que estamos efectuando una llamada a una SP. Es
obligatorio indicar el nombre de la base a la que pertenece el SP que estamos
invocando. Y, desde luego, el parámetro que le mandamos.
Ahora vamos a crear una Stored Function. En qué se diferencia una función
almacenada de un procedimiento almacenado?
Entonces, vamos a comenzar por crear una función, en forma similar a como hicimos
con el SP, yendo a la seccion Routines de la base de datos, y eligiendo Create
Function.
Vamos a hacer una función que reciba como parámetro el código de un libro, y
devuelva su título.
Segundo, vamos a escribir el SQL que obtiene el resultado. En ese SQL, usamos
el into para asignar el campo que queremos a la variable a devolver.
Por último, en el Return, indicamos la variable que contiene el resultado a devolver.
Todo muy lindo, pero qué pasa si la función recibe como parámetro un código de
libro que no existe? Si aún siguiéramos en Access no podríamos hacer nada
útil. Pero no estamos más en Access, verdad?
Si el código no existe, la variable Devolver fue declarara pero no fue asignada, por
lo que quedó en null. Estaría buenísimo que pudiéramos hacer que, en tal caso, la
función devuelva un string predeterminado.
Para eso, utilizamos la ayuda de una función llamada ifnull. Esta función es muy
simple: recibe dos parámetros, y evalúa el primero de los dos. Si ese primer
parámetro no es null, la función devuelve ese mismo valor recibido. Pero si ese
primer parámetro es null, entonces devuelve lo recibido como segundo parámetro.
Podemos volver a una solapa de Query para confirmar la veracidad de mis palabras.
Aquí terminamos del lado de MySQL. Ahora, vamos a C# para acceder a todos
estos procesos. Síganme, síganme, pasen por aquí.
Un procedimiento puede tener uno o mas parámetros o también no tener ninguno. Puede
carecer de atributos o puede poseer varios. Y como ves, el cuerpo del procedimiento es
un bloque de instrucciones definido.
Parámetros de Entrada y Salida en un Procedimiento
Un parámetro es un dato necesario para el funcionamiento del procedimiento, ya que
contribuyen al correcto desarrollo de las instrucciones del bloque de instrucciones.
Los parámetros pueden ser de entrada (IN), salida (OUT) o entrada/salida (INOUT) y deben
tener definido un tipo. Un parámetro de entrada en un dato que debe ser introducido en la
llamada del procedimiento para definir alguna acción del bloque de instrucciones.
Un parámetro de salida es un espacio de memoria en el cual el procedimiento devolverá
almacenado su resultado. Y un parámetro de entrada/salida contribuye tanto como a
ingresar información útil como para almacenar los resultados del procedimiento. Por defecto,
si no indicas el tipo de parámetro MySQL asigna IN.
Para especificar el tipo de parámetro seguimos la siguiente sintaxis:
Imprima los números del 1 hasta n, donde n esta dado por el usuario.
Usaremos un procedimiento para capturar el numero n del usuario. Incorporaremos una
variable contadora que comience en 1 y un WHILE para el incremento e impresión. Veamos:
DELIMITER //
La sentencia DELIMITER cambia el carácter de terminación ';' por cualquier otro carácter,
en este caso elegimos '//'. Se hace con el fin de que MySQL no termine el procedimiento
al encontrar el primer punto y coma. Al final restablecemos el valor original del caracter de
escape.
¿Como ejecuto un procedimiento ya almacenado?
Usaremos el comando CALL enseguida del nombre del procedimiento y si tiene parámetros,
entonces se ingresan sus parámetros. Ahora veamos como llamar al anterior procedimiento:
CALL numeros_1_hasta_n(5)
Veamos el resultado:
DELIMITER //
CREATE PROCEDURE insertar(id_cliente INT, nombre_cliente VARCHAR(100), apellido_cliente
VARCHAR(100))
COMMENT 'Procedimiento que inserta un cliente a la base de datos'
BEGIN
IF NOT EXISTS ( SELECT C.ID
FROM CLIENTE AS C
WHERE C.ID = id_cliente) THEN
INSERT INTO CLIENTE(ID, NOMBRE, APELLIDO)
VALUES ( id_cliente,nombre_cliente,apellido_cliente);
ELSE
SELECT 'Este cliente ya existe en la base de datos!';
END IF;
END//
DELIMITER ;
Si el procedimiento que deseamos crear ya existe, entonces lo borraremos para darle paso a
la nueva definición.
El JOIN más común es: SQL INNER JOIN (join simple). Un SQL INNER
JOIN devuelve todos los registros de varias tablas que cumplen con la
condición.
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
Ejemplo SQL LEFT JOIN
Aquí podemos ver que el resultado es el mismo que el INNER JOIN pero
esto es porque todos los registros de "books" tienen un "idpublisher" que
coincide con un "idpublisher" de la tabla "publisher". Si insertamos un
nuevo registro en la tabla "books", con un "idpublisher" que no coincida
con ningun "idpublisher" de la tabla "publisher" (idpublisher=0) entonces;
cuando escribimos nuestra consulta LEFT JOIN no vamos a obtener ningún
registro de la tabla "publisher";
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
La variable SKIP_NETWORKING
Esta variable permite restringir conexiones desde otro servidor. Si
está a ON quiere decir que NO permite atender conexiones
externas. Si estuviera en valor OFF sí permitiría conexiones
externas desde otros hosts.
/etc/my.cnf
La variable BIND-ADDRESS
En el fichero de configuración
/etc/init.d/my.cnf
bind-address=0.0.0.0
Primero que nada debemos ingresar a nuestro servidor por medio de SSH.
Una vez estamos dentro (como root), toca darle privilegios de acceso
remoto a la base de datos con la cual trabajaremos. Por ejemplo:
# mysql -u root -p
mysql> update db set Host=’111.11.11.1‘ where db=’nombre_bd‘;
mysql> update user set Host=’111.11.11.1‘ where user=’usuario_bd‘;
Como alternativa, en el caso de que quieras acceso remoto para todas las
bases de datos:
mysql> exit;
Aquí lo que hacemos es garantizar privilegios sobre todas las bases de datos
al usuario root del servidor remoto. Aunque nunca es conveniente hacerlo,
generalmente es mejor crear un usuario con menos privilegios y que pueda
acceder solo a la base de datos necesaria para la conexión.
Por defecto tiene el valor 50, e indica que realiza una espera de
50″ si se produce un bloqueo. Yo conseguí resolver mi problema
ampliando el valor de esa variable a 100.
+—-+——+———–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——+———+——+——-+——————+
| 4 | root | localhost | NULL | Query | 0 | NULL | show
processlist |
+—-+——+———–+——+———+——+——-+——————+
Generamos un TXT con todos los comandos kill por cada uno de
los procesos:
ERROR 1206 (HY000): The total number of locks exceeds the lock
table size
SELECT
CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3))
RIBPS
FROM (SELECT SUM(data_length+index_length)
Total_InnoDB_Bytes
FROM information_schema.tables
WHERE engine='InnoDB') A;
pero tenemos que tener en cuenta el no pasarnos del 80% del total
de nuestra memoria.
innodb_buffer_pool_size=50M
cd /etc/init.d/mysql start
/etc/init.d/mysql stop
MySQL Workbench:
Procederemos a abrir la aplicación y nos dirigimos al menú “Database”, y
luego damos clic en “Query Database…”:
Date_Format()
DATE_FORMAT(date,format)
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')