iniciando plsql

Upload: bjmrn2

Post on 19-Jul-2015

385 views

Category:

Documents


0 download

TRANSCRIPT

PL/SQL es un lenguaje de programacin estructurado. Es un lenguaje procedimental que ampla la funcionalidad de SQL, aadiendo estructuras habituales en otros lenguajes de programacin, entre las que se encuentran: Variables y Tipos

Introduccin PL/SQL

a

Estructuras de control Procedimientos y Funciones Tipos de Objetos y Mtodos . La unidad bsica en PL/SQL es el bloque. Todos los programas PL/SQL estn compuestos por bloques que pueden estar anidados. Un bloque PL/SQL est compuesto de tres partes principales: Seccin declarativa (opcional). Contiene las variables, constantes ... Seccin ejecutable (obligatoria). Contiene rdenes SQL para manipular datos De la base de datos y rdenes PL/SQL para manipular los datos del bloque Seccin de excepciones (opcional). Especifica las acciones a realizar en caso de error o cuando se producen excepciones en la ejecucin.

La estructura general es: [DECLARE variables, constantes, excepciones de usuario...] BEGIN rdenes SQL rdenes PL/SQL [EXCEPTION acciones a realizar al ocurrir un error] END; / Para ejecutar un bloque PL/SQL siempre hay que colocar al final la barra /.

Podemos crear diferentes tipos de bloques: Bloques annimos: Se construyen de forma dinmica y se suelen ejecutar una sola vez. Bloques nominados: Igual que los annimos pero con una etiqueta que les da nombre. Subprogramas: Procedimientos, paquetes y funciones, almacenados en la base de datos y que se ejecutan en mltiples ocasiones. Los subprogramas se ejecutarn mediante una llamada. Disparadores (Triggers): Bloques nominados que se almacenan en la base de datos y que se ejecutan ante algn suceso.

Para poner nombre a un bloque se le pone una etiqueta antes del DECLARE encerrado por . Por ejemplo para darle el nombre Mi_Bloque a un bloque PL/SQL pondramos: ECLARE D BEGIN END; /

Declaracin de Identificadores PL/SQLVariables Identificadores Un identificador es un nombre para las unidades de PL/SQL, las cuales pueden ser:

Constantes Variables Excepciones Cursores Variables de cursor Sub programas

Paquetes

Un identificador consiste de letras seguidas de manera opcional por ms letras, numerales, underscores, hasta un mximo de 30 caracteres adems que debe comenzar con una letra. Otros caracteres como guiones (-), diagonales (/) y espacios no son aceptados. Ejemplos invlidos: Hombre&mujeres: no es valido por el Debito-total: no es valido por el guin. On/off: no es valido por la diagonal. User id: no es valido por los espacios. ` Ejemplos validos: Total$endolares No#Emp User_id ampersand .

El nombre del identificador puede ir en maysculas o minsculas, para PL/SQL no hay diferencia al respecto. Los siguientes significan lo mismo: Apellido_parterno APELLIDO_PATERNO

Palabras reservadas Algunos identificadores llamados palabras reservadas tienen un significado especial para PL/SQL. Por ejemplo las palabras BEGIN y END son reservadas.

Identificadores entre comillas Para flexibilidad PL/SQL permite tener identificadores entre comillas. Ejemplos: X+Y apellido paterno on/off Aunque anterior mente se menciono que no era posible tener caracteres raros en el nombre, en el caso que se utilice un identificador entre comillas este puede contener cualquier carcter. Las variables se definen en la seccin declarativa de los bloques PL/SQL dnde tambin pueden inicializarse. La asignacin de nuevos valores a las variables puede hacerse en la parte ejecutable del bloque.

Pueden utilizarse para pasar valores como argumentos a subprogramas. Estas podrn ser de tipo IN (variable de entrada, OUT, variable de salida o INOUT, variable de entrada/salida). Tambin podrn utilizarse para almacenar valores devueltos o requeridos por una orden SQL. Todas las variables tienen un tipo. Los posibles tipos de una variable son: Escalar. Almacenan un valor nico. Son los mismos que los de las columnas de las tablas (VARCHAR2, NUMBER, DATE, CHAR, LONG, LONG_RAW, BINARY_INTEGER, LAW_INTEGER) ms el BOOLEAN Compuesto. Grupos de datos: tablas PL/SQL, registros... Puntero. Designan elementos de otros programas. LOB (Large OBjects). Almacenan gran cantidad de informacin. Las variables de tipo LOB permiten almacenar datos no estructurados (imgenes, texto...) de hasta 4 GB de tamao

Declaracin de variables Sintaxis: [CONSTANT] [NOT NULL] [{:= | DEFAULT }]; Ejemplo: DECLARE fecha DATE; dep_num NUMBER(2) NOT NULL := 10; ciudad VARCHAR2(10) := Ciudad Real; Km_a_milla CONSTANT NUMBER := 1.4; Las variables declaradas como NOT NULL siempre deben ser inicializadas. La inicializacin puede hacerse utilizando := o la palabra reservada DEFAULT.

Si una variable no se inicializa contendr el valor NULL. Las constantes deben ser inicializadas. Asignacin de valores a variables

Sintaxis: := ; Atributo %TYPE El atributo %TYPE se utiliza para declarar una variable con el mismo tipo que una columna de una tabla o que otra variable definida anteriormente. Sintaxis: {. | }%TYPE; Ejemplo: var_nombre Empleados.nombre%TYPE; balance NUMBER; balance_minimo balance%TYPE := 10; Variables BOOLEANAS Las variable BOOLEANAS pueden tomar el valor TRUE, FALSE o NULL. Las variables pueden combinarse mediante operadores lgicos (NOT, AND, OR). Las expresiones pueden devolver valores BOOLEANOS utilizando operadores relacionales (= (mayor o igual a) 10; END LOOP; END; / rden FOR Los bucles FOR se repiten un nmero determinado de veces. Sintaxis: FOR IN .. [REVERSE] LOOP ... END LOOP; Ejemplo: SET ServerOutput ON; SET VERIFY OFF; DECLARE num NUMBER; BEGIN

FOR num IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('Valor: '|| num); END LOOP; END; / rden WHILE Los bucles WHILE son iguales que en otro lenguajes de programacin. Sintaxis: WHILE LOOP ... END LOOP; Ejemplo: SET ServerOutput ON; SET VERIFY OFF; DECLARE num NUMBER:=1; BEGIN WHILE num 24000 THEN Sal_Des := sal 24000; Identado a tres columnas del IF ELSE Sal_Des := 0; END IF; END; / Siempre que se usa un SQL, dentro de un PL, encerrarlo en un bloque tratando de manejar los posibles errores que devolver ese SQL. EjEMPLO; BEGIN UPDATE emp SET sal = 8000 WHERE NoEmp = V_NoEmp; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(No existe el empleado : ||V_NoEmp); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(No existe el empleado : ||V_NoEmp); END; /

Recomiendo poner una letra delante de las variables que indique que corresponden a: Una Variable (V), un Cursor (C), una Excepcin (E), un Parmetro (P), Separar con un guin bajo ( UnderScore _ ), las variables que tengan mas de una letra Ejemplo; VSueldo_Bruto En general en programacin muchos autores recomiendan: Escribir las palabras reservadas del lenguaje en maysculas (UPDATE) , variables y nombres de campos en Capitalize (Primera letra en maysculas y las siguientes en minsculas). En fin tratar de hacer el cdigo limpio y entendible para usted y cualquier otra persona. Gestin de Dependencias Dependencias Recompilacin de objetos descompilados del esquema. Las actualizaciones, parches y cambios de libreras pueden invalidar objetos del esquema. Una vez realizados los cambios los objetos dependientes sern revalidados de forma automtica cuando se usan. Esto puede tardar un rato e incluso tardar un tiempo inaceptable por lo que lo lgico es recompilar las dependencias antes de las llamadas de los usuarios. Esto adems permite descubrir si los cambios han afectado al resto del cdigo.

Identificacin de objetos descompiladosCOLUMN object_name FORMAT A30 SELECT owner, object_type, object_name, status FROM dba_objects WHERE status = 'INVALID' ORDER BY owner, object_type, object_name; Con esta informacin podemos decidir que metodo seguir para recompilar.

Recompilacin manual Para un nmero pequeo de objetos es probable que la recompilacin manual sea suficiente. ALTER PACKAGE my_package COMPILE; ALTER PACKAGE my_package COMPILE BODY; ALTER PROCEDURE my_procedure COMPILE; ALTER FUNCTION my_function COMPILE; ALTER TRIGGER my_trigger COMPILE; ALTER VIEW my_view COMPILE; Hay que tener en cuenta que es necesario recompilar cabecera y cuerpo del paquete por separado. Alternativamente podemos usar el paquete DBMS_DDL : XEC E DBMS_DDL('PACKAGE', 'MY_SCHEMA', 'MY_PACKAGE'); EXEC DBMS_DDL('PACKAGE BODY', 'MY_SCHEMA', 'MY_PACKAGE') ; XEC DBMS_DDL('PROCEDURE', 'MY_SCHEMA', E 'MY_PROCEDURE'); EXEC DBMS_DDL('FUNCTION', 'MY_SCHEMA', 'MY_FUNCTION'); EXEC DBMS_DDL('TRIGGER', 'MY_SCHEMA', 'MY_TRIGGER'); Este metodo esta limitado a los objetos PL/SQL por lo que no es aplicable a vistas. Script a medida En algunos casos puede ser interesante escribir un script para identificar y compilar objetos descompilados. Un ejemplo para PACKAGE y PACKAGE BODY seria: SET SERVEROUTPUT ON SIZE 1000000 BEGIN FOR cur_rec IN (SELECT owner, object_name, object_type, DECODE(object_type, 'PACKAGE', 1, 'PACKAGE BODY', 2, 2) AS recompile_order FROM dba_objects

WHERE object_type IN ('PACKAGE', 'PACKAGE BODY') AND status != 'VALID' BY 4) ORDER LOOP BEGIN IF cur_rec.object_type = 'PACKAGE' THEN EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || ' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE'; ElSE EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE BODY'; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner || ' : ' || cur_rec.object_name); END; END LOOP; END; / Con este mtodo hay que tener mucho cuidado ya que puedes acabar recompilando algunos objetos varias veces dependiendo del orden de ejecucin de la recompilacin. Los procedimientos que nos da oracle y que estn explicados a continuacin si que tiene en cuenta el orden adecuado. DBMS_UTILITY.compile_schema El procedimiento COMPILE_SCHEMA del paquete DBMS_UTILITY compila todos los procedures, functions, packages, y triggers de un esquema. Hay que tener muy en cuenta que tampoco recompila las vistas. EXEC DBMS_UTILITY.compile_schema(schema => 'SCOTT'); UTL_RECOMP El paquete UTL_RECOMP contiene 2 procedimientos para recompilar objetos descompilados. RECOMP_SERIAL recompila los objetos uno por uno mientras que RECOMP_PARALLEL recompila en paralelo usando el numero de threads especificado.

PROCEDURE RECOMP_SERIAL( schema IN VARCHAR2 DEFAULT NULL, flags IN PLS_INTEGER DEFAULT 0); PROCEDURE RECOMP_PARALLEL( threads IN PLS_INTEGER DEFAULT NULL, schema IN VARCHAR2 DEFAULT NULL, flags IN PLS_INTEGER DEFAULT 0); los parametros son: - schema - El esquema a recompilar, si es nulo se recompilan todos los objetos descompilados de la base de datos. - threads - El numero de threads a utilizar, si es nulo se usa el valor de "job_queue_processes". Un valor adecuado es el numero de CPU's disponibles. - flags - Se usa para pruebas y diagnostico interno. EXEC UTL_RECOMP.recomp_serial('SCOTT'); EXEC UTL_RECOMP.recomp_parallel(4, 'SCOTT'); Database level. EXEC UTL_RECOMP.recomp_serial(); EXEC UTL_RECOMP.recomp_parallel(4); Using job_queue_processes value. EXEC UTL_RECOMP.recomp_parallel(); EXEC UTL_RECOMP.recomp_parallel(NULL, 'SCOTT'); Restricciones del paquete: -La ejecucion en paralelo utiliza la cola de trabajos. Todos los trabajos se dehabilitan hasta que la operacin termina. -Debe ejecutarse con el usuario SYS u otros con permisos de SYSDBA. Deber existir STANDARD, DBMS_STANDARD, DBMS_JOB and DBMS_RANDOM. -El ejecutar comandos DDL a la vez puede provocar interbloqueos. Explicacin de la sintaxis utilizada para los comandos: - Las palabras en mayusculas son comandos de oracle. - Las palabras en minusculas son opiones modificables - Las partes enmarcadas con [] son opcionales - Las palabras en negrita son las opciones por defecto - Las partes enmarcadas con {} son alternativas (una u otra). - El simbolo | indica OR

ANEXO 1 Tipos de Datos y Conversiones Cada constante y variable posee un tipo de dato el cual especifica su forma de almacenamiento, restricciones y rango de valores vlidos. Con PL/SQL se proveen diferentes tipos de datos predefinidos. Un tipo escalar no tiene componentes internas; un tipo compuesto tiene otras componentes internas que pueden ser manipuladas individualmente. Un tipo de referencia almacena valores, llamados punteros, que designan a otros elementos de programa. Un tipo lob (large object) especifica la ubicacin de un tipo especial de datos que se almacenan de manera diferente. En la figura 3-1 se muestran los diferentes tipos de datos predefinidos y disponibles para ser utilizados.

Figura 3-1: Tipos de datos de PL/SQL

Conversiones 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. Esto significa que la interpretacin que se dar a algn dato ser el que mejor se adecue dependiendo del contexto en que se encuentre. Tampoco significa que todas las conversiones son permitidas. Algunos ejemplos de conversin implcita ms comunes se dan cuando variables de tipo char se operan matemticamente para obtener un resultado numrico. Si PL/SQL no puede decidir a qu tipos de dato de destino puede convertir una variable se generar un error de compilacin. Tabla de conversiones implcitas Hasta BIN_I NT Desde BIN_IN T XXXXX CH AR DA TE LON NUM B G ER PLS_I RA ROW VARCH NT W ID AR2

CHAR X X X X X X X X DATE X X LONG X X X NUM B ER PLS_IN T RAW X X XXXXX XXXXX X X

ROWID X VARC HAR2 XXXXXXXX

X