Bloques en PL_SQL

Embed Size (px)

Citation preview

LBD Bloques en PL/SQLEs la unidad bsica en PL/SQL.

PL/SQL 1

Todos los programas PL/SQL estn compuestos por bloques, que pueden anidarse. Cada bloque realiza una unidad lgica de trabajo. Estructura de un bloque PL/SQL: DECLARE /* Seccin declarativa. Declaracin de variables, tipos, cursores y subprogramas locales */ BEGIN /* Seccin ejecutable. rdenes (SQL y procedimentales) y bloques. Esta seccin es la nica obligatoria. */ EXCEPTION /* Seccin de Tratamiento de excepciones. Instrucciones para el manejo de excepciones. Cuando se producen errores el flujo se desva a esta seccin si es que existe. */ END; / Ejemplos Ejemplos de Bloque DECLARE /* Declaracin de las variables que se utilizarn en las instrucciones SQL */ v_NewMajor VARCHAR2(10) := 'History'; v_FirstName VARCHAR2(10) := 'Scott'; v_LastName VARCHAR2(10) := 'Urman'; BEGIN UPDATE students SET major = v_NewMajor WHERE first_name = v_FirstName AND last_name = v_LastName; IF SQL%NOTFOUND THEN INSERT INTO students (ID, first_name, last_name, major) VALUES(student_sequence.NEXTVAL, v_FirstName, v_LastName, v_NewMajor); END IF; END; /

1

LBDDECLARE /* Inicio de la seccin declarativa */ v_StudentID NUMBER(5) := 10000; -- Variable numrica inicializada -- en 10,000 v_FirstName VARCHAR2(20); BEGIN /* Inicio de la seccin ejecutable */ -- Recupera el apellido del estudiante con identificadord ID 10,000 SELECT first_name INTO v_FirstName FROM students WHERE id = v_StudentID; EXCEPTION /* Inicio de la seccin de excepciones */ WHEN NO_DATA_FOUND THEN -- Maneje la condicin de error INSERT INTO log_table (info) VALUES ('El estudiante 10,000 no existe'); END; / Tipos de Bloques Annimos (anonymous blocks): -- Cadena de caracteres de longitud -- variable con una longitud mxima de 20

PL/SQL 1

Se construyen normalmente de manera dinmica para un objetivo muy concreto y se ejecutan, en general, una nica vez. blocks): Bloques Nominados (named blocks): Son similares a los bloques annimos pero con una etiqueta que da nombre al bloque. Subprogramas: Son procedimientos (procedures), funciones (functions) o grupos de ellos, llamados paquetes (packages). Se construyen para efectuar algn tipo de operacin ms o menos frecuente y se compilan y almacenan en la base de datos para ejecutarlos cuantas veces se desee. Se ejecutan con una llamada al procedimiento, funcin o paquete.

2

LBDDisparadores (triggers):

PL/SQL 1

Son bloques nominados que se almacenan en la BD. Su ejecucin est condicionada al cumplimiento de una cierta condicin, como por ejemplo usar una orden concreta del DML sobre una tabla. Ejemplo de Bloque annimo DECLARE v_Num1 v_Num2 v_String1 v_String2 BEGIN INSERT INTO temp_table (num_col, char_col)VALUES (v_Num1, v_String1); INSERT INTO temp_table (num_col, char_col)VALUES (v_Num2, v_String2); SELECT char_col INTO v_OutputStr FROM temp_table WHERE num_col = v_Num1; DBMS_OUTPUT.PUT_LINE(v_OutputStr); SELECT char_col INTO v_OutputStr FROM temp_table WHERE num_col = v_Num2; DBMS_OUTPUT.PUT_LINE(v_OutputStr); ROLLBACK; END; / NUMBER := 1; NUMBER := 2; VARCHAR2(50) := Hola Mundo!'; VARCHAR2(50) :='Este mensaje te lo devuelve PL/SQL!';

v_OutputStr VARCHAR2(50);

3

LBD

PL/SQL 1

Ejemplo de bloque nominado DECLARE v_Num1 v_Num2 v_String1 v_String2 BEGIN INSERT INTO temp_table (num_col, char_col)VALUES (v_Num1, v_String1); INSERT INTO temp_table (num_col, char_col)VALUES (v_Num2, v_String2); SELECT char_col INTO v_OutputStr FROM temp_table WHERE num_col = v_Num1; DBMS_OUTPUT.PUT_LINE(v_OutputStr); SELECT char_col INTO v_OutputStr FROM temp_table WHERE num_col = v_Num2; DBMS_OUTPUT.PUT_LINE(v_OutputStr); ROLLBACK; END L_InsertIntoTemp; / Ejemplo de Construccin de un Subprograma utilizando un bloque nominado CREATE OR REPLACE PROCEDURE InsertIntoTemp AS DECLARE v_Num1 v_Num2 v_String1 v_String2 BEGIN INSERT INTO temp_table (num_col, char_col)VALUES (v_Num1, v_String1); INSERT INTO temp_table (num_col, char_col)VALUES (v_Num2, v_String2); SELECT char_col INTO v_OutputStr FROM temp_table WHERE num_col = v_Num1; DBMS_OUTPUT.PUT_LINE(v_OutputStr); SELECT char_col INTO v_OutputStr FROM temp_table WHERE num_col = v_Num2; NUMBER := 1; NUMBER := 2; VARCHAR2(50) := Hola Mundo!'; VARCHAR2(50) :='Este mensaje te lo devuelve PL/SQL!'; NUMBER := 1; NUMBER := 2; VARCHAR2(50) := Hola Mundo!'; VARCHAR2(50) :='Este mensaje te lo devuelve PL/SQL!';

v_OutputStr VARCHAR2(50);

v_OutputStr VARCHAR2(50);

4

LBDDBMS_OUTPUT.PUT_LINE(v_OutputStr); ROLLBACK; END InsertIntoTemp; / Este procedure puede ser invocado utilizando un bloque annimo BEGIN InsertIntoTemp; END; / Ejemplo de Bloques Anidados DECLARE v_StudentID NUMBER(5) := 10000; v_FirstName VARCHAR2(20); BEGIN

PL/SQL 1

SELECT first_name INTO v_FirstName FROM students WHERE id = v_StudentID; BEGIN INSERT INTO log_table (info) VALUES (' Hola! de un bloque anidado'); END; EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN INSERT INTO log_table (info) VALUES ('El estudiante 10,000 no existe'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error al insertar en log_table!'); END; END; /

5

LBD El Paquete DBMS_OUTPUT

PL/SQL 1

PL/SQL no dispone de funciones de E/S. El paquete DBMS_OUTPUT junto con SQL ofrece la posibilidad de mostrar mensajes en pantalla Pasos a seguir : Activar la salida: SET SERVER OUTPUT {ON| OFF} [SIZE n] n es el tamao del buffer de salida Predeterminado 2000 bytes Mximo 1.000.000 Utilizar en el programa el procedimiento almacenado DBMS_OUTPUT.PUT_LINE DBMS_OUTPUT.PUT_LINE Se aade el argumento al buffer de salida Algunos Procedimientos de DBMS_OUTPUT PUT_LINE es un procedimiento del paquete DBMS_OUTPUT que sirve para escribir un dato (PUT) seguido de un fin de lnea (NEW_LINE). SET LINESIZE n, establece el tamao de una lnea en SQL*Plus, para todas n sus salidas. ERR, SHOW ERR muestra los errores de compilacin de un bloque PL/SQL. EXEC , ejecuta una sentencia PL/SQL. Se puede usar para ejecutar un procedimiento sin tener que crear un bloque PL/SQL.

6

LBD Variables y Tipos en PLLa informacin entre PL/SQL y la BD se transmite mediante variables

PL/SQL 1

Una variable es una zona de almacenamiento que puede ser leda o almacenada por el programa v_ErrorCode, v_CurrentUser , v_Information Toda variable tiene un tipo especfico asignado (clase de informacin que se puede almacenar en la variable) Pueden ser del mismo tipo que las columnas de las tablas V_studentName V_currentDate V_NumberCredits VARCHAR(20); DATE; NUMBER(3);

Tipos definidos por el usuario: DECLARE TYPE t_StudentRecord IS RECORD( First_Name LastName Credits vStudent t_StudentRecord; VARCHAR(10), VARCHAR(15), NUMBER(3));

Tipos adicionales (propios de PL) V_LoopCounter V_CuRegistered BINARY_INTEGER; BOOLEAN;

7

LBD Unidades LxicasSon los componentes bsicos de un programa PL/SQL Es una secuencia de caracteres permitidos Caracteres permitidos: Letras maysculas y minsculas de la A a la Z Dgitos (del 0 al 9) Smbolos Matemticos + - * / < > = De puntuacin ( )! ~ ^ ; . @ % , " # $ & _ | { } ? [ ] Tabuladores, espacios y saltos de carro

PL/SQL 1

Se clasifican en: Identificadores (incluye palabras reservadas) Delimitadores (smbolos simples y compuestos) Literales Comentarios

Por ejemplo en la instruccin: bonus := salary * 0.10; -- clculo del bono se observan las siguientes unidades lxicas: o o o o o Los identificadores bonus y salary El smbolo compuesto := Los smbolos simples * y ; El literal numrico 0.10 El comentario --clculo del bono

Identificadores Se utilizan para dar nombre a los objetos PL/SQL Un identificador se forma de una letra seguida, opcionalmente de otras letras, nmeros, signos de moneda, #,-,_ y otros signos numricos. La longitud mxima de un identificador es 30 caracteres y todos ellos son significativos. Algunos identificadores especiales, llamados palabras reservadas, tienen un especial significado sintctico en PL/SQL y no pueden ser redefinidos. Para saber cules son las palabras reservadas en PL/SQL:

8

LBDSQL> help RESERVED WORDS (PL/SQL) RESERVED WORDS (PL/SQL)

PL/SQL 1

PL/SQL PL/SQL Reserved Words have special meaning in PL/SQL, and may not be used for identifier names (unless enclosed in "quotes"). An asterisk (*) indicates words are also SQL Reserved Words. ALL* ALTER* AND* ANY* ARRAY AS* ASC* AT AUTHID AVG BEGIN BETWEEN* BODY BOOLEAN BULK BY* CHAR* CHAR_BASE CHECK* CLOSE CLUSTER* COALESCE COLLECT COMMENT* COMMIT COMPRESS* CONNECT* CONSTANT CREATE* CURRENT* DESC* DISTINCT* DO DROP* ELSE* ELSIF END EXCEPTION EXCLUSIVE* EXECUTE EXISTS* EXIT EXTRACT FALSE FETCH FLOAT* FOR* FORALL FROM* FUNCTION GOTO GROUP* HAVING* HEAP HOUR IF IN* INDEX* INDICATOR JAVA LEVEL* LIMITED LOCK* LONG* LOOP MAX MIN MINUS* MINUTE MLSLABEL* MOD RAW* REAL RECORD REF RELEASE NEXTVAL NOCOPY NOT* NOWAIT* NULL* NULLIF NUMBER* NUMBER_BASE OCIROWID OF* ON* OPAQUE OPEN REVERSE ROLLBACK ROW* ROWID* ROWNUM* ROWTYPE SAVEPOINT SECOND SELECT* SEPERATE SET* SHARE* UI UNION* UNIQUE* UPDATE* USE USER* VALIDATE* VALUES* VARCHAR* VARCHAR2* VARIANCE VIEW* WHEN WHENEVER* MODE* MONTH NATURAL NATURALN NEW LIKE* PACKAGE PCTFREE* POSITIVE POSITIVEN PRAGMA PRIOR* PRIVATE PROCEDURE PUBLIC* RAISE RANGE TO* TRIGGER* TRUE TYPE RETURN SUBTYPE SUCCESSFUL* SYNONYM* SUM SYSDATE* TABLE* THEN* TIME TIMESTAMP TIMEZONE_ABBR TIMEZONE_MINUTE TIMEZONE_REGION TIMEZONE_HOUR

PARTITION PLS_INTEGER

BINARY_INTEGER EXTENDS

IMMEDIATE*

9

LBDCURRVAL CURSOR DATE* DAY DECIMAL* DECLARE DEFAULT* DELETE* INSERT* INTEGER* INTERFACE INTERSECT* INTERVAL INTO* IS* ISOLATION OPERATOR OPTION* OR* ORDER* OTHERS OUT SQL SMALLINT* SPACE SQLCODE START* STDDEV WITH* WORK WRITE YEAR ZONE SQLERRM WHERE* WHILE

PL/SQL 1

ORGANIZATION

Ejemplos de identificadores legales: X V_studentID TempVar V1, v2 Seguridad_social_# X+y _temp_ Primer Apellido Este_es_un_ejemplo_de_identifiador_ilegal 4_variable

Ejemplos de identificadores ilegales:

RECORDAD QUE: PL/SQL NO DISTINGUE entre maysculas y minsculas

10

LBDDelimitadores

PL/SQL 1

Un delimitador es un smbolo simple o compuesto que tiene un significado especial dentro de PL/SQL y que se utiliza para separar dos identificadores. Tabla de Delimitadores Smbolo + % . / ( ) : , * " = < > @ ; := => || ** > /* */ .. Significado operador de suma indicador de atributo delimitador de caracteres selector de componente operador de divisin expresin o delimitador de lista expresin o delimitador de lista indicador de variable host separador de tems operador de multiplicacin delimitador de un identificador entre comillas operador relacional operador relacional operador relacional indicador de acceso remoto terminador de sentencias negacin u operador de substraccin operador de asignacin operador de asociacin operador de concatenacin operador de exponenciacin comienzo de un rtulo fin de un rtulo comienzo de un comentario de varias lneas fin de un comentario de varias lneas operador de rango 11

LBD

PL/SQL 1

!= ^= = -Literales

operador relacional operador relacional operador relacional operador relacional operador relacional comentario en una lnea

Son valores numricos, booleanos o de carcter que no son identificadores Ejemplo: -23.456, NULL de Literales de carcter Constan de uno o ms caracteres delimitados por comillas simples, pueden ser asignados a varuables CHAR o VARCHAR2. Ejemplo: 12345 Cuidado con incluir una comilla en un literal: Peters equivalente a Peters es equivalente a NULL Algunos literales de carcter representan valores en otros tipos de datos que se pueden convertir implcita o explcitamente: Ejemplo: 1234 o 3-noviembre-2004 Literales Numricos Representan valores enteros o reales y se pueden asignar a variables de tipo NUMBER sin efectuar conversin previa. Son los nicos literales que pueden formar parte de una expresin aritmtica Ejemplos 123, -7, +12, 0 -17.1, 23.0, 3. 1.345E7,9.87E-3, -7.12e+12 Literales Booleanos TRUE, FALSE, NULL Slo se pueden asignar a variables booleanas

12

LBDComentarios

PL/SQL 1

Los comentarios se pueden hacer en una nica lnea para los cuales se utilizan dos guiones seguidos Ejemplo: -- variable para realizar la suma O tambin en varias lneas para los cuales se utiliza /* para indicar el comienzo del comentario y */ para indicar el final del comentario Ejemplo: /* Este bucle realiza un recuento entre todos los estudiantes de la tabla students */ Importante Importante no se pueden incluir unos comentarios en otros

13

LBD Variables y Constantes

PL/SQL 1

PL/SQL permite declarar constantes y variables para ser utilizadas en cualquier expresin dentro de un programa. La nica condicin exigida por PL/SQL es que cada variable (o constante) debe estar declarada antes de ser utilizada en una expresin. Son espacios de memoria reservados para contener valores de datos Se declaran en la seccin declarativa del programa Declaracin Sintaxis General nombre_variable [CONSTANT] tipo [NOT NULL] [:= valor_inicial];

Donde tipo es:VARCHAR2, NUMBER, BINARY INTEGER,...(Ver tipos de Datos y PL/SQL) La clusula CONSTANT indica la definicin de una constante cuyo valor no puede ser modificado. Se debe incluir la inicializacin de la constante en su declaracin.

La clusula NOT NULL impide que a una variable se le asigne el valor nulo, y por tanto debe inicializarse a un valor diferente de NULL.

Ejemplo DECLARE V_DESCRIPTION V_NUMASIENTOS V_CONTADOR VARCHAR2(50); NUMBER:=45; BINARY_INTEGER:=0;

C_minimoestudiantes CONSTANT NUMBER(5):=1000; Slo puede haber una declaracin por lnea Las variables que no son inicializadas toman el valor inicial NULL. La inicializacin puede incluir cualquier expresin legal de PL/SQL, que lgicamente debe corresponder con el tipo del identificador definido. Los tipos escalares incluyen los definidos en SQL ms los tipos VARCHAR y BOOLEAN. Este ltimo puede tomar los valores TRUE, FALSE y NULL, y se suele utilizar para almacenar el resultado de alguna operacin lgica. Por su parte, 14

LBD

PL/SQL 1 VARCHAR es un sinnimo de CHAR, siendo ms conveniente la utilizacin del tipo CHAR.

Tambin es posible definir el tipo de una variable o constante, dependiendo del tipo de otro identificador, mediante la utilizacin de las clusulas %TYPE y %ROWTYPE.

Mediante %TYPE se define una variable o constante escalar Mediante %ROWTYPE se define una variable fila, donde el identificador puede ser otra variable fila o una tabla.

Tipos PL/SQLHay 3 categoras de tipos : escalares, compuesto y referencias. Los escalares no tienen componentes, mientras los compuestos s. ( los tipos se definen en el paquete STANDARD ). Escalares Existen las siguientes familias en esta categora: Tipo numrico NUMBER Sintaxis : NUMBER (P,S). Contiene un valor entero o real. P es la precisin ( o n de dgitos ) y S la escala (o n de valores decimales). P y S son opcionales, pero si se incluye S hay que poner la P. Hay subtipos equivalentes por cuestiones de compatibilidad con tipos de otras bases de datos :INT, INTEGER,REAL, DECIMAL,NUMERIC ... BINARY_INTEGER Se usa para valores que se utilizan durante clculos y no se almacenan en la base de datos. PLS_INTEGER Es igual que el anterior, pero te avisa del error cuando hay un desbordamiento en el clculo Tipos de carcter VARCHAR2 Sintaxis: VARCHAR2 [L]; L es la longitud mxima de caracteres y es obligatorio indicarlo. CHAR Sintaxis : CHAR [L];

15

LBD

PL/SQL 1

Representa cadenas de caracteres de longitud fija. Se rellena con espacios en blanco los caracteres sobrantes, algo que hay que tener en cuenta a la hora de comparar cadenas. L es opcional, si no se indica la longitud es un solo carcter. LONG Similar al tipo VARCHAR2. A diferencia del tipo LONG en las Bases de datos que puede almacenar hasta 2 Gigabytes, el tipo LONG de PL/SQL almacena hasta 32.760 Bytes. Tipos Raw Almacenan datos en formato binario, evitando la conversin entre conjunto de caracteres que realiza Oracle y otras bases de datos. Hay 2 tipos: RAW y LONG RAW. Tipos de dato fecha: DATE Almacena tambin la hora. Para asignar valores a una variable de tipo DATE se emplea la funcin TO_DATE ( convierte caracteres a tipo fecha ). Tipo Rowid Se puede almacenar un identificador de columna, que es una clave que identifica unvocamente a cada fila de una base de datos. Para manipular estos dato se usa la funcin ROWIDTOCHAR cuya salida es : BBBBBBBB.RRRR.FFFF donde B identifica el bloque dentro del archivo, R la fila dentro del bloque y F el numero de archivo. Cada componente es un hexadecimal. Ejemplo: 0000001E.00FF.0001 identifica el bloque 30 y la fila nmero 255 del bloque, en el archivo 1 Tipos booleanos BOOLEAN Contiene slo valores: True, False o Null. Compuestos Son registros,tablas y varrays ( ste a partir de PL/SQL 3.0 ) Tipos de referencia REF Cuando se declara una variable de tipo referencia puede apuntar a distintas posiciones de memoria de durante la vida del programa (son como los punteros en C ). Tipos LOB Se emplean para objetos de gran tamao ( hasta 4 GB ), tales como imgenes, vdeo, gran cantidad de textoEs un valor binario o de tipo carcter. Atributos %TYPE y %ROWTYPE %TYPE declara una variable del mismo tipo que otra o que una columna de una base de datos.

16

LBDEjemplo: total facturas.importe%TYPE; --si importe es un NUMBER(5,2), total es del mismo tipo --si cambia el tipo importe, la variable total tambin cambia

PL/SQL 1

%ROWTYPE crea una variable de registro cuyos campos son los de las columnas de la tabla o vista. Ejemplo: moroso clientes%ROWTYPE; --Declara la variable moroso que podr contener 1 fila de clientes moroso.nombre; --Para acceder a una columna se le pone un punto y el nombre del campo. Tanto en uno como en otro se hereda el tipo y la longitud pero no los posibles atributos NOT NULL, ni valores por defecto.

17

LBDSubtipos definidos por el usuario Un subtipo es un tipo PL/SQL que se basa en otro ya existente Su Sintaxis es: SUBTYPE nuevo_tipo IS tipo_original; Ejemplos: DECLARE SUBTYPE t_contadorbucle IS NUMBER; --Define el subtipo V_contadorbucle t_contadorbucle; -- define una variable de ese tipo SUBTYPE t_nombretipo IS students.first_name%TYPE; DECLARE SUBTYPE t_contador IS NUMBER(5); -- es incorrecta DECLARE V_intermedia NUMBER(5); SUBTYPE t_contador IS V_intermedia; -- es correcta

PL/SQL 1

Conversiones de Tipos

18

LBD

PL/SQL 1

Algunas veces se hace necesario convertir un valor desde un tipo de dato a otro. En PL/SQL se aceptan las conversiones de datos implcitas y explcitas. Una conversin explcita es aquella que se efecta utilizando las funciones predefinidas. Por ejemplo, para convertir un valor de carcter a fecha o nmero se utiliza TO_DATE o TO_NUMBER. Existe una cantidad limitada de funciones de conversin, que implementan esta caracterstica de conversin explcita. Cuando se hace necesario, PL/SQL puede convertir un tipo de dato a otro en forma implcita. Algunos ejemplos de conversin implcita ms comunes se dan cuando variables de tipo CHAR se operan matemticamente para obtener un resultado numrico.Hasta BIN_INT CHAR DATE LONG NUMBER PLS_INT RAW ROWID VARCHAR2

Desde

BIN_INT

X

X

X

X

X

CHAR DATE LONG NUMBER

X X X X X

X

X X

X

X

X

X

X X

X X X

X X

PLS_INT

X

X

X

X

X

RAW ROWID

X X

X

X X

VARCHAR2

X

X

X

X

X

X

X

X

19

LBDESTRUCTURAS DE CONTROL: CONDICIONAL: IF THEN ELSE SINTAXIS IF expresin_booleana1 THEN secuencia_de_intrucciones; [ELSIF expresin_ booleana2 THEN secuencia_de_intrucciones;] [ELSE secuencia_de_intrucciones;] END IF;

PL/SQL 1

expresin_booleana es cualquier expresin que de cmo resultado un valor booleano ELSEIF y ELSE son opcionales Puede haber tantas ELSEIF como se desee Ejemplo1: DECLARE v_NumberSeats rooms.number_seats%TYPE; v_Comment VARCHAR2(35); BEGIN SELECT number_seats INTO v_NumberSeats FROM rooms WHERE room_id = 20008; IF v_NumberSeats < 50 THEN v_Comment := 'Fairly small'; ELSIF v_NumberSeats < 100 THEN v_Comment := 'A little bigger'; ELSE v_Comment := 'Lots of room'; END IF; END; /

20

LBD

PL/SQL 1

Ejemplo2: DECLARE v_NumberSeats rooms.number_seats%TYPE; v_Comment VARCHAR2(35); BEGIN SELECT number_seats INTO v_NumberSeats FROM rooms WHERE room_id = 20008; IF v_NumberSeats < 50 THEN v_Comment := 'Fairly small'; INSERT INTO temp_table (char_col) VALUES ('Nice and cozy'); ELSIF v_NumberSeats < 100 THEN v_Comment := 'A little bigger'; INSERT INTO temp_table (char_col) VALUES ('Some breathing room'); ELSE v_Comment := 'Lots of room'; END IF; DBMS_OUTPUT.PUT_LINE(v_Comment); END; / CASE [