Introducción a Oracle PL/SQL
PL/SQL significa Procedural Language/Structured Query Language. Es un lenguaje de programación incluido dentro de la base de datos. Los procedimientos, funciones, disparadores y paquetes creados con el PL/SQL se almacenan en base de datos. Están incluidos dentro de las políticas de seguridad de Oracle y son altamente recomendables, para el tratamiento de datos.
El PL/SQL surge ante la necesidad de ampliar las posibilidades del SQL, ya que es un lenguaje de consulta y no un lenguaje de programación.
La ventaja respecto a otros lenguajes, para trabajar con una base de datos, es poder trabajar directamente en el servidor de base de datos. Es un lenguaje de programación concebido por y para Oracle.
Con PL/SQL vamos a poder crear:
- Procedimientos
- Funciones
- Triggers
- Paquetes
- Bloques PL/SQL
Algunas pinceladas de las características del lenguaje PL/SQL serían:
- Utilización de constantes, variables y tipos (tanto predefinidos, como definidos por el usuario)
- Estructuras de control: bucles, ordenes condicionadas
- Paquetes, procedimientos, funciones, bloques PL/SQL
- Funciones predefinidas: aritméticas, lógicas, relacionales, …
- Cursores
- Tratamiento de excepciones
- Posibilidad de utilización de comentarios
El lenguaje PL/SQL no distingue de mayúscula de minúscula.
Los comentarios monolínea van precedidos de «–» y los comentarios multilíneas estarían entre «/*» y «*/».
VARIABLES Y CONSTANTES
La declaración de variables tiene el formato siguiente:
Nombre_variable tipo_dato [NOT NULL] [ :=valor];
La declaración de constantes tiene el formato siguiente:
Nombre_constante CONSTANT tipo_dato :=valor;
Siendo tipo_dato: tipo de datos soportados por Oracle como: NUMBER, DATE, CHAR, VARCHAR VARCHAR2, BOOLEAN, …
BLOQUE PL/SQL
Elementos de un bloque serían:
- Declaraciones (opcional): Es donde se declaran las constantes, variables y cursores, que se utilizarán en el bloque.
- Instrucciones (obligatorio): Contiene las sentencias a ejecutar
- Excepciones (opcional): Desde este elemento se puede capturar las excepciones del sistema o lanzada por el propio usuario
BLOQUE PL/SQL NO ALMACENADO:
[ DECLARE | IS / AS ] BEGIN [ EXCEPTION ] END
PROCEDIMIENTO:
CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [nombre_parametro modo tipodatos_parametro ] IS | AS BEGIN [ EXCEPTION ] END
FUNCIÓN:
CREATE [OR REPLACE] FUNCTION nombre_función [nombre_parámetro modo tipodatos_parametro ] RETURN tipodatos_retorno IS | AS BEGIN [ EXCEPTION ] END
TRIGGER:
CREATE [OR REPLACE] TRIGGER nombre_trigger momento_ejecución evento [evento] ON nombre_tabla [REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN condición] BEGIN [ EXCEPTION ] END
Ejemplo procedimiento:
DECLARE /* Declaración de la variable donde se recogerá el valor de la fecha actual */ fecha DATE; /* Declaración genérica de error no controlado por el sistema */ error_generico CONSTANT VARCHAR2(10):= 'Error descontrolado'; BEGIN /* Parte de ejecución */ SELECT SYSDATE INTO fecha -- Recoge la fecha actual y la asigna a la variable fecha FROM DUAL; dbms_output.put_line('La fecha actual es: '||fecha); EXCEPTION -- tratamiento de excepciones WHEN OTHERS THEN -- Captura las excepciones generadas por el sistema dbms_output.put_line(error_generico); -- Muestra el error declarado previamente como constante END; /
CURSORES
Son elementos, para poder gestionar los valores devueltos por una consulta a la base de datos.
Se pueden distinguir dos tipos:
- Cursores implícitos: Se utilizan, cuando una consulta devuelve un registro
- Cursores explícitos: Son controlados por el programador y suelen ser más eficientes
Ejemplo cursor implícito:
declare vprovincia VARCHAR2(50); begin SELECT DESCRIPCION INTO vprovincia FROM PROVINCIAS WHERE CO_PROVINCIA = '47'; dbms_output.put_line('La provincia es: ' || vprovincia); end; /
Salida:
La provincia es: Valladolid
Ejemplo cursor explicito:
DECLARE CURSOR cprovincias IS SELECT CO_PROVINCIA, DESCRIPCION FROM PROVINCIAS; CO_PROVINCIA VARCHAR2(3); descripcion VARCHAR2(50); BEGIN OPEN cprovincias; FETCH cprovincias INTO CO_PROVINCIA,descripcion; WHILE cprovincias %found LOOP dbms_output.put_line(descripcion); FETCH cprovincias INTO CO_PROVINCIA,descripcion; END LOOP; CLOSE cprovincias; END; /
También podría ser:
BEGIN FOR REG IN (SELECT * FROM PROVINCIAS) LOOP dbms_output.put_line(reg.descripcion); END LOOP; END; /
EXCEPCIONES
Para controlar los errores, que se genera en la aplicación se utilizan las excepciones. Estas pueden ser personalizadas o del sistema.
Para lanzar una excepción se lanzaría de la siguiente manera:
RAISE_APPLICATION_ERROR(<error_num>,);
El número de error personalizado estaría en el rango del -20001 al -20999.
Ejemplo captura de excepción del manual junto a excepción genérica:
CREATE OR REPLACE PROCEDURE comprobar_negativo (valor NUMBER) AS VALOR_ERRONEO EXCEPTION; BEGIN IF valor < 0 THEN RAISE VALOR_ERRONEO; END IF; dbms_output.put_line('Correcto: '||valor||' es >= 0'); EXCEPTION WHEN VALOR_ERRONEO THEN -- Captura de error usuario dbms_output.put_line('ERROR: Valor negativo'); WHEN OTHERS THEN -- Captura error genérico err_num := SQLCODE; err_msg := SQLERRM; dbms_output.put_line('Error:'||TO_CHAR(err_num)); dbms_output.put_line(err_msg); END; /
TRANSACCIONES
Las transacciones son un conjuntos de operaciones en la base de datos, que se tratan como una unidad. Se realizan todas o se descartan todas. Para confirmar las transacciones pendientes se utiliza la sentencia COMMIT y para deshacer las transacciones pendientes se realizaría con ROLLBACK.
Ejemplo de manejo de transacciones:
DECLARE vValor NUMBER := 100; vOrigen VARCHAR2(1) :='A'; vDestino VARCHAR2(1) := 'B'; BEGIN UPDATE tabla SET valor = vValor WHERE origen = vOrigen; INSERT INTO tabla2 (Origen, Destino, valor, FECHA) VALUES (vOrigen, vDestino, vValor, SYSDATE); COMMIT; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Error en la transaccion:'||SQLERRM); dbms_output.put_line('Se deshacen las modificaciones); ROLLBACK; END; /
Comments are closed.