Upload
christian-oh-yeah
View
376
Download
2
Embed Size (px)
Citation preview
Programacin en PL/SQL
Estructura de un bloque PL/SQL DECLARE Opcional
Variables, cursores, excepcionesdefinidas por el usuario BEGIN Obligatorio
rdenes SQL rdenes PL/SQL EXCEPTION Opcional
Acciones a realizar cuandosucede un error END; Obligatorio
DECLARE BEGIN EXCEPTION END;
PL/SQL-2
Estructura de un bloque PL/SQLDECLARE variable VARCHAR2(5); BEGIN SELECT nombre_columna INTO variable FROM nombre_tabla; EXCEPTION WHEN nombre_excepcion THEN ... END;
DECLARE BEGIN EXCEPTION END;
PL/SQL-3
Tipos de BloquesAnnimo[DECLARE] BEGIN --rdenes [EXCEPTION] END;
ProcedimientoPROCEDURE nombre IS BEGIN --rdenes [EXCEPTION] END;
FuncinFUNCTION nombre RETURN tipo IS BEGIN --rdenes RETURN valor; [EXCEPTION] END;
PL/SQL-4
AplicacionesBloque annimo Procedimiento /funcin almacenada Procedimiento /funcin de aplicacin
DECLARE BEGIN EXCEPTION
Trigger de aplicacin
Trigger de Base de Datos
END;
Procedimiento /funcin en paquete
PL/SQL-5
Tipos de Variables Variables PL/SQL Escalar Compuesta Referencia LOB (large objects)
Variables no-PL/SQL Variables host y acotadas (bind)PL/SQL-6
Declaracin de Variables PL/SQLSintaxisidentificador [CONSTANT] tipo_datos [NOT NULL] [:= | DEFAULT expr];
EjemplosDeclare v_fecha v_nodepto v_ciudad c_ cpostal DATE; NUMBER(2) NOT NULL := 10; VARCHAR2(13) := 'Atlanta'; CONSTANT NUMBER := 1400;
PL/SQL-7
Asignacin de Valores a VariablesSintaxisidentifier := expr;
Ejemplosv_hiredate := '31-DEC-98';
v_ename := 'Maduro';
PL/SQL-8
Tipos de datos escalares VARCHAR2 (longitud_mxima) NUMBER [(precisin, escala)] DATE CHAR [(longitud_mxima)] LONG LONG RAW BOOLEAN BINARY_INTEGER PLS_INTEGERPL/SQL-9
Declaraciones de Variables escalaresEjemplosv_trabajo v_contador v_salario v_fecha c_iva v_valido VARCHAR2(9); BINARY_INTEGER := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7; CONSTANT NUMBER(3,2) := 8.25; BOOLEAN NOT NULL := TRUE;
PL/SQL-10
Atributo %TYPE Sufijo que declara una variable coincidente con: Una definicin de una columna de la
base de datos Otra variable previamente declarada... v_nombre v_balance v_balance_min ... emp.nombre%TYPE; NUMBER(7,2); v_balance%TYPE := 10;
PL/SQL-11
Tipos de datos compuestosTipos TABLAS PL/SQL REGISTROS PL/SQL
PL/SQL-12
Referenciando variables No PL/SQLAlmacenar el salario anual en una variable host de SQL*Plus.:g_sal_mensual := v_sal / 12;
Referencia variables no-PL/SQL como variables host. Prefijar las referencias con (:).
PL/SQL-13
Comentarios Una lnea con dos guiones (- -). Mltiples lneas entre los smbolos /* y */. Ejemplo... v_sal NUMBER (9,2); BEGIN /* Calcula el salario anual basado en el salario mensual introducido por el usuario */ v_sal := v_sal * 12; END; -- Final de la transaccin
PL/SQL-14
Funciones SQL en PL/SQL Disponibles: Numricas una-fila De caracteres una-fila Conversin de tipos Fecha No disponibles: GREATEST LEAST DECODE Funciones de grupoPL/SQL-15
Igual en SQL
Funciones PL/SQLEjemplos Construir una lista de correo.v_direccion_correo := v_nombre||CHR(10)|| v_direccion||CHR(10)||v_ciudad|| CHR(10)||v_codigopostal;
Conversin a minsculas.v_nombre := LOWER(v_nombre);
PL/SQL-16
Funciones de conversin TO_CHAR TO_DATE TO_NUMBERBEGIN SELECT TO_CHAR(fecha, FROM END; 'MON. DD, YYYY') emp;
v_comment := USER||': '||TO_CHAR(SYSDATE);
PL/SQL-17
Bloques anidados y Variables Los bloques pueden anidarse.... x BINARY_INTEGER; BEGIN ... DECLARE y NUMBER; BEGIN ... END; ... END;PL/SQL-18
Alcance de x
Alcance de y
Operadores en PL/SQL Lgicos Aritmticos Concatenacin Parntesis Operador exponencial (**)v_valido := (v_empno IS NOT NULL);
Igual en SQL
PL/SQL-19
Variables BindPara referenciar una variable bind debe prefijarse con :. EjemploDECLARE v_sal BEGIN SELECT INTO FROM WHERE :salary END; emp.sal%TYPE; sal v_sal emp empno = 7369; := v_sal;
PL/SQL-20
Interaccionando con el servidor Oracle
rdenes SQL en PL/SQL Orden SELECT . Slo puede obtenerse una tupla (clusula INTO). rdenes DML. Control de transacciones: COMMIT, ROLLBACK, o SAVEPOINTSELECT lista_select INTO {nombre_variable[, nombre_variable]... | nombre_registro} FROM tabla WHERE condicin;
PL/SQL-22
rdenes SQL en PL/SQLDECLARE v_deptno v_loc BEGIN SELECT INTO FROM WHERE ... END; NUMBER(2); VARCHAR2(15); deptno, loc v_deptno, v_loc dept dname = VENTAS';
DECLARE v_empno emp.empno%TYPE; BEGIN SELECT secuencia_empno.NEXTVAL INTO v_empno FROM dual; INSERT INTO emp(empno, nombre, trabajo, deptno) VALUES(v_empno, PEPE', AUXILIAR', 10); END;
PL/SQL-23
rdenes COMMIT y ROLLBACK Una transacin se inicia con la primera orden DML command que sigue a COMMIT o ROLLBACK. Usar las rdenes SQL COMMIT y ROLLBACK para terminar explcitamente una transaccin
PL/SQL-24
Cursor SQL Un cursor es un rea privada de trabajo SQL. Hay dos tipos de cursores: Implcitos Explcitos
El servidor Oracle usa cursores implcitos para analizar y ejecutar las rdenes SQL. Los cursores explcitos se declaran por el programador explcitamente.PL/SQL-25
Atributos de CursorSe utilizan para chequear la salida de las rdenes SQL.SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND SQL%ISOPEN Nmero de filas afectadas por la orden SQL ms reciente (valor de tipo integer). Atributo booleano que se evala a TRUE si la orden SQL ms reciente afecta a una o ms filas. Atributo booleano que se evala a TRUE si la orden SQL ms reciente no afecta a ninguna fila. Siempre evaluado a FALSE porque PL/SQL cierra los cursores implcitos despus de la ejecucin.
PL/SQL-26
Atributos de CursorBorra las filas de la tabla ITEM que tienen el nmero de orden especificado. Imprime el nmero de filas borradas. EjemploVARIABLE filas_borradas DECLARE v_ordid NUMBER := 605; BEGIN DELETE FROM item WHERE ordid = v_ordid; filas_borradas := SQL%ROWCOUNT ||' filas borradas.'); END; PRINT filas_borradas
PL/SQL-27
Estructuras de Control
Sintaxis
rdenes IF
IF condicin THEN rdenes; [ELSIF condicin THEN rdenes;] [ELSE rdenes;] END IF;
IF v_ename = 'OSBORNE' THEN v_mgr := 22; END IF;
PL/SQL-29
Flujo IF-THEN-ELSETRUE FALSE
IF Condicin
THEN Acciones (incluyendo IFs)
ELSE acciones (incluyendo IFs)
PL/SQL-30
Flujo IF-THEN-ELSIFIF Condicin TRUE
FALSE ELSIF Condicin
THEN Acciones TRUE THEN Acciones
FALSE ELSE Acciones
PL/SQL-31
Valores nulos Se pueden gestionar valores nulos con el operador IS NULL. Cualquier expresin que contenga un valor nulo se evala a NULL. Las expresiones que se concatenan con valores nulos los tratan como cadenas vacas.
PL/SQL-32
Control de iteracionesHay tres tipos de bucles: Bucle bsico Bucle FOR Bucle WHILE
PL/SQL-33
Bucle bsicoSintaxisLOOP orden1; . . . EXIT [WHEN condicin]; END LOOP; -- delimitador -- rdenes -- orden EXIT -- delimitador
donde:
condicin
es una variable booleana o expresin (TRUE, FALSE, o NULL);
PL/SQL-34
Bucle bsicoEjemploDECLARE v_ordid item.ordid%TYPE := 101; v_contador NUMBER(2) := 1; BEGIN LOOP INSERT INTO item(ordid, itemid) VALUES(v_ordid, v_contador); v_contador := v_contador + 1; EXIT WHEN v_contador > 10; END LOOP; END;
PL/SQL-35
Bucle FORSintaxisFOR contador in [REVERSE] cota_inerior..cota_superior LOOP rdenes; . . . END LOOP;
No hay que declarar el ndice; se declara implcitamente.DECLARE v_ordid item.ordid%TYPE := 101; BEGIN FOR i IN 1..10 LOOP INSERT INTO item(ordid, itemid) VALUES(v_ordid, i); END LOOP; END;PL/SQL-36
Bucle WHILESintaxisWHILE condicion LOOP orden1; orden2; . . . END LOOP; La condicin se evala al Comienzo de cada iteracin.
PL/SQL-37
Bucle WHILEEjemploACCEPT p_precio PROMPT Introduce el precio: ' ACCEPT p_itemtot PROMPT Introduce el mximo: ' DECLARE ... v_ctd NUMBER(8) := 1; v_total NUMBER(7,2) := 0; BEGIN ... WHILE v_total < &p_itemtot LOOP ... v_ctd := v_ctd + 1; v_total := v_ctd * &p_precio; END LOOP; ...PL/SQL-38
Bucles anidados y etiquetas Se pueden anidar bucles en mltiples niveles. Se pueden utilizar etiquetas para distinguir entre bucles y bloques. Se puede salir del bucle externo con la orden EXIT referenciando la etiqueta.
PL/SQL-39
Bucles anidados y etiquetas... BEGIN LOOP v_contador := v_contador+1; EXIT WHEN v_contador>10; LOOP ... EXIT bucle_externo WHEN total_realizado = SI'; -- Deja ambos bucles EXIT WHEN interno_realizado = SI'; -- Deja slo el bucle interno ... END LOOP bucle_interno; ... END LOOP bucle_externo; END;PL/SQL-40
Tipos de Datos Compuestos
Tipos de datos compuestos Tipos: REGISTROS PL/SQL TABLAS PL/SQL
Contienen componentes internos Son reutilizables
PL/SQL-42
Registro PL/SQLSintaxisTYPE nombre_tipo IS RECORD (declaracin_campo[, declaracin_campo]); identificador nombre_tipo;
Donde declaracin_campo es:nombre_campo {tipo_campoe | variable%TYPE | tabla.columna%TYPE | tabla%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr]
PL/SQL-43
Registro PL/SQLEjemplo... TYPE empleado_tipo_reg IS RECORD (nombre VARCHAR2(10), trabajo VARCHAR2(9), salario NUMBER(7,2)); emp_registro empleado_tipo_reg; ...
PL/SQL-44
Atributo %ROWTYPE Declara una variable de acuerdo a una coleccin de columnas en una tabla de base de datos o vista. Prefija %ROWTYPE con la tabla. Los campos del registro toman nombres y tipos de las columnas de la tabla o vista.dept_record emp_recordPL/SQL-45
dept%ROWTYPE; emp%ROWTYPE;
Tablas PL/SQL Estn constituidas por dos componentes: Clave Primaria de tipo BINARY_INTEGER Columnas de tipo escalar or registro
Crece dinmicamente porque no est limitada
PL/SQL-46
Tablas PL/SQLSintaxisTYPE nombre_tipo IS TABLE OF {tipo_columna | variable%TYPE | tabla.columna%TYPE} [NOT NULL] [INDEX BY BINARY_INTEGER]; Identificador nombre_tipo;
Ejemplo... TYPE nombre_tipo_tabla IS TABLE OF emp.nombre%TYPE INDEX BY BINARY_INTEGER; nombre_tabla nombre_tipo_tabla; ...
PL/SQL-47
Estructura de tabla PL/SQLClave Primaria ... 1 2 3 ... BINARY_INTEGER Columna ... Lus Pepe Manolo ... Escalar
PL/SQL-48
Tabla PL/SQLDECLARE TYPE nombre_tipo_tabla IS TABLE OF emp.nombre%TYPE INDEX BY BINARY_INTEGER; TYPE fecha_tipo_tabla IS TABLE OF DATE INDEX BY BINARY_INTEGER; nombre_tabla nombre_tipo_tabla; fecha_tabla fecha_tipo_tabla; BEGIN nombre_tabla(1) := 'CARMELO'; fecha_tabla(8) := SYSDATE + 7; IF nombre_tabla.EXISTS(1) THEN INSERT INTO ... ... END;
PL/SQL-49
Tabla de Registros PL/SQL Define a variable TABLE con el atributo %ROWTYPE. Declara una variable PL/SQL para almacenar informacin del departmento. EjemploDECLARE TYPE dept_tipo_tabla IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; dept_tabla dept_tipo_tabla; -- Cada elemento de dept_tabla is un registro
PL/SQL-50
Mtodos de Tabla PL/SQLPara facilitar el uso de la tabla PL/SQL: NEXT EXISTS EXTEND COUNT TRIM FIRST and LAST DELETE PRIOR
PL/SQL-51
Cursores Explcitos
CursoresCada orden SQL ejecutada por el servidor Oracle tiene asociada un cursor individual: Cursores implcitos: Declarados para todas las rdenes DML y rdenes SELECT PL/SQL. Cursores explcitos: Declarados y nominados por el programador.
PL/SQL-53
Cursor ExplcitoConjunto resultado 7369 SMITH 7566 JONES Cursor 7788 SCOTT 7876 ADAMS 7902 FORD CLERK MANAGER ANALYST CLERK ANALYST Fila actual
PL/SQL-54
Control de cursores explcitosNo Si DECLARE OPEN FETCH VACO? CLOSE
Crea un
rea SQL nominada
Identifica el Almacenaconjunto activo la fila actual en variables
Chequea
si existen filas FETCH si encuentra filas
Elimina elconjunto activo
Retorna a
PL/SQL-55
Declarando el CursorSintaxisCURSOR nombre_cursor IS orden_select; DECLARE CURSOR c1 IS SELECT empno, nombre FROM emp; CURSOR c2 IS SELECT * FROM dept WHERE deptno = 10; BEGIN ...PL/SQL-56
Abriendo el CursorSintaxisOPEN nombre_cursor;
Obteniendo Datos del CursorFETCH nombre_cursor INTO [variable1, variable2, ...] | nombre_registro];
Cerrando el CursorCLOSE nombre_cursor;
PL/SQL-57
Uso del CursorEjemploFETCH c1 INTO v_empno, v_nombre; ... OPEN cursor1; LOOP FETCH cursor1 INTO variables EXIT WHEN ...; ... -- Procesa los datos obtenidos ... END; CLOSE cursor1;
PL/SQL-58
Atributos de Cursor ExplcitoObtiene informacin sobre el estado del cursor.Atributo %ISOPEN %NOTFOUND %FOUND Tipo Boolean Boolean Boolean Descripcin Evala a TRUE si el cursor est abierto Evala a TRUE si el fetch ms reciente no retorna filas Evala a TRUE si el fetch ms reciente retorna filas; complemento de %NOTFOUND Evala al nmero total de filas retornadas
%ROWCOUNT
Number
PL/SQL-59
EjemplosIF NOT c1%ISOPEN THEN OPEN c1; END IF; LOOP FETCH c1...
... CURSOR c1 IS SELECT empno, nombre FROM emp; emp_registro c1%ROWTYPE; BEGIN OPEN c1; . . . FETCH c1 INTO emp_registo;
PL/SQL-60
Bucle FOR CursorSintaxisFOR nombre_registro IN nobre_cursor LOOP orden1; orden2; . . . END LOOP;
Acorta el proceso para cursores explcitos. Incluye implicitamente open, fetch, y close. El registro se declara implcitamente.PL/SQL-61
Bucle FOR CursorEjemploDECLARE CURSOR c1 IS SELECT empno, nombre FROM emp; BEGIN FOR emp_registro IN c1 LOOP -- se ejecuta open y fetch implcitamente IF emp_registro.empno = 7839 THEN ... END LOOP; -- se ejecuta close implcitamente END;
PL/SQL-62
Bucle FOR Cursor Usando SubconsultasNo es necesario declarar el cursor. EjemploBEGIN FOR emp_registro IN ( SELECT empno, nombre FROM emp) LOOP -- se ejecuta open y fetch implcitamente IF emp_registro.empno = 7839 THEN ... END LOOP; -- se ejecuta close implcitamente END;
PL/SQL-63
Cursores con ParmetrosSintaxisCURSOR nombre_cursor [(nombre_parmetro tipo_de_datos, ...)] IS orden_select;
Pasa parmetros al cursor cuando se abre y la consulta se ejecuta. Abre un cursor explcito varias veces con un conjunto activo distinto cada vez.PL/SQL-64
Cursores con ParmetrosEjemploDECLARE CURSOR c1 (v_deptno NUMBER, v_trabajo VARCHAR2) IS SELECT empno, nombre FROM emp WHERE deptno = v_deptno AND trabajo = v_trabajo; BEGIN OPEN c1(10, AUXILIAR'); ...
PL/SQL-65
Clusula FOR UPDATESintaxisSELECT ... FROM ... FOR UPDATE [OF referencia_columna][NOWAIT]
Bloquea explcitamente durante la transaccin. Bloquea las filas antes de actualizar o borrar.
PL/SQL-66
Clusula FOR UPDATEEjemploDECLARE CURSOR c1 IS SELECT empno, nombre FROM emp FOR UPDATE NOWAIT;
PL/SQL-67
Clusula WHERE CURRENT OFSintaxisWHERE CURRENT OF cursor
Usa cursores para actualizar o borrar la fila actual. Incluir la clusula FOR UPDATE en la consulta del cursor para primero bloquear las filas. Usar la clusula WHERE CURRENT OF para referenciar la fila actual de un cursor explcito.PL/SQL-68
Clusula WHERE CURRENT OFEjemploDECLARE CURSOR c1 IS SELECT ... FOR UPDATE NOWAIT; BEGIN ... FOR emp_registro IN c1 LOOP UPDATE ... WHERE CURRENT OF c1; ... END LOOP; COMMIT; END;
PL/SQL-69
Cursores con SubconsultasEjemploDECLARE CURSOR cursor1 IS SELECT t1.deptno, nombre, PLANTILLA FROM dept t1, (SELECT deptno, count(*) PLANTILLA FROM emp GROUP BY deptno) t2 WHERE t1.deptno = t2.deptno AND PLANTILLA >= 5;
PL/SQL-70
Excepciones
Gestionando Excepciones con PL/SQL Qu es una excepcion? Identificador en PL/SQL que surge
durante la ejecucin. Cmo surge? Cuando ocurre un error Oracle. O se crea explcitamente.
Cmo gestionarlo? Capturarlo con un manejador. Propagarlo al entorno padre.PL/SQL-72
Gestionando ExcepcionesCaptura la ExcepcinDECLARE BEGIN EXCEPTION END;
Propaga la ExcepcinDECLARE BEGIN EXCEPTION END;Se crea la Excepcin
Se crea la Excepcin Se captura la Excepcin
No se atrapa la Excepcin La Excepcin se propaga al entorno padre
PL/SQL-73
Tipos de Excepcin Predefinida por el servidor Oracle No predefinida por el servidor Oracle Definida por el usuario
}
Surge Implcitamente
Surge Explcitamente
PL/SQL-74
Capturando ExcepcionesSintaxisEXCEPTION WHEN excepcin1 [OR excepcin2 . . .] THEN orden1; orden2; . . . [WHEN excepcin3 [OR excepcin4 . . .] THEN orden1; orden2; . . .] [WHEN OTHERS THEN orden1; orden2; . . .]
PL/SQL-75
Capturando errores predefinidos del servidor Oracle Referenciar el nombre estandard en la rutina de gestin de la excepcin. Ejemplos de excepciones predefinidas: NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEXPL/SQL-76
Excepcin PredefinidaSintaxisBEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN orden1; orden2; WHEN TOO_MANY_ROWS THEN orden1; WHEN OTHERS THEN orden1; orden2; orden3; END;
PL/SQL-77
Capturando errores del servidor Oracle no predefinidosDeclarar Asociar ReferenciarSeccin de gestin de excepcin
Seccin Declarativa
Nombrar laexcepcin
Codificar el
PRAGMA EXCEPTION_INIT
Gestionar laexcepcin surgida
PL/SQL-78
Error No-PredefinidoCaptura del error de Oracle nmero -2292 una violacin de restriccin de integridadDECLARE e_producto_invalido EXCEPTION; e_producto_invalido EXCEPTION; PRAGMA EXCEPTION_INIT ( PRAGMA EXCEPTION_INIT ( e_producto_invalido, -2292); e_producto_invalido, -2292); v_mensaje VARCHAR2(50); BEGIN . . . EXCEPTION WHEN e_producto_invalido THEN :g_mensaje := El cdio dl producto especificado no es vlido.'; . . . END;PL/SQL-79
1 2
3
Capturando Excepciones definidas por el usuarioDeclararSeccin Declarativa
CrearSeccin Ejecutable
ReferenciarSeccin Excepcin
Nombrar laexcepcin
Generar explicita-
Gestionar laexcepcin
mente la excepcin usando la orden RAISE
PL/SQL-80
Excepcin definida por el usuarioEjemplo[DECLARE] e_cantidad_restante EXCEPTION; e_cantidad_restante EXCEPTION; . . . BEGIN . . . RAISE e_cantidad_restante; RAISE e_cantidad_restante; . . . EXCEPTION WHEN e_cantidad_restante THEN :g_mensaje := Hay stock.'; . . . END; 1
2
3
PL/SQL-81
Funciones para capturar Excepciones SQLCODE Retorna el valor nmerico del cdigo de error SQLERRM Retorna el mensaje asociado con el nmero de error
PL/SQL-82
Funciones para capturar ExcepcionesEjemploDECLARE v_codigo_error NUMBER; v_mensaje_error VARCHAR2(255); BEGIN ... EXCEPTION ... WHEN OTHERS THEN ROLLBACK; v_codigo_error := SQLCODE ; v_mensaje_error:= SQLERRM ; INSERT INTO errores VALUES(v_codigo_error, v_mensaje_error); END;PL/SQL-83
Propagando ExcepcionesDECLARE . . . e_no_filas exception; e_integridad exception; PRAGMA EXCEPTION_INIT (e_integridad, -2292); BEGIN FOR c_registro IN emp_cursor LOOP
Subbloques pueden gestionar una excepcin o pasarla al bloque que lo contiene.
BEGIN SELECT ... UPDATE ... IF SQL%NOTFOUND THEN RAISE e_no_filas; END IF; EXCEPTION WHEN e_integridad THEN ... WHEN e_no_filas THEN ... END; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN . . . WHEN TOO_MANY_ROWS THEN . . . END;
PL/SQL-84
RAISE_APPLICATION_ERRORSintaxisraise_application_error (numero_error, mensaje[, {TRUE | FALSE}]);
Procedimiento que permite crear mensajes de error definidos por el usuario desde suprogramas almacenados. Llamado slo desde un subprograma almacenado en ejecucin.PL/SQL-85
RAISE_APPLICATION_ERROR Se usa en dos lugares diferentes: Seccin ejecutable Seccin Excepcin
Retorna condiciones de error al usuario de una forma consistente con otros errores del servidor Oracle
PL/SQL-86
Procedimientos
Procedimientos Un procedimiento es un bloque nominado PL/SQL que realiza una accin. Puede almacenarse como un objeto de la base de datos, para su ejecucin repetida.CREATE [OR REPLACE] PROCEDURE nombre_procedimiento (argumento1 [modo1] tipo_de_datos1, argumento2 [modo2] tipo_de_datos2, . . . IS [AS] Bloque PL/SQL;
PL/SQL-88
Modos de ParmetrosProcedimiento
Entorno de ejecucin
Parmetro IN Parmetro OUT Parmetro IN OUT(DECLARE) BEGIN EXCEPTION END;
PL/SQL-89
Modos de ParmetrosIN Por defecto El Valor se pasa al subprograma El parmetro acta como constante OUT Retornado al entorno de ejecucin variable no ininicializada IN OUT Pasado al subprograma; retornado al entorno de ejecucin Variable inicializada Debe ser una variable
Debe especificarse Debe especificarse
Puede ser: Debe ser una Literal, Expresin, variable Constante, o Variable inicializadaPL/SQL-90
Parmetro IN : EjemploSQL> CREATE OR REPLACE PROCEDURE act_salario 2 (v_id in emp.empno%TYPE) 3 IS 4 BEGIN 5 UPDATE emp 6 SET sal = sal * 1.10 7 WHERE empno = v_id; 8 END act_salario; 9 / Procedure created. SQL> EXECUTE act_salario (7369) PL/SQL procedure successfully completed.
PL/SQL-91
Parmetro OUT : EjemploSQL> 1 2 3 4 5 6 7 8 9 10 11 12 CREATE OR REPLACE PROCEDURE consulta_emp (v_id IN emp.empno%TYPE, v_nombre OUTemp.nombre%TYPE, v_salario OUTemp.sal%TYPE, v_comision OUTemp.com%TYPE) IS BEGIN SELECT nombre, sal, com INTO v_nombre, v_salario, v_comision FROM emp WHERE empno = v_id; END consulta_emp; /
PL/SQL-92
Parmetros OUT y SQL*PlusSQL> START consulta_emp.sql Procedure created. SQL> VARIABLE g_nombre SQL> VARIABLE g_salario SQL> VARIABLE g_comision varchar2(15) number number
SQL> EXECUTE consulta_emp (7654,:g_nombre,:g_salario, 2 :g_comision) PL/SQL procedure successfully completed. SQL> PRINT g_nombre G_NOMBRE --------------MARTINPL/SQL-93
Parmetros OUT y Procedure BuilderPL/SQL> PL/SQL> PL/SQL> PL/SQL> +> PL/SQL> +> +> MARTIN .CREATE CHAR g_nombre LENGTH 10 .CREATE NUMBER g_salario PRECISION 4 .CREATE NUMBER g_comision PRECISION 4 ACT_SALARIO (7654, :g_nobre, :g_salario, :g_comision); TEXT_IO.PUT_LINE (:g_nombre || ' gana ' || TO_CHAR(:g_salario) || ' + comisin de ' || TO_CHAR(:g_comision)); gana 1250 + comisin de 1400
PL/SQL-94
Parmetros IN OUTSQL> CREATE OR REPLACE PROCEDURE formatea_tlf 2 (v_tlf IN OUT VARCHAR2) 3 IS 4 BEGIN 5 v_tlf := '(' || SUBSTR(v_tlf,1,3) || 6 ')' || SUBSTR(v_tlf,4,3) || 7 '-' || SUBSTR(v_tlf,7); 8 END formatea_tlf; 9 / SQL>VARIABLE g_tlf varchar2(15) SQL> BEGIN :g_tlf := '8006330575'; END; SQL> EXECUTE formatea_tlf (:g_tlf)
PL/SQL-95
Mtodos de paso de Parmetros Posicional:Los valores se listan en el mismo orden que se declaran
Nominada:Los valores se listan en cualquier orden asociando cada uno con su parmetro usando =>
Combinacin:Lista los primeros valores posicionalmente y el resto de forma nominadaPL/SQL-96
Paso de Parmetros: EjemploSQL> 1 2 3 4 5 6 7 8 CREATE OR REPLACE PROCEDURE inserta_dept (v_nombre IN dept.nombre%TYPE DEFAULT desconocido', v_loc IN dept.loc%TYPE DEFAULT desconocido') IS BEGIN INSERT INTO dept VALUES (dept_deptno.NEXTVAL, v_nombre, v_loc); END inserta_dept; /
SQL> begin 2 add_dept; 3 add_dept ( 'TRAINING', 'NEW YORK'); 4 add_dept ( v_loc => 'DALLAS', v_name =>'EDUCATION'); 5 add_dept ( v_loc => 'BOSTON') ; 6 end; 7 / PL/SQL procedure successfully completed.PL/SQL-97
Borrando ProcedimientosUsando SQL*Plus: SintaxisDROP PROCEDURE nombre_porcedimiento
EjemploSQL> DROP PROCEDURE act_salario; Procedure dropped.
PL/SQL-98
Funciones
Funciones Una funcin es un bloque nominado PL/SQL que retorna un valor. Puede ser almacenado como un objeto de la base de datos. Puede ser llamada como parte de una expresin.CREATE [OR REPLACE] FUNCTION nombre_funcion (argumento1 [modo1] tipo_de_datos1, argumento2 [modo2] tipo_de_datos2, . . . RETURN tipo_de_datos IS|AS Bloque PL/SQL;PL/SQL-100
Funcin almacenada: EjemplosSQL> CREATE OR REPLACE FUNCTION obten_sal 2 (v_id IN emp.empno%TYPE) 3 RETURN NUMBER 4 IS 5 v_salario emp.sal%TYPE :=0; 6 BEGIN 7 SELECT sal INTO v_salary 8 FROM emp WHERE empno = v_id; 9 RETURN (v_salary); 10 END get_sal; 11 / FUNCTION tax (v_value IN NUMBER) RETURN NUMBER IS BEGIN RETURN (v_value * .08); END tax;
Procedure Builder SQL*Plus Procedure Builder
SQL*Plus
PL/SQL-101
Ejecutando Funciones:EjemplosSQL> START obten_salario.sql Procedure created. created SQL> VARIABLE g_salario number SQL> EXECUTE :g_salario := obten_sal(7934) PL/SQL procedure successfully completed. SQL> PRINT g_salario G_SALARIO -----------------1300 PL/SQL> .CREATE NUMBER x PRECISION 4 PL/SQL> :x := tasa(1000); PL/SQL> TEXT_IO.PUT_LINE (TO_CHAR(:x)); 80
PL/SQL-102
Llamada a Funciones desde expresiones: Restricciones Una funcin definida por el usuario debe ser almacenada, y no de grupo. Una funcin definida por el usuario slo puede utilizar parmetros IN. Tipos de datos CHAR, DATE, or NUMBER, no tipos PL/SQL tales como BOOLEAN, RECORD, or TABLE. El tipo de retorno debe ser un tipo interno de Oracle Server. No se permiten INSERT, UPDATE, or DELETE. No se permiten llamadas a subprogramas que violen las restricciones anteriores.PL/SQL-103
Borrando FuncionesUsando SQL*Plus SintaxisDROP FUNCTION nombre_funcion
EjemploSQL> DROP FUNCTION obten_salario; Function dropped.
PL/SQL-104
Paquetes
Paquetes Grupo lgico que relaciona tipos, items y subprogramas. Consiste de dos partes: Especificacin Cuerpo
No puede ser llamado, parametrizado o anidado. Oracle permite leer mltiples objetos en memoria simultneamente.PL/SQL-106
Ventajas de los paquetes Modularidad Fcil diseo de la aplicacin Ocultacin de la informacin Funcionalidad aadida Mejor rendimiento Sobrecarga
PL/SQL-107
Desarrollando un paqueteVariables pblicas
Especificacin del paquete
Declaracin Procedimiento A
Procedimiento pblico
Variables globales Definicin Procedimiento B Definicin Procedimiento A Variables locales Procedimiento privado
Cuerpo del paquete
Procedimiento pblico
PL/SQL-108
Especificacin del paqueteSintaxisCREATE [OR REPLACE] PACKAGE nombre_paquete IS | AS declaracione de items y tipos publicos especificaciones de subprogramas END nombre_paquete;
Una especificacin puede existir sin cuerpo pero no al contrario. No puede existir un procedimiento en un paquete e individual simultneamente.PL/SQL-109
Especificacin del paquete: EjemploSQL>CREATE OR REPLACE PACKAGE com_package IS 2 g_com NUMBER := 10; --inicializado a 10 3 PROCEDURE reset_com 4 (v_com IN NUMBER); 5 END com_package; 6 /
SQL> EXECUTE com_package.g_com := 5 SQL> EXECUTE com_package.reset_com(8)
PL/SQL-110
Cuerpo del paqueteSintaxisCREATE [OR REPLACE] PACKAGE BODY nombre_paquete IS | AS declaraciones de items y tipos privados cuerpos de subprogramas END nombre_paquete;
PL/SQL-111
Cuerpo del paquete: EjemploSQL>CREATE OR REPLACE PACKAGE BODY com_package IS 2 FUNCTION valida_com 3 (v_com IN NUMBER) RETURN BOOLEAN 4 IS 5 v_max_com NUMBER; 6 BEGIN 7 SELECT MAX(com) 8 INTO v_max_com 9 FROM emp; 10 IF v_com > v_max_com THEN RETURN(FALSE); 11 ELSE RETURN(TRUE); 12 END IF; 13 END valida_com; 14 END com_package; 15 /
PL/SQL-112
Cuerpo del paquete: EjemploSQL>PROCEDURE reset_com 2 (v_com IN NUMBER) 3 IS 4 v_valido BOOLEAN; 5 BEGIN 6 v_valido := valida_com(v_com); 7 IF v_valido = TRUE THEN 8 g_com := v_com; 9 ELSE 10 RAISE_APPLICATION_ERROR 11 (-20210, Comisin no vlida'); 12 END IF; 13 END reset_com; 14 END com_package; 15 /
PL/SQL-113
Invocando constructores del paqueteEjemplo 1SQL> EXECUTE com_package.reset_com(1500);
SQL>
EXECUTE scott.com_package.reset_com(1500);
SQL>
EXECUTE com_package.reset_com@ny (1500);
PL/SQL-114
Invocando constructores del paqueteEjemplo 2CREATE OR REPLACE PROCEDURE contrato_emp (v_nombre IN emp.nombre%TYPE, v_mgr IN emp.mgr%TYPE, v_trabajoIN emp.trabajo%TYPE, v_sal IN emp.sal%TYPE) IS v_com emp.com%TYPE; . . . BEGIN . . . v_com := com_package.g_com; . . . END contrato_emp;
PL/SQL-115
Borrando paquetesPara borrar la especificacin y cuerpo del paquete:DROP PACKAGE nombre_paquete
Para borrar el cuerpo del paquete:DROP PACKAGE BODY nombre_paquete
PL/SQL-116