Sie sind auf Seite 1von 4

Funciones y Procedimientos almacenados

Los procedimientos o funciones son bloques PL/SQL con nombre, que pueden recibir parmetros y pueden ser invocados desde distintos entornos: SQL*PLUS, Oracle*Forms, desde otros procedimientos y funciones y desde otras herramientas Oracle y aplicaciones. Los procedimientos y funciones llevan a cabo tareas especficas, y su mayor diferencia radica en que las funciones devuelven un valor.

Sintaxis Procedimientos
CREATE [OR REPLACE} PROCEDURE [esquema].nombre-procedimiento (nombre-parmetro {IN | OUT | IN OUT} tipo de dato, ..) {IS | AS} Declaracin de variables; Declaracin de constantes; Declaracin de cursores; BEGIN Cuerpo del subprograma PL/SQL; EXCEPTION Bloque de excepciones PL/SQL; END; Descripcin de la sintaxis: Nombre-parmetro: es el nombre que queramos dar al parmetro. Podemos utilizar mltiples parmetros. En caso de no necesitarlos, podemos omitir los parntesis. IN: especifica que el parmetro es de entrada y que por tanto dicho parmetro tiene que tener un valor en el momento de llamar a la funcin o procedimiento. Si no se especifica nada, los parmetros son por defecto de tipo entrada. OUT: especifica que se trata de un parmetro de salida. Son parmetros cuyo valor es devuelto despus de la ejecucin el procedimiento al bloque PL/SQL que lo llam. Las funciones PLSQL no admiten parmetros de salida. IN OUT: Son parmetros de entrada y salida a la vez. Tipo-de-dato: Indica el tipo de dato PLSQL que corresponde al parmetro (NUMBER, VARCHAR2, etc). Ejemplo de creacin de un procedimiento:
CREATE OR REPLACE PROCEDURE contratar_empleado (w_codigo_emp IN emp.empno%TYPE, w_depart IN emp.deptno%TYPE, w_fecha_alta IN emp.hiredate%TYPE) AS BEGIN INSERT INTO EMP(empno, hiredate, deptno) VALUES (w_codigo_emp, w_fecha_alta, w_depart); COMMIT; END contratar_empleado;

SHOW ERRORS

En este procedimiento se ha definido el tipo de dato de los parmetros de entrada como del mismo tipo que los campos de la tabla emp , es decir: nombreParametro IN nombreTabla.nombreColumna%TYPE. Sera equivalente a poner:
w_codigo_emp number, w_depart varchar..

El comando SHOW ERRORS es muy til al crear un Objeto PL/SQL ya sea Procedure, Funcion o Trigger nos permite visualizar el tipo de error que tenemos al compilar y la lnea de cdigo donde existe el problema.

Llamadas a procedimientos Desde otro procedimiento, funcin y triggers


CREATE PROCEDURE proceso ... IS ... BEGIN ...

/* llamada al procedimiento contratar_empleado */


contratar_empleado (2645,30 ,'19/12/1999'); END;

Herramientas de desarrollo de aplicaciones de Oracle: SQL*Plus, SQL*Dba, SQL*Forms, SQL*Menu, SQL*ReportWriter, etc.
EXECUTE contratar_empleado (2645,30 ,'19/12/1999');

Sintaxis Funciones
CREATE [OR REPLACE] FUNCTION [esquema].nombre-funcin (nombre-parmetro {IN | OUT | IN OUT} tipo-de-dato, ...) RETURN tipo-de-dato {IS | AS} Declaracin de variables; Declaracin de constantes; Declaracin de cursores; BEGIN Cuerpo del subprograma PL/SQL; EXCEPTION Bloque de excepciones PL/SQL; END; Ejemplo de creacin de una funcin:
CREATE OR REPLACE FUNCTION obtener_salario (w_codigo_emp IN emp.empno%TYPE) RETURN NUMBER IS w_salario emp.sal%TYPE; BEGIN SELECT sal INTO w_salario FROM emp WHERE empno = w_codigo_emp; RETURN w_salario; END obtener_salario; show errors

Cada funcin debe devolver un valor del tipo especificado utilizando la sentencia RETURN. Llamadas a funciones Desde otro procedimiento, funcin y triggers
CREATE PROCEDURE proceso ... IS ... BEGIN ... w_sal :=obtener_salario (w_codigo); END;

/* llamada a la funcin obtener_salario */

Desde un bloque annimo


BEGIN END;

DBMS_OUTPUT.PUT_LINE('Salario cod_emp 7369 '||obtener_salario(7369));

Desde una instruccin SQL


SELECT empno, ename, obtener_salario(7369) salario_emp_7369 FROM emp;

Documentacin procedimientos y funciones


Para obtener los nombres de todos los procedimientos y funciones se puede consultar la VISTA USER_OBJECTS
SELECT object_name, object_type FROM USER_OBJECTS WHERE object_type IN ('PROCEDURE', 'FUNCTION');

Para obtener el texto de un procedimiento o funcin almacenado se puede consultar la VISTA USER_SOURCE
SELECT text FROM USER_SOURCE WHERE type = 'PROCEDURE' AND name = 'CONTRATAR_EMPLEADO';

Depuracin de procedimientos y funciones Para visualizar los errores de compilacin se puede consultar la VISTA USER_ERRORS o el comando SHOW ERRORS.

Se pueden visualizar valores o mensajes desde un procedimiento o funcin, invocando al package standard DBMS_OUPUT.

Es necesario activar SERVEROUTPUT (SET SERVEROUTPUT ON) para ver las salidas desde procedimientos o funciones almacenados.

PAQUETES ORACLE
A veces es necesario distribuir nuestros procesos en paquetes para dar una mejor estructura al proyecto en el que estamos trabajando, para empezar un paquete tiene dos niveles (Declaracin y Cuerpo), en la declaracin solo declaramos los procedimientos con sus parmetros, y en el cuerpo desarrollamos el cdigo de nuestros procedimientos. (Para ms informacin consultar documentacin de ORACLE) Ahora vamos con nuestro ejemplo: CREATE OR REPLACE PACKAGE "OPERACIONES_BASICAS" AS PROCEDURE SUMAR(A NUMBER,B NUMBER); PROCEDURE RESTAR(A NUMBER,B NUMBER); END OPERACIONES_BASICAS; / Con el codigo anterior construimos el nivel declarativo de nuestro paquete, solo falta crear nuestro nivel cuerpo para completar nuestro paquete CREATE OR REPLACE PACKAGE BODY "OPERACIONES_BASICAS" AS PROCEDURE SUMAR(A NUMBER,B NUMBER) AS

RESULTADO NUMBER(10); BEGIN RESULTADO := A + B; END SUMAR; PROCEDURE RESTAR(A NUMBER,B NUMBER) AS RESULTADO NUMBER(10); BEGIN RESULTADO := A - B; END RESTAR; END OPERACIONES_BASICAS; / Con el cdigo anterior tenemos nuestro paquete creado, ahora veremos como llamar a los procedimientos dentro de dicho paquete: >>OPERACIONES_BASICAS.SUMAR(11,3); >>OPERACIONES_BASICAS.RESTAR(11,3);

Das könnte Ihnen auch gefallen