You are on page 1of 10

UNIVERSIDAD DE CALDAS BASES DE DATOS II Sesin 2 Docente: Ing.

Mauricio Bedoya

Usando variables de SQL dentro de los bloques PL-SQL PL-SQL no tiene capacidades de entrada-salida propias. Se debe confiar en el ambiente en el cual PL-SQL se est ejecutando para pasar valores dentro y fuera de un bloque de PL-SQL. En el ambiente de SQL, SQL permite variables de substitucin para que se almacenen y se editen antes de ser ejecutadas. Las variables de substitucin son las variables que se pueden utilizar para pasar valores, nmeros o caracteres, en un bloque de PL-SQL. Se puede hacer referencia a ellas dentro de un bloque de PL-SQL con un signo "&" precedente, de manera semejante mientras s esta refiriendo a ms variables de substitucin dentro de una declaracin de SQL. Los valores de texto se substituyen en el bloque de PL-SQL antes de que se ejecute el bloque de PL-SQL. Tipos de variables 3. TRUE representa un valor Booleano 4. 25-OCT-99 representa un DATE 5. El nombre de una ciudad representa un VARCHAR2 6. El texto de un prrafo representa un LONG RAW 7. Una fotografa representa un BLOB 8. Un vdeo representa un BFILE Declarando variables de PL-SQL. Se necesitan declarar todos los identificadores de PL-SQL en la seccin de declaracin antes de referirse a ellos en el bloque de PL-SQL. Existe la opcin de asignar un valor inicial, pero no es necesario asignar un valor a un variable para declararlo. Si se hace referencia a otras variables en una declaracin, se deben declarar por separado en una declaracin anterior. Sintaxis: Identificador: es el nombre de la variable. CONSTANT: es el valor que tiene la variable, este valor no puede cambiar, las constantes deben ser inizializadas. Tipo_dato: es un escalar, compuesto, referencia, o tipo de dato LOB. NOT NULL: inicializarse. es el valor que tienen la variable, cuando se trate de este tipo debe

Expresin: es una expresin de PL-SQL que puede ser una literal, otra variable, o una expresin que implica operadores y funciones.

identificador[CONSTANT] tipo_dato [NOT NULL] [:= | DEFAULT expresion];

El atributo %TYPE Cuando se declaran variables de PL-SQL para guardar valores en las columnas, se debe asegurar que el tipo de dato y la precisin de las variables sean correctos. Si no lo son, ocurrir un error de PL-SQL durante la ejecucin. Para asegurar que el tipo de dato y la precisin de la variable son correctos, con el de las columnas de las tablas en la base de datos se debe utilizar el %TYPE para declarar una variable igual a la columna previamente declarada de la variable o de la base de datos. El atributo %TYPE se utiliza muy a menudo cuando el valor almacenado en la variable ser derivado de una tabla del tipo de dato requerido en la declaracin de la variable. Se prefija con el nombre de la tabla y de la columna de la base de datos. Si se refiere a una variable previamente declarada, se prefija el nombre de la variable. PL-SQL determina el tipo de dato y el tamao de la variable cuando se compila el bloque. sta es una ventaja definida para escribir y mantener el cdigo, porque no hay necesidad de cambiar el tipo de dato en el bloque, este cambio solo se realiza a nivel de la base de datos.

ACCEPT p_empno PROMPT 'Nmero del empleado' DECLARE v_empno emp. Empno%TYPE := &p_empno; v_sal emp.sal%TYPE; v_comm emp.comm%TYPE; BEGIN ......... END;

Declarando variables con el atributo %TYPE La declaracin de una variable que es del mismo tipo que la columna de una tabla de la base de datos, quedara de la siguiente manera:
. . . v_ename . . . emp.ename%TYPE;

La declaracin de una variable que es del mismo tipo que una variable declarada anteriormente quedara de la siguiente manera:

. . . v_balance v_min_balance . . . NUMBER(7,2); v_balance%TYPE := 10;

Las columnas con valores NOT NULL no se les pueden declaran variables usando el %TYPE. Por

lo tanto, si se declara una variable usando l %TYPE para una columna de la base de datos definida como NOT NULL, se puede asignar el valor NULL a la variable. Declarando variables booleanas. Con PL-SQL se pueden comparar variables de SQL y declaraciones procedimentales. Estas comparaciones, son llamadas expresiones Booleanas, consisten en expresiones simples o complejas separadas por operadores. En una declaracin de SQL, se pueden utilizar expresiones booleanas para especificar las filas en una tabla que son afectadas por la declaracin. En una declaracin procedimental, las expresiones booleanas son la base para el control condicional. La declaracin y la inicializacin de una variable booleana, quedara de la siguiente manera:

v_comm_sal BOOLEAN := (v_sal1 <v_sal2); v_sal1 := 50000; v_sal2 := 60000; La siguiente expresin es TRUE v_sal1 < v_sal2

IMPRIMIENDOPORPANTALLA Dentro de un bloque de PL-SQL, hay que hacer referencia a DBMS_OUTPUT.PUT_LINE y entre parntesis, la informacin que se desea imprimir en la pantalla. El paquete primero debe ser activado en la sesin de SQL. Para hacer esto, se debe ejecutar el comando de SQL SET SERVEROUTPUT ON. Reglas para el nombre de los objetos Dos objetos pueden tener el mismo nombre, a condicin de que se definan en diferentes bloques. Donde coexisten, slo el objeto declarado en el bloque actual puede ser utilizado. Una variable no puede tener el mismo nombre (identificador) que el de las columnas de la tabla usadas en el bloque. Si las variables de PL-SQL se utilizan en declaraciones de SQL y tienen el mismo nombre que una tabla, el servidor de Oracle asume que se est haciendo referencia a la tabla.
DECLARE empno NUMBER(4); BEGIN SELECT empno INTO empno FROM emp WHERE ename='SMITH' END;

Este cdigo usa el mismo nombre para una tabla de la base de datos y una variable, por lo que no es fcil de leer o de mantener. Se recomienda usar v _ como prefijo para representar una variable y g _ para representar una variable global para evitar conflictos con los objetos de la base de datos. Los identificadores no deben ser ms largos de 30 caracteres. El primer carcter debe ser una letra, los caracteres restantes pueden ser letras, nmeros, o smbolos especiales. Tipos de datos Todas las variables de PL-SQL tienen un tipo de dato, que especifica un formato de almacenaje, y un rango vlido de valores.

PL-SQL clasifica los tipos de datos en 4 categoras: Escalares, Compuesto, Referencia y Objeto de LOB(large) a) Escalares Tienen un solo valor. Los principales son los que corresponden al tipo de columnas de las tablas del Servidor Oracle. Permiten manipular datos numricos, alfanumricos, fechas y booleanos. Tipos de datos escalares: o VARCHAR2(longitud mxima) o NUMBER(precisin, escala) o DATE o CHAR(longitud mxima) o LONG o LONG RAW o BOOLEAN o BINARY_INTEGER o PLS_INTEGER El tipo VARCHAR2 es un tipo de dato carcter de hasta 32,767 bytes. Si se usa un cdigo distinto al cdigo ASCII, el nmero total de caracteres puede ser menor. El tipo NUMBER este tipo de dato se almacena en formato decimal. Para operaciones aritmticas deben traducirse a binario. El tipo DATE es un tipo de dato para fecha y tiempo. DATE incluye valores de tiempo en das y segundos desde la medianoche. Su rango esta entre 4712 B.C. y 9999 A.D El tipo CHAR es un tipo de dato carcter de hasta 32,767 bytes. Si no se especifica una longitud mxima, la longitud por default es 1. El tipo LONG es un tipo de dato carcter de hasta 32,767 bytes. La anchura mxima para este en una columna de la base de datos es 2,147,483,647 bytes. El tipo LONG RAW es un tipo de dato para datos binarios y cadenas de 32,760 bytes. LONG RAW no es interpretado por PL-SQL El tipo BOOLEAN es un tipo de dato que almacena uno de tres posibles valores usados para realizar clculos lgicos: TRUE , FALSE, NULL El tipo BINARY_INTEGER es un tipo de dato entero en binario (complemento a 2) con un rango entre -2,147,483 y 2,147,483,647, ideal para variables sobre las que se efectuarn operaciones. El tipo PLS_INTEGER es similar a BINARY_INTEGER, pero ms rpido en las operaciones aritmticas y que genera un error si se produce un desbordamiento (ORA1426) al asignarlo a un NUMBER.

Declaracin de Variables Escalares


v_job v_count DATE; BINARY_INTEGER := 0;
Variable que almacena el nombre del trabajo de un empleado Variable para contar las iteraciones de un ciclo,se inicializa a 0

v_total_sal NUMBER(9,2):= 0;
Variable para acumular el sueldo total para un departamento,se inicializa a 0

c_tax_rate v_valid
con TRUE

CONSTANT NUMBER(3,2):= 8.25; BOOLEAN NOT NULL := TRUE;

Es un tipo de variable constante, que nunca cambia a travs del bloque PL/SQL Bandera que indica si ciertos datos son vlidos o invlidos, se inicializa

b) Compuestos Permiten que los grupos de campos sean manipulados y definidos en los bloques de PLSQL. Tipos de datos compuestos: o TABLE o RECORD o NESTED TABLE o VARRAY El tipo de dato RECORD se utiliza para datos relacionados como una unidad lgica. El tipo de dato TABLE se utiliza para referirse y manipular datos como un objeto completo. c) Referencia Tambin conocido como punteros, sealan otros objetos de un programa. REF CURSOR y REF <Tipo_objeto> d) LOB Tambin conocidos como localizadores, especifican la localizacin de los objetos grandes (imgenes grficas, sonido) que se almacenan fuera de lnea. Con el tipo de datos LOB en Oracle8 se puede almacenar bloques de datos no estructurados (como texto, imgenes grficas, video clips, y audio) hasta un tamao de 4 gigabytes. Los tipos de dato LOB son eficientes, los datos se accesan al azar, tambin se puede accesar a cierta parte de datos, y puede ser atributo de un tipo de objeto.

o CLOB o BLOB o BFILE o NCLOB El CLOB (objeto grande de tipo carcter) se utiliza para almacenar bloques grandes de

datos de tipo carcter (un byte) en la base de datos. El BLOB (objeto grande de tipo binario) se utiliza para almacenar objetos binarios grandes en la base de datos. El BFILE (archivo binario) se utiliza para almacenar objetos binarios grandes en archivos del sistema operativo fuera de la base de datos. El NCLOB se utiliza para almacenar bloques grandes de (un byte) o datos fijos de multibyte NCHAR en la base de datos.

Tipos de datos compuestos: Recuperando datos usando PL-SQL Se usa el estatuto SELECT para recuperar datos de la base de datos.

SELECT lista_seleccionada INTO {nombre_variable[,nombre_variable] . . . | nombre_registro} FROM tabla WHERE condicion;

Sintaxis: lista_seleccionada: es una lista de una columna y puede incluir expresiones SQL, funciones de fila o funciones de grupo. nombre_variable: es la variable escalar para llevar el valor recuperado. nombre_registro: es el registro de PL-SQL que lleva los valores recuperados. tabla: especifica el nombre de la tabla de la base de datos. condicin: se compone de los nombres de la columna, expresiones, constantes, y operadores de comparacin, incluyendo variables de PL-SQL y constantes. Clusula INTO La clusula INTO es obligatoria y se encuentra entre las clusulas SELECT y FROM. Se utiliza para especificar los nombres de las variables que almacenaran los valores que se obtengan de la clusula SELECT. Se debe declarar una variable para cada objeto seleccionado, y su orden debe corresponder al orden en el que van a ser seleccionados. Se utiliza la clusula INTO para variables de PL-SQL o variables del ambiente anfitrin.

DECLARE v_depto NUMBER(2); v_loc VARCHAR2(15); BEGIN SELECT deptno,loc INTO v_deptno, v_loc FROM dept WHERE dname= 'SALES'; . . . END;

Querys que regresan una y solo una fila Las declaraciones SELECT dentro de un bloque de PL-SQL se encuentra en la clasificacin ANSI de SQL, la cual tiene un regla que indica: los querys deben regresar una y solamente una fila. Ms de una fila o ninguna fila genera un error. PL-SQL se ocupa de estos errores usando excepciones estndares, que se puede

declarar en la seccin de excepciones del bloque. Para este caso en particular se usan las excepciones de NO_DATA_FOUND y de TOO_MANY_ROWS. Para recuperar datos en PL-SQL hay que terminan cada declaracin de SQL con un (;). La clusula INTO se requiere para la declaracin de un SELECT en PL-SQL. Est clusula es opcional y se puede utilizar dicha clusula para especificar variables de entrada, constantes, literales, o expresiones de PL-SQL. El nmero de variables de salida en la clusula INTO debe ser el mismo que el de las columnas de la base de datos en la clusula SELECT. Hay que asegurarse de que estas correspondan y que sus tipos de datos son compatibles. Para asegurarse de que los tipos de datos de los identificadores son iguales a los tipos de datos de las columnas, utilice el atributo %TYPE. Se pueden usar funciones de grupo, como SUM, en una declaracin de SQL, ya que las funciones del grupo se aplican a los grupos de filas de una tabla.
DECLARE v_sum_sal emp.sal%TYPE; v_deptno NUMBER NOT NULL :=10; BEGIN SELECT SUM(sal) - funcin de grupo INTO v_sum_sal FROM emp WHERE deptno=v_deptno; END;

Las funciones de grupo no se pueden utilizar en PL-SQL. Se utilizan en la declaracin de SQL dentro de un bloque de PL-SQL. Manipulando datos usando PL-SQL Los datos se manipulan en la base de datos usando comandos de DML. Los comandos de DML son: o INSERT o UPDATE o DELETE Se pueden publicar los comandos de DML, sin la restriccin en PL-SQL. Incluyendo declaraciones de COMMIT o ROLLBACK en PL-SQL. 9. El comando INSERT agrega nuevas filas de datos a la tabla. 10. El comando UPDATE modifica filas existentes en la tabla. 11. El comando DELETE borra filas indeseadas de la tabla. Insertando datos Utilizando las funciones de SQL, como USER y SYSDATE.

Genera valores primarios usando secuencias de la base de datos. Deriva valores en el bloque PL-SQL. Agrega valores prefijados a la columna.

BEGIN INSERT INTO emp(empno,ename,job,deptno) VALUES(empno_sequence.NEXTVAL,'HARDING','CLERK',10) END;

No hay posibilidad de ambigedad con los identificadores y los nombres de la columna en la declaracin de INSERT. Cualquier identificador en la clusula del INSERT debe ser un nombre de la columna de la base de datos. Modificando y borrando datos Puede existir ambigedad en la clusula SET en la declaracin de la clusula UPDATE porque aunque el identificador a la izquierda del operador de asignacin es siempre una columna de la base de datos, el identificador a la derecha puede ser una columna de la base de datos o una variable de PL-SQL. La clusula WHERE se utiliza para determinar que filas sern afectadas. Si no se modifica ninguna fila, no ocurre ningn error, semejante a la declaracin SELECT en PL-SQL.

DECLARE v_sal_increase emp.sal%TYPE := 2000; BEGIN UPDATE emp SET sal = sal + v_sal_increase WHERE job = 'ANALYST'; END;

DECLARE v_deptno emp.deptno%TYPE := 10 BEGIN DELETE FROM emp WHERE deptno = v_deptno END;

Al asignar un valor a una variable en PL-SQL siempre se usa := y al asignar un valor a una columna en SQL siempre se usa =. El nombre de la columna y el nombre del identificador son idnticos en la clusula WHERE, el servidor Oracle busca primero el nombre en la base de datos. Para evitar la ambigedad en la clusula WHERE se usan ciertas reglas para distinguir los nombres de las columnas de la base de datos del nombre de las variables de PL-SQL. Las columnas y los identificadores de la base de datos deben tener nombres distintos. Los errores de sintaxis pueden presentarse porque PL-SQL comprueba en la base de datos primero para saber si hay una columna en la tabla.

ERROR DECLARE Ordedate ord.orderdate%TYPE; Shipdate ord.shipdate%TYPE; Ordid ord.ordid%TYPE := 601; BEGIN SELECT orderdate, shipdate INTO orderdate, shipdate FROM ord WHERE ordid = ordid; END;

PL-SQL comprueba si el identificador es una columna de la base de datos; si no, asume que se trata de un identificador de PL-SQL. No hay posibilidad de la ambigedad en la clusula SELECT porque cualquier identificador en la clusula SELECT debe ser un nombre de la columna de la base de datos. No hay posibilidad de la ambigedad en la clusula INTO porque los identificadores en la clusula INTO deben ser variables de PL-SQL. Solamente en la clusula WHERE existe la posibilidad de confusin.

You might also like