Académique Documents
Professionnel Documents
Culture Documents
Pagina 1 / 52
Versin 1.0
Reproduccin prohibida
SolucionJava.com
Ing. Cedric Simon Tel: 2268 0974 Cel: 8888 2387 Email: c e d r i c @ s o l u c i o n j a v a . c o m Web: www.solucionjava.com
Pagina 2 / 52
1 ndice
!
" #$
%
$
&
" #$
%
!" #
$%&
" '
(
(
)*$
(
+, &- .
(
/01- .
(
101- .
(
123
45 6- .
+
)701"!- .
+
0 86
)*$
+
!
(
)
" #$
*
19$6
/
19:
;
/
(
)+
*
"( ,
(-.
"/!,01
"#
$
%2
3
%4+"+
%5
%
67
%&
#
'
80
9
80
9
84
"
)
9
8
)6
:
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 3 / 52
84
;
:
8%4
)
*
884
)
89
3
8:4
8*4
;+"+
84
)
9
84
;
)
9
'(
$
)
!
9<
*
95,205-<"5,24<=52(=
*
9$
5,$$
9
.>(==-
9
-5$,
9%?
(0
#
0"$<,
(
#
($ $"=7
("
>
(!"
0"$<,
(0"$<,'
985
%
(0
( 7?=
(
4">
(
"$7
995
;
8
(( 4
(($ "<
(( $77?
(
(( $<@
(
((!$ ,<
(
(( ,?<
(
(( :>$
+
*+#
!
:
@
5,22(>>
*
:
@
-02(>>
:<
A
)
!,
*
@
,$2?(B
*
@
5,2?(B
/6
0,7?@:
+
/6
>7:",<@:
+
-#
.
!
6
6
"
*
"
"
*
"
/0
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 4 / 52
Versin 1.0
Reproduccin prohibida
Pagina 5 / 52
2 Introduccin al curso
2.1 Objetivo de este curso
En este curso vamos a aprender como programar disparadores, procedimientos, y funciones en
MySQL versin 5.0.27.
Versin 1.0
Reproduccin prohibida
Pagina 6 / 52
3 Genralidades de MySQL
3.1 Historia de MySQL
Empezamos con la intencin de usar mSQL para conectar a nuestras tablas utilizando nuestras
propias rutinas rpidas de bajo nivel (ISAM). Sin embargo y tras algunas pruebas, llegamos a la
conclusin que mSQL no era lo suficientemente rpido o flexible para nuestras necesidades. Esto
provoc la creacin de una nueva interfcie SQL para nuestra base de datos pero casi con la misma
interfcie API que mSQL. Esta API fue diseada para permitir cdigo de terceras partes que fue
escrito para poder usarse con mSQL para ser fcilmente portado para el uso con MySQL.
La derivacin del nombre MySQL no est clara. Nuestro directorio base y un gran nmero de
nuestras bibliotecas y herramientas han tenido el prefijo "my" por ms de 10 aos. Sin embargo, la
hija del co-fundador Monty Widenius tambin se llama My. Cul de los dos di su nombre a MySQL
todava es un misterio, incluso para nosotros.
El nombre del delfn de MySQL (nuestro logo) es "Sakila", que fu elegido por los fundadores de
MySQL AB de una gran lista de nombres sugerida por los usuarios en el concurso "Name the
Dolphin" (ponle nombre al delfn). El nombre ganador fue enviado por Ambrose Twebaze, un
desarrollador de software Open Source de Swaziland, frica. Segn Ambrose, el nombre femenino de
Sakila tiene sus races en SiSwate, el idioma local de Swaziland. Sakila tambin es el nombre de una
ciudad en Arusha, Tanzania, cerca del pas de origen de Ambrose, Uganda.
Escrito en C y en C++
Probado con un amplio rango de compiladores diferentes
Funciona en diferentes plataformas.
Usa GNU Automake, Autoconf, y Libtool para portabilidad.
APIs disponibles para C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, y Tcl.
Uso completo de multi-threaded mediante threads del kernel. Pueden usarse fcilmente
multiple CPUs si estn disponibles.
Proporciona sistemas de almacenamiento transaccionales y no transaccionales.
Usa tablas en disco B-tree (MyISAM) muy rpidas con compresin de ndice.
Relativamente sencillo de aadir otro sistema de almacenamiento. Esto es til si desea
aadir una interfcie SQL para una base de datos propia.
Un sistema de reserva de memoria muy rpido basado en threads.
Joins muy rpidos usando un multi-join de un paso optimizado.
Tablas hash en memoria, que son usadas como tablas temporales.
Las funciones SQL estn implementadas usando una librera altamente optimizada y deben
ser tan rpidas como sea posible. Normalmente no hay reserva de memoria tras toda la
inicializacin para consultas.
El cdigo MySQL se prueba con Purify (un detector de memoria perdida comercial) as como
con Valgrind, una herramienta GPL (http://developer.kde.org/~sewardj/).
El servidor est disponible como un programa separado para usar en un entorno de red
cliente/servidor. Tambin est disponible como biblioteca y puede ser incrustado (linkado) en
Versin 1.0
Reproduccin prohibida
Pagina 7 / 52
3.2.3 Seguridad
Un sistema de privilegios y contraseas que es muy flexible y seguro, y que permite verficacin
basada en el host. Las contraseas son seguras porque todo el trfico de contraseas est encriptado
cuando se conecta con un servidor.
3.2.5 Conectividad
Los clientes pueden conectar con el servidor MySQL usando sockets TCP/IP en cualquier plataforma.
En sistemas Windows de la familia NT (NT,2000,XP, o 2003), los clientes pueden usar named pipes
para la conexin. En sistemas Unix, los clientes pueden conectar usando ficheros socket Unix.
En MySQL 5.0, los servidores Windows soportan conexiones con memoria compartida si se inicializan
con la opcin --shared-memory. Los clientes pueden conectar a travs de memoria compartida usando
la opcin --protocol=memory.
La interfaz para el conector ODBC (MyODBC) proporciona a MySQL soporte para programas clientes
que usen conexiones ODBC (Open Database Connectivity). Por ejemplo, puede usar MS Access para
conectar al servidor MySQL. Los clientes pueden ejecutarse en Windows o Unix. El cdigo fuente de
MyODBC est disponible. Todas las funciones para ODBC 2.5 estn soportadas, as como muchas
otras.
La interfaz para el conector J MySQL proporciona soporte para clientes Java que usen conexiones
JDBC. Estos clientes pueden ejecutarse en Windows o Unix. El cdigo fuente para el conector J est
disponible.
3.2.6 Localizacin
El servidor puede proporcionar mensajes de error a los clientes en muchos idomas.
Soporte completo para distintos conjuntos de carcteres, incluyendo latin1 (ISO-8859-1), german,
big5, ujis, y ms. Por ejemplo, los carcteres escandinavos '', '' y '' estn permitidos en nombres de
tablas y columnas. El soporte para Unicode est disponible.
Versin 1.0
Reproduccin prohibida
Pagina 8 / 52
Todos los datos se guardan en el conjunto de carcteres elegido. Todas las comparaciones para
columnas normales de cadenas de carcteres son case-insensitive.
La ordenacin se realiza acorde al conjunto de carcteres elegido (usando colacin Sueca por defecto).
Replicatin (Estable)
Hay grandes grupos de servidores usando replicacin en produccin, con buenos resultados. Se
trabaja para mejorar caractersticas de replicacin en MySQL 5.x.
1.1.1.2
El cdigo Berkeley DB es muy estable, pero todava lo estamos mejorando con el interfaz del motor de
almacenamiento transaccional BDB en MySQL Server.
1.1.1.4
Versin 1.0
Reproduccin prohibida
1.1.1.5
Pagina 9 / 52
MyODBC 3.51 usa ODBC SDK 3.51 y es usado en sistemas de produccin mpliamente. Algunas
cuestiones surgidas parecen ser cuestin de las aplicaciones que lo usan e independientes del
controlador ODBC o la base de datos subyacente.
Versin 1.0
Reproduccin prohibida
Pagina 10 / 52
Vamos ahora a cambiar la clave del usuario root. Para cambiar la clave, entra en /mysql y ejecuta :
/usr/bin/mysqladmin -u root password 'SolPHP' La nueva clave sera 'SolPHP'.
Para verificar que MySQL esta bien instalado y se inicia, ejecuta
como Root.
Y ahora vamos a crear la base de datos del curso:
cd /media/CD
/mysql/mysql -u root -pSolJava
create database curso;
exit;
/mysql/mysql -u root -pSolJava curso < curso.sql
Versin 1.0
Reproduccin prohibida
Pagina 11 / 52
5.2 InnoDB
Es el motor para bases de datos transacionales y/o con claves primaria y secundaria. Es el motor que
vamos a utilizar en este curso. Se puede definir como motor por defecto a nivel de la base de datos y/o
a nivel del servidor.
5.4 Otros
MySQL trae varios otros tipos de motores de bases de datos, con sus especificidades. Entre otros
BDB, CSV,... Ver la documentacin de MySQL para mas detalles.
Versin 1.0
Reproduccin prohibida
Pagina 12 / 52
6 Tipos de columas
6.1 Tipos numricos
A continuacin hay un resumen de los tipos de columnas numricos.
M indica la anchura mxima para mostrar. La anchura mxima es 255.
Si especifica para columnas numricas,, MySQL aade automticamente el atributo
en la columna.
en la definicin de una columna de tipo entero es un alias para
.
Tipo
3
Valor Mximo
! !!
!
"#M$%
En un tipo de datos bit. indica el nmero de bits por valor, de 1 a 64. El valor por defecto es
1 si se omite M .
"#$%"
%"%
Un entero muy pequeo. El rango con signo es de a . El rango sin signo es de a
.
,
Son sinnimos para #$. Un valor de cero se considera falso. Valores distintos a cero
se consideran ciertos.
En el futuro, se introducir tratamiento completo de tipos booleanos segn el estndard SQL.
"#M$%"
%"%
Un entero pequeo. El rango con signo es de a . El rango sin signo es de a
.
"#M$%"
%"%
Entero de tamao medio. El rango con signo es de a . El rango sin singo
es de a .
Versin 1.0
Reproduccin prohibida
Pagina 13 / 52
"#M$%"
%"%
Toda la aritmtica se hace usando valores o , as que no debe usar enteros sin signos
mayores que ! (63 bits) except con funciones bit! Si lo hace, algunos de los
ltimos dgitos en el resultado pueden ser errneos por culpa de errores de redondeo al convertir
valores a .
Para darles una idea, un INT unsigned permite almacenar un numero por segundo durante 135 aos.
un BIGINT unsigned, 1.000.000 de numeros por segundo durante mas de 500.000 aos...
Versin 1.0
Reproduccin prohibida
Pagina 14 / 52
.//.
..
*
.//.
Versin 1.0
Reproduccin prohibida
Pagina 15 / 52
#$
El tipo
es similar al tipo
0
, pero almacena cadenas de carcteres binarias
en lugar de cadenas de carcteres no binarias.
Una columna con una longitud mxima de 255 (2^8 - 1) bytes.
-
Una columna - con longitud mxima de 255 (2^8 - 1) carcteres.
"#$%
Una columna con longitud mxima de 65,535 (2^16 - 1) bytes.
-"#$%
Una columna - con longitud mxima de 65,535 (2^16 - 1) carcteres.
Una columna con longitud de 16,777,215 (2^24 - 1) bytes.
-
Una columna - con longitud mxima de 16,777,215 (2^24 - 1) carcteres.
Una columna con longitud mxima de 4,294,967,295 o 4GB (2^32 - 1) bytes. La longitud
mxima efectiva (permitida) de las columnas depende del tamao mximo
configurado para los paquetes en el protocolo cliente/servidor y la memoria disponible.
-
Una columna - con longitud mxima de 4,294,967,295 or 4GB (2^32 - 1) carcteres. La
longitud mxima efectiva (permitida) de columnas - depende del tamao mximo de
paquete configurado en el protocolo cliente/servidor y la memoria disponible.
#.value1.'.23456.'((($
Una enumeracin. Un objeto de cadena de carcteres que slo puede tener un valor, elegido
de una lista de valores .value1., .23456., (((, o el valor de error especial .. . Una
columna puede tener un mximo de 65,535 valores distintos. Los valores se
representan internamente como enteros.
#.value1.'.value2.'((($
Un conjunto. Un objeto de cadena de carcteres que puede tener cero o ms valores que deben
pertencer a la lista de valores .value1., .23456., ((( Una columna
puede tener un
mximo de 64 miembros. Los valores
se representan internamente como enteros.
Versin 1.0
Reproduccin prohibida
Pagina 16 / 52
Almacenamiento requerido
1 byte
2 bytes
3 bytes
,
4 bytes
8 bytes
#&$
4 bytes
"*
%, objeto
8 bytes
#M'$, #'$
#M$
3 bytes
8 bytes
*
4 bytes
3 bytes
1 byte
Almacenamiento requerido
0 #M$
0 #M$
#$
#$
, -
Versin 1.0
Reproduccin prohibida
, -
Pagina 17 / 52
Versin 1.0
Reproduccin prohibida
Pagina 18 / 52
7 Funciones y operadores
7.1 Precedencias de los operadores
La precedencia de operadores se muestra en la siguiente lista, de menor a mayor precedencia. Los
operadores que se muestran juntos en una lnea tienen la misma precedencia.
/J
11''-
KK'
L '
'L0 '0 '
J'IJM'MJ'M'IJ'I'IM'NJ'
'O'-*'
1
K
II'MM
')
+',''P'
Q
#>68935<3>:3$'R#:<26>8:B<?6D:95<3>:3$
N
'
Use parntesis para forzar el orden de evaluacin en una expresin. Por ejemplo:
=;8S4M
)+T
M
=;8S4M
#)$+T
M!
Versin 1.0
Reproduccin prohibida
Pagina 19 / 52
>68549(((%"
>68549% ,
L0 "condition%0 >68549"L0
"condition%0 >68549(((%"
>68549%
La primera versin retorna result donde valueJcompare-value. La segunda versin retorna el
resultado para la primera condicin que es cierta. Si no hay ningn resultado coincidente, el
resultado tras
se retorna, o si no hay parte
.
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
-> 'one'
#expr1'6H&>'6H&>$
Si 6H&> es TRUE (expr1IM and 6H&>IM ) entonces #$ retorna expr2; de otro
modo retorna 6H&>. #$ retorna un valor numrico o cadena de carcteres, en funcin del
contexto en que se usa.
mysql> SELECT IF(1>2,2,3);
-> 3
#expr1'6H&>$
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 20 / 52
Si expr1 no es , #$ retorna expr1, de otro modo retorna 6H&>. #$
retorna un valor numrico o de cadena de carcteres, en funcin del contexto en que se usa.
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
#expr1'expr2$
Retorna si 6H&>J6H&> es cierto, de otro modo retorna expr1. Es lo mismo que
L0 6H&>J6H&>0
expr1 .
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
Versin 1.0
Reproduccin prohibida
Pagina 21 / 52
#str'pos$ ,
#strpos$,
#89>'&78'46<$ ,
#89>poslen$
Las formas sin el arguemnto 46< retornan una subcadena de la cadena str comenzando en la
posicin &78. Las formas con el argumento 46< retornan una subcadena de longitud 46< a
partir de la cadena 89>, comenzando en la posicin pos.Las formas que usan son
sintaxis SQL estndard. En MySQL 5.0, es posible usar valores negativos para pos. En este
caso, el inicio de la subcadena son &78 carcteres a partir del final de la cadena, en lugar del
principio. Un valor negativo puede usarse para &78 en cualquier de las formas de esta
funcin.
mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki'
Esta funcin trabaja con mltiples bytes.
Tenga en cuenta que si usa un valor menor a 1 para len, el resultado siempre es una cadena
vaca.
#$ es sinnimo de
#$.
-#str'delim'A75<9$
Retorna la subcadena de la cadena 89> antes de A75<9 ocurrencias del delimitador ?64:=. Si
count es positivo, todo a la izquierda del delimitador final (contando desde la izquierda) se
retorna. Si A75<9 es negativo, todo a la derecha del delimitador final (contando desde la
derecha) se retorna.
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
Versin 1.0
Reproduccin prohibida
Pagina 22 / 52
Descricin
Versin 1.0
Reproduccin prohibida
Pagina 23 / 52
Versin 1.0
Reproduccin prohibida
Pagina 24 / 52
Estas dos funciones son sinnimos. Tenga en cuenta que el valor retornado se convierte a
.
#-$
Retorna el valor entero ms grande pero no mayor a -.
mysql> SELECT FLOOR(1.23);
-> 1
mysql> SELECT FLOOR(-1.23);
-> -2
Tenga en cuenta que el valor devuelto se convierte a .
#N'$ , P, M
Operacin de mdulo. Retorna el resto de dividido por .
mysql> SELECT MOD(234, 10);
-> 4
mysql> SELECT 253 % 7;
-> 1
mysql> SELECT MOD(29,9);
-> 2
mysql> SELECT 29 MOD 9;
-> 2
Esta funcin puede usar valores .
#$ tambin funciona con valores con una parte fraccional y retorna el resto exacto tras la
divisin:
mysql> SELECT MOD(34.5,3);
-> 1.5
*L#X'$ , *L#-'Y$
Retorna el valor de X a la potencia de Y.
mysql> SELECT POW(2,2);
-> 4
mysql> SELECT POW(2,-2);
-> 0.25
#$,
# $
Retorna un valor aleatorio en coma flotante del rango de 0 a 1.0. Si se especifica un
argumento entero , es usa como semilla, que produce una secuencia repetible.
mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881
mysql> SELECT RAND(20);
-> 0.15888261251047
Puede usar esta funcin para recibir registros de forma aleatoria como se muestra aqu:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
#$ combinado con es til para seleccionar una muestra aleatoria de
una conjunto de registros:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d
-> ORDER BY RAND() LIMIT 1000;
Tenga en cuenta que
#$ en una clusula L0 se re-evala cada vez que se ejecuta el
L0.
#$ no pretende ser un generador de nmeros aleatorios perfecto, pero es una forma
rpida de generar nmeros aleatorios ad hoc portable entre plataformas para la misma
versin de MySQL.
Versin 1.0
Reproduccin prohibida
Pagina 25 / 52
Versin 1.0
Reproduccin prohibida
Pagina 26 / 52
-> -31
#?396'
expr9;&6$,
#date'
expr9;&6$
0
0
LO
LO
0
0
.
(
.
.
(
.
.
/
.
0
.0
(
.
0
.0
/
/
.
0
.0
/
.
.
(
.
.
0
/
/
.
.
0
/
.
0
.
0
.
0
.
0
.
#?396'@7>=39$
Formatea el valor ?396 segn la cadena @7>=39 . Los siguientes especificadores pueden
usarse en la cadena @7>=39 :
Especificador Descripcin
P3
Da de semana abreviado (
5<..
39)
PD
PA
Da del mes con sufijo ingls (9W, 89, <?, >?, ...)
P?
P6
P@
Microsegundos (..!!!!!!)
Versin 1.0
Reproduccin prohibida
Pagina 27 / 52
P0
Hora (..)
PW
Hora (..)
P
Hora (..)
P:
P[
Da del ao (..)
PV
Hora (..)
P4
Hora (..)
P
P=
P&
o *
P>
Segundos (..!)
P8
Segundos (..!)
P
P
P5
P
P2
PL
Nombre da semana (
5<?3;..
395>?3;)
PU
Da de la semana (=Sunday..=Saturday)
P-
PH
P
P;
PP
Versin 1.0
Reproduccin prohibida
Pagina 28 / 52
Toma una fecha o fecha/hora y retorna el valor correspondiente para el ltimo da del mes.
Retorna si el argumento es invlido.
mysql> SELECT LAST_DAY('2003-02-05');
-> '2003-02-28'
mysql> SELECT LAST_DAY('2004-02-05');
-> '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
-> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
-> NULL
L#$
Retorna la fecha y hora actual como valor en formato .00//
. o
00
Versin 1.0
Reproduccin prohibida
Pagina 29 / 52
Retorna una cadena que indica la versin del servidor MySQL. La cadena usa el conjunto de
carcteres 59@ .
Versin 1.0
Reproduccin prohibida
Pagina 30 / 52
8
8.1
78&>7A6?:=:6<97887<AB?:F78S56866[6A593<?:>6A93=6<966<6486>2:?7>(
<&>7A6?:=:6<9786:<27A3583<?75<A7=3<?7
';8B47&56?6&383>2347>68
583<?723>:3D468?6834:?3(<3@5<A:B<&56?6443=3>86?68?6?68?6?6<9>7?6
5<A7=3<?7A7=7A534S5:6>79>3@5<A:B<#689768':<27A3<?764<7=D>6?643
@5<A:B<$';&56?6>697><3>5<2347>68A343>(38>59:<3834=3A6<3?38&56?6<
443=3>79>38>59:<3834=3A6<3?38(
8.2
CREATE PROCEDURE sp_name ([&3>3=696>[,...]])
[AW3>3A96>:89:A ...] routine_body
CREATE FUNCTION 8&<3=6 ([&3>3=696>[,...]])
RETURNS type
[characteristic ...] >759:<6D7?;
&3>3=696>:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT '89>:<F'
>759:<6D7?;:
&>7A6?:=:6<97834=3A6<3?787A7=3<?78
2G4:?78
Estos comandos crean una rutina almacenada.
Por defecto, la rutina se asocia con la base de datos actual.
Para asociar la rutina explcitamente con una base de datos, especifique el nombre como
?D<3=6(8&<3=6 al crearlo.
Si el nombre de rutina es el mismo que el nombre de una funcin de SQL, necesita usar un espacio
entre el nombre y el siguiente parntesis al definir la rutina, o hay un error de sintaxis. Esto tambin
es cierto cuando invoca la rutina posteriormente.
La clusula
puede especificarse slo con , donde es obligatorio. Se usa para
indicar el tipo de retorno de la funcin, y el cuerpo de la funcin debe contener un comando
23456.
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 31 / 52
La lista de parmetros entre parntesis debe estar siempre presente. Si no hay parmetros, se debe
usar una lista de parmetros vaca #$ .
Cada parmetro es un parmetro por defecto. Para especificar otro tipo de parmetro, use la
palabra clave o antes del nombre del parmetro. Especificando , , o slo es
valido para una *.
Un marco para procedimientos almacenados externos se introducir en el futuro. Esto permitira
escribir procedimientos almacenados en lenguajes distintos a SQL. Uno de los primeros lenguajes a
soportar ser PHP ya que el motor central de PHP es pequeo, con flujos seguros y puede empotrarse
fcilmente. Como el marco es pblico, se espera soportar muchos otros lenguajes.
Un procedimiento o funcin se considera "determinista" si siempre produce el mismo resultado para
los mismos parmetros de entrada, y "no determinista" en cualquier otro caso. Si no se da ni
ni
por defecto es
.
Varias caractersticas proporcionan informacin sobre la naturaleza de los datos usados por la rutina.
indica que la rutina no contiene comandos que leen o escriben datos.
indica
que la rutina no contiene comandos SQL .
indica que la rutina contiene comandos
que leen datos, pero no comandos que escriben datos.
indica que la rutina
contiene comandos que pueden escribir datos.
es el valor por defecto si no se dan
explcitamente ninguna de estas caractersticas.
La caracterstica
puede usarse para especificar si la rutina debe ser ejecutada usando
los permisos del usuario que crea la rutina o el usuario que la invoca. El valor por defecto es
. Esta caracterstica es nueva en SQL:2003. El creador o el invocador deben tener permisos
para acceder a la base de datos con la que la rutina est asociada.
MySQL almacena la variable de sistema 8S4=7?6 que est en efecto cuando se crea la rutina, y
siempre ejecuta la rutina con esta inicializacin.
La clusula es una extensin de MySQL, y puede usarse para describir el procedimiento
almacenado. Esta informacin se muestra con los comandos
0L
* y
0L
.
MySQL permite a las rutinas que contengan comandos DDL (tales como
y *) y comandos
de transaccin SQL (como ). Esto no lo requiere el estndar, y por lo tanto, es especfico de la
implementacin.
Los procedimientos almacenados no pueden usar
.
Nota: Actualmente, los procedimientos almacenados creados con
no pueden tener
referencias a tablas. (Esto puede incluir algunos comandos
que pueden contener referencias a
tablas, por ejemplo
3/J#
-#:?$9$, y por otra parte no pueden contener
comandos
, por ejemplo
.06447U7>4?N. 23>.) Esta limitacin se
elminar en breve.
Los comandos que retornan un conjunto de resultados no pueden usarse desde una funcin
almacenada. Esto incluye comandos
que no usan para tratar valores de columnas en
variables, comandos
0L y otros comandos como -*
. Para comandos que pueden determinarse
al definir la funcin para que retornen un conjunto de resultados, aparece un mensaje de error 79
3447U6?97>695><3>68549869@>7=3@5<A9:7< (
*
). Para
comandos que puede determinarse slo en tiempo de ejecucin si retornan un conjunto de resultados,
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 32 / 52
Versin 1.0
Reproduccin prohibida
Pagina 33 / 52
8.6
!
8.6.1 Declarar variables locales con
DECLARE 23><3=6[,...] type [DEFAULT value]
Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto para la
variable, incluya una clusula
. El valor puede especificarse como expresin, no necesita ser
una constante. Si la clusula
no est presente, el valor inicial es .
Versin 1.0
Reproduccin prohibida
Pagina 34 / 52
La visibilidad de una variable local es dentro del bloque ((( donde est declarado.
Puede usarse en bloques anidados excepto aqullos que declaren una variable con el mismo nombre.
8.6.6
handlers
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 35 / 52
condition_value:
SQLSTATE [VALUE] 8S48939623456
| A7<?:9:7<<3=6
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
Este comando especifica handlers que pueden tratar una o varias condiciones. Si una de estas
condiciones ocurren, el comando especificado se ejecuta.
Para un handler , contina la rutina actual tras la ejecucin del comando del handler.
Para un handler - , termina la ejecucin del comando compuesto ((( actual. El
handler de tipo todava no se soporta.
L
es una abreviacin para todos los cdigos SQLSTATE que comienzan con .
es una abreviacin para todos los cdigos SQLSTATE que comienzan con .
-* es una abreviacin para todos los cdigos SQLSTATE no tratados por
L
o .
Adems de los valores SQLSTATE , los cdigos de error MySQL se soportan.
Por ejemplo:
mysql> CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE handlerdemo ()
-> BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
-> SET @x = 1;
-> INSERT INTO test.t VALUES (1);
-> SET @x = 2;
-> INSERT INTO test.t VALUES (1);
-> SET @x = 3;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x//
+------+
| @x |
+------+
|3 |
+------+
1 row in set (0.00 sec)
Tenga en cuenta que ]H es , lo que muestra que MySQL se ha ejecutado al final del procedimiento.
Si la lnea
0
..
]HJT no est
presente, MySQL habra tomado la ruta por defecto (-) tras el segundo
fallido debido a la
restriccin *
O , y
]H habra retornado .
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 36 / 52
8.7 Cursores
Se soportan cursores simples dentro de procedimientos y funciones almacenadas. La sintaxis es la de
SQL empotrado. Los cursores no son sensibles, son de slo lectura, y no permiten scrolling. No
sensible significa que el servidor puede o no hacer una copia de su tabla de resultados.
Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben
declararse antes de declarar cursores o handlers.
Por ejemplo:
CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
OPEN cur2;
REPEAT
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF NOT done THEN
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
CLOSE cur2;
END
Versin 1.0
Reproduccin prohibida
Pagina 37 / 52
8.8.1 Sentencia
IF search_condition THEN 89396=6<94:89
[ELSEIF 863>AWA7<?:9:7< THEN statement_list] ...
[ELSE statement_list]
END IF
implementa un constructor condicional bsico. Si search_condition se evala a cierto, el comando
SQL correspondiente listado se ejectua. Si no coincide ninguna search_condition se ejecuta el
comando listado en la clusula
. 89396=6<94:89 puede consistir en varios comandos.
Tenga en cuenta que tambin hay una funcin #$, que difiere del commando descrito aqu.
Versin 1.0
Reproduccin prohibida
Pagina 38 / 52
Versin 1.0
Reproduccin prohibida
Pagina 39 / 52
Versin 1.0
Reproduccin prohibida
Pagina 40 / 52
9 Disparadores
Un disparador es un objeto con nombre dentro de una base de datos el cual se asocia con una tabla y
se activa cuando ocurre en sta un evento en particular. Por ejemplo, las siguientes sentencias crean
una tabla y un disparador para sentencias
dentro de la tabla. El disparador suma los valores
insertados en una de las columnas de la tabla:
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Este captulo describe la sintaxis para crear y eliminar disparadores, y muestra algunos ejemplos de
cmo utilizarlos.
Versin 1.0
Reproduccin prohibida
Pagina 41 / 52
Nota: Actualmente, los disparadores no son activados por acciones llevadas a cabo en cascada por las
restricciones de claves extranjeras. Esta limitacin se subsanar tan pronto como sea posible.
9.2 Sintaxis de
DROP TRIGGER [nombre_esquema.]<7=D>6?:8&
Elimina un disparador. El nombre de esquema es opcional. Si el esquema se omite, el disparador se
elimina en el esquema actual.
Versin 1.0
Reproduccin prohibida
Pagina 42 / 52
, , o
O.
Las palabras clave y L permiten acceder a columnas en los registros afectados por un
disparador. ( y L no son sensibles a maysculas). En un disparador para
, solamente
puede utilizarse L(<7=A74; ya que no hay una versin anterior del registro. En un disparador
para slo puede emplearse (<7=A74, porque no hay un nuevo registro. En un
disparador para *
se puede emplear (<7=A74 para referirse a las columnas de un
registro antes de que sea actualizado, y L(nom_col para referirse a las columnas del registro luego
de actualizarlo.
Versin 1.0
Reproduccin prohibida
Pagina 43 / 52
Una columna precedida por es de slo lectura. Es posible hacer referencia a ella pero no
modificarla. Una columna precedida por L puede ser referenciada si se tiene el privilegio
sobre ella. En un disparador , tambin es posible cambiar su valor con
L(<7=D>6A74Jvalor si se tiene el privilegio de *
sobre ella. Esto significa que un
disparador puede usarse para modificar los valores antes que se inserten en un nuevo registro o se
empleen para actualizar uno existente.
En un disparador , el valor de L para una columna
es 0, no el nmero
secuencial que se generar en forma automtica cuando el registro sea realmente insertado.
y L son extensiones de MySQL para los disparadores.
Empleando el constructor ((( , se puede definir un disparador que ejecute sentencias
mltiples. Dentro del bloque , tambin pueden utilizarse otras sintaxis permitidas en rutinas
almacenadas, tales como condicionales y bucles. Como sucede con las rutinas almacenadas, cuando se
crea un disparador que ejecuta sentencias mltiples, se hace necesario redefinir el delimitador de
sentencias si se ingresar el disparador a travs del programa mysql, de forma que se pueda utilizar
el caracter 'T' dentro de la definicin del disparador. El siguiente ejemplo ilustra estos aspectos. En l
se crea un disparador para *
, que verifica los valores utilizados para actualizar cada columna,
y modifica el valor para que se encuentre en un rango de 0 a 100. Esto debe hacerse en un disparador
porque los valores deben verificarse antes de emplearse para actualizar el registro:
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
->
SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
->
SET NEW.amount = 100;
-> END IF;
-> END;//
mysql> delimiter ;
Podra parecer ms fcil definir una rutina almacenada e invocarla desde el disparador utilizando
una simple sentencia
. Esto sera ventajoso tambin si se deseara invocar la misma rutina desde
distintos disparadores. Sin embargo, una limitacin de los disparadores es que no pueden utilizar
. Se debe escribir la sentencia compuesta en cada
donde se la desee emplear.
MySQL gestiona los errores ocurridos durante la ejecucin de disparadores de esta manera:
Si lo que falla es un disparador , no se ejecuta la operacin en el correspondiente
registro.
Un disparador
se ejecuta solamente si el disparador (de existir) y la operacin
se ejecutaron exitosamente.
Un error durante la ejecucin de un disparador o
deriva en la falla de toda la
sentencia que provoc la invocacin del disparador.
En tablas transaccionales, la falla de un disparador (y por lo tanto de toda la sentencia)
debera causar la cancelacin (rollback) de todos los cambios realizados por esa sentencia. En
tablas no transaccionales, cualquier cambio real
Versin 1.0
Reproduccin prohibida
Pagina 44 / 52
10 Vistas
Las vistas (incluyendo vistas actualizables) fueron introducidas en la versin 5.0 del servidor de base
de datos MySQL
En este captulo se tratan los siguientes temas:
Creacin o modificacin de vistas con
L o
L
Eliminacin de vistas con *L
Obtencin de informacin de definicin de una vista (metadatos) con
0L
L
Versin 1.0
Reproduccin prohibida
Pagina 45 / 52
que se ubican a continuacin de la palabra reservada
, y a clusulas
como , *
, O
0
, y *.
Si se crea una vista y luego se modifica el entorno de proceso de la consulta a traves de la
modificacin de variables del sistema, puede afectar los resultados devueltos por la vista:
mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));
Query OK, 0 rows affected (0.00 sec)
mysql> SET NAMES 'latin1';
Query OK, 0 rows affected (0.00 sec)
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 46 / 52
Versin 1.0
Reproduccin prohibida
Pagina 47 / 52
Versin 1.0
Reproduccin prohibida
Pagina 48 / 52
La vista debe contemplar todas las columnas de la tabla en la base de datos que no tengan
Una columna derivada es una que deriva de una expresin. Estos son algunos ejemplos de
columnas derivadas:
3.14159
col1 + 3
UPPER(col2)
col3 / col4
(85DS56>;)
No puede insertar registros en una vista conteniendo una combinacin de columnas simples y
derivadas, pero puede actualizarla si actualiza nicamente las columnas no derivadas. Considere
esta vista:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
En esta vista no pueden agregarse registros porque A74 es derivada de una expresin. Pero ser
actualizable si no intenta actualizar A74. Esta actualizacin es posible:
UPDATE v SET col1 = 0;
Esta actualizacin no es posible porque se intenta realizar sobre una columna derivada:
UPDATE v SET col2 = 0;
A veces, es posible que una vista compuesta por mltiples tablas sea actualizable, asumiendo que es
procesada con el algoritmo . Para que esto funcione, la vista debe usar inner join (no outer join
o ). Adems, solamente puede actualizarse una tabla de la definicin de la vista, de forma que
la clusula
debe contener columnas de slo una tabla de la vista. Las vistas que utilizan
no se pueden actualizar aunque tericamente fuese posible hacerlo, debido a que en la
implementacin se emplean tablas temporales para procesarlas.
En vistas compuestas por mltiples tablas,
funcionar si se aplica sobre una nica tabla.
no est soportado.
La clusula L00O* puede utilizarse en una vista actualizable para evitar inserciones
o actualizaciones excepto en los registros en que la clusula L0 de la sentencia_select se evale
como true.
En la clusula L00O* de una vista actualizable, las palabras reservadas
y
determinan el alcance de la verificacin cuando la vista est definida en trminos de otras
vistas.
restringe el 0O* slo a la vista que est siendo definida.
provoca
que las vistas subyacentes tambin sean verificadas. Si no se indica, el valor por defecto es
. Considere las siguientes definiciones de tabla y vistas:
mysql> CREATE TABLE t1 (a INT);
mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
-> WITH CHECK OPTION;
mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
-> WITH LOCAL CHECK OPTION;
mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
-> WITH CASCADED CHECK OPTION;
Las vistas 2 y 2 estan definidas en trminos de otra vista, 2. 2 emplea check option
, por
lo que las inserciones slo atraviesan la verificacin de 2 . 2 emplea check option
de
modo que las inserciones no solamente atraviesan su propia verificacin sino tambien las de las
vistas subyacentes. Las siguientes sentencias demuestran las diferencias:
ql> INSERT INTO v2 VALUES (2);
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 49 / 52
Versin 1.0
Reproduccin prohibida
Pagina 50 / 52
11 "#
$
#
11.1
# #$
!
mysqldump
El cliente mysqldump puede utilizarse para volcar una base de datos o coleccin de bases de datos
para copia de seguridad o para transferir datos a otro servidor SQL (no necesariamente un servidor
MySQL). EL volcado contiene comandos SQL para crear la tabla y/o rellenarla.
Si est haciendo una copia de seguridad del servidor, y las tablas son todas ;
, puede
considerar usar mysqlhotcopy ya que hace copias de seguridad ms rpidas y restauraciones ms
rpidas, que pueden realizarse con el segundo programa.
Hay tres formas de invocar mysqldump:
shell> mysqldump [opciones] <7=D>6?6D386?6?3978 [93D438]
shell> mysqldump [opciones] --databases [DB2 ...]
shell> mysqldump [opciones] all-databases
Si no se nombra ninguna tabla o se utiliza la opcin ?393D3868 o 344?393D3868, se vuelca
bases de datos enteras.
Para obtener una lista de las opciones que soporta su versin de mysqldump, ejecute mysqldump
help.
Para respaldar la base de datos existente:
8W644M=;8S4?5=&5&
<7=D>6D386?6?3978M
<7=D>6?643>AW:27?6>68&34?7
11.2
%
&
!
mysqladmin685<A4:6<96&3>3>634:^3>7&6>3A:7<683?=:<:89>39:238(
6&56?6
583>&3>3A7=&>7D3>43A7<@:F5>3A:B<;646893?73A9534?6486>2:?7>'A>63>;
D7>>3>D3868?6?3978';A7<=G8@:<34:?3?68(
Invoque mysqladmin as:
shell> mysqladmin [7&A:7<68] comando [7&A:7<68?6A7=3<?7] comando ...
mysqladmin soporta los siguientes comandos:
A>6396nombre_base_de_datos
Crea una nueva base de datos llamada nombre_base_de_datos.
?>7&nombre_base_de_datos
Borra la base de datos llamada <7=D>6D386?6?3978 y todas sus
Muchas mas opciones. Ver la documentacin de MySQL en el CD del curso.
Para borrar la base de datos existente:
8W644M=;8S43?=:<5&
?>7&<7=D>6D386?6?3978
Para crear una base de datos vacilla:
8W644M=;8S43?=:<5&
A>6396<7=D>6D386?6?3978
Copyright Cdric Simon, 2007
Versin 1.0
Reproduccin prohibida
Pagina 51 / 52
11.3
%
&$!
mysql685<8:=&468W644
#A7<A3&3A:?3?68 >63?4:<6$(
7&7>93587
:<96>3A9:27;<7:<96>3A9:27(53<?786583:<96>3A9:23=6<96'478>685493?78
?6438A7<85493886=5689>3<6<@7>=397?693D43
(53<?786583<7
:<96>3A9:23=6<96#&7>6[6=&47'A7=7@:49>7$'64>685493?786&>686<936<
@7>=39786&3>3?7&7>93D543?7>68(4@7>=397?6834:?3&56?6A3=D:3>86583<?7
7&A:7<68?64_<63?6A7=3<?78(
Si tiene problemas relacionados con memoria insuficiente para conjuntos de resultados grandes,
utilice la opcin S5:AV. Esto fuerza mysql a devolver los resultados desde el servidor registro a
registro en lugar de recibir todo el conjunto de resultados y almacenarlo en memoria antes de
mostrarlo. Esto se hace usando =;8S4586>68549#$ en lugar de =;8S4897>6>68549#$ para
recibir el conjunto de resultados.
Usar mysql es muy sencillo. Invquelo desde el prompt de su intrprete de comandos como se
muestra a continuacin:
shell> mysql <7=D>6D386?6?3978
*3>3>6446<3>43D386?6?3978A7<643>AW:27?6>68&34?76[6A953/
8W644M=;8S45&
@<7=D>6D386?6?3978M3>AW:27?6>68&34?7
Versin 1.0
Reproduccin prohibida
Pagina 52 / 52
12 Ejercicios
1. Crear una tabla con columnas de los diferente tipos numericos, y probar de insertar filas con
valores dentro y luego fuera de los rangos minimo y maximo de cada tipo.
2. Crear una tabla con columnas de los diferente tipos de fechas, y probar de insertar filas con
valores dentro y luego fuera de los rangos minimo y maximo de cada tipo.
3. Crear una tabla con columnas de los diferente tipos de caracteres, y probar de insertar filas con
valores para cada tipo.
4. Probar las precedencia de operadores
5. Probar las funciones de comparacion de datos con enteros.
6. Probar los operdores logicos
7. Probar las funciones de flujo
8. Probar las funciones de comparacion de datos con caracteres.
9. Probar las funciones de matematica
10.Probar las funciones de fechas.
11.Probar las funciones de encriptacion.
12.Probar las funciones de informacin
13.Crear un procedimiento para crear un usuario
14.Crear un procedimiento que regresa el numero de registros que tiene la tabla lab_prescription
15.Crear un procedimiento para crear un paciente, y que regresa el no_patient generado, o un
numero negativo si el no_lnaiss o el no_city no existe en la tabla city.
16.Crear un procedimiento que va a usar un cursor y poner inactivo todos los usuarios que tienen el
campo bad_try >1
17.Crear una funcion que regresa el nombre y apellido completo del paciente cual no_patient fue
pasado como parametro.
18.Crear una funcion que va a regresar la edad un paciente.
19.Crear una funcion que regresa el numero de lab_prescription ligadas a un paciente
20.Crear una funcion que regresa el numero de pruebas (lab_test) de un cierto tipo (lab_test_type)
ligadas a un paciente
21.Crear una funcion que devuelve un numero unico y que se va incrementando (como una
secuencia).
22.Crear un trigger que va a poner el mayusculas los nombres y apellidos del paciente al insertar o
modificar el paciente.
23.Crear un trigger que va a crear un usuario al insertar un paciente, con el mismo nombre/apellido.
24.Crear una vista que contiene los datos del paciente asi que los nombre de cuidades de nacimiento
y residencia.
25.Crear una vista que lista los pacientes por region y cuidad, y da el total de pacientes por cada uno.
26.Crear una copia de su base de datos usando respaldo/restauracion de su base de datos.
Versin 1.0
Reproduccin prohibida