Está en la página 1de 10

Procedimiento

Un procedimiento es un subprograma que ejecuta una acción especifica y que no devuelve ningún
valor. Un procedimiento tiene un nombre, un conjunto de parámetros (opcional) y un bloque de
código. La sintaxis de un procedimiento almacenado es la siguiente:

CREATE [OR REPLACE]


PROCEDURE <procedure_name> [(<param1> [IN|OUT|IN OUT] <type>,
<param2> [IN|OUT|IN OUT] <type>,
...)]
IS
-- Declaración de variables locales
BEGIN
-- Sentencias
[EXCEPTION]
-- Sentencias control de excepción
END [<procedure_name>];
El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el
procedimiento existe, se producirá un error. La sintaxis es muy parecida a la de un bloque anónimo,
salvo porque se reemplaza la sección DECLARE por la secuencia PROCEDURE … IS y en la
especificación del procedimiento debemos especificar el tipo de datos de cada parámetro. Al
especificar el tipo de dato del parámetro no debemos especificar la longitud del tipo. Los parámetros
pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT). El valor por defecto es IN,
y se toma ese valor en caso de que no especifiquemos nada.

CREATE OR REPLACE
PROCEDURE Actualiza_Saldo(cuenta NUMBER,
new_saldo NUMBER)
IS
-- Declaración de variables locales
BEGIN
-- Sentencias
UPDATE SALDOS_CUENTAS
SET SALDO = new_saldo,
FX_ACTUALIZACION = SYSDATE
WHERE CO_CUENTA = cuenta;
END Actualiza_Saldo;
Ejemplo de creación de un procedimiento CREATE OR REPLACE PROCEDURE

contratar_empleado (w_codigo_emp IN emp.codigo_emp%TYPE, w_depart

IN emp.cod_depart%TYPE, w_fecha_alta IN emp.fecha_alta%TYPE)

IS BEGIN INSERT INTO emp(código_emp, fecha_alta, cod_depart) VALUES (w_código_emp,


w_fecha_alta, w_depart);

END contratar_empleado;

En este procedimiento se ha definido el tipo de dato de los parámetros de entrada como del
mismo tipo que los campos de la tabla “emp” , es decir:

nombreParametro IN nombreTabla.nombreColumna%TYPE. Sería equivalente a poner:


w_codigo_emp number, w_depart varchar..

Procedimientos[editar]
Los procedimientos tienen la utilidad de fomentar la reutilización de programas que se
usan comúnmente. Una vez compilado, queda almacenado en la base de datos (por
eso es también llamado 'Procedimiento almacenado') y puede ser utilizado por
múltiples aplicaciones.
La sintaxis es la siguiente

CREATE [OR REPLACE] PROCEDURE nombre_procedimiento


[nombre_parametro modo tipodatos_parametro ]
IS | AS
bloque de código

Donde "modo" puede contener los valores IN, OUT, IN OUT. Por defecto tiene el valor
IN si no se pone nada. IN indica que el parámetro es de entrada y no se podrá
modificar. OUT indica que el parámetro es de salida con lo que el procedimiento
devolverá un valor en él. IN OUT indica que el parámetro es de entrada/salida. Con lo
que al llamar al procedimiento se le dará un valor que luego podrá ser modificado por
el procedimiento y devolver este nuevo valor.
"tipodatos_parametro indica el tipo de datos que tendrá el parámetro según lo indicado
en Tipos de datos Oracle/PLSQL
Para borrar un procedimiento almacenado de la base de datos

DROP PROCEDURE nombre_procedimiento

Para utilizar un procedimiento almacenado de la base de datos


Simplemente se lo llama desde un bloque anónimo (desde la línea de comandos),
previamente habiendo inicializado el/los parametro/s (en caso que existan).

DECLARE
nombre_parametro tipodatos_parametro;

BEGIN
nombre_parametro tipodatos_parametro :=
valor_de_inicializacion;
nombre_procedimiento (nombre_parametro =>
nombre_parametro);
END;
/

 PROCEDIMIENTOS:

Los procedimientos PL/SQL son muy parecidos a otros procedimientos en otros lenguajes de
programación.

Ejemplo de inserción de un registro compuesto por un número entero dado y una cadena, (i,
‘xxx’):

1 CREATE TABLE T2 (

2 a INTEGER,

3 b CHAR(10)

4 );

6 CREATE PROCEDURE addtuple1(i IN NUMBER) AS

7 BEGIN

8 INSERT INTO T2 VALUES(i, 'xxx');

9 END addtuple1;

10 .

11 run;
Un procedimiento se indica mediante las palabras clave CREATE PROCEDURE seguido del
nombre y sus parámetros. Opcinal es continuarlo de CREATE seguido de OR REPLACE. Esto
permitirá crear o reemplazar el procedimiento, si existe previamente, sin advertencias.

Puede haber un número ilimitado de parámetros, seguidos de un modo y un tipo. Los modos
posibles son:

 IN: Solo lectura.

 OUT: Solo escritura.

 INOUT: Lectura y escritura.

NOTA: A diferencia del tipo especificado en la declaración de una variable PL/SQL, el tipo especificado en la decla

NO puede tener restricciones. Por ejemplo, VARCHAR(10) o CHAR(2) NO son válidos; deberían usarse los tipos CH

lugar. La longitud depende del parámetro que se pase cuando el procedimiento es invocado.

A continuación de los argumentos, se debe usar la palabra clave AS (IS es un sinónimo). A


continuación va el cuerpo, esencial en un bloque PL/SQL. Hemos repetido al final el nombre
del procedimiento tras el END, pero esto es opcional.

La sección de declaración, NO debe empezar con la palabra clave DECLARE. En su lugar,


usamos AS.

El “run;” tras un procedimiento, no lo ejecuta, sino que tan sólo ejecuta la sentencia que crea el
procedimiento. Para ejecutar el procedimiento hay que usar otra sentencia PL/SQL, en la que el
procedimiento es invocado como una sentencia de ejecución.

Ejemplo 1:

1 /* -- El siguiente procedimiento inserta una tupla en T2, pero toma ambos componentes como

2 argumentos -- */

3 CREATE PROCEDURE addtuple2(x T2.a%TYPE, y T2.b%TYPE) AS

4 BEGIN

5 INSERT INTO T2(a, b)

6 VALUES(x, y);

7 END addtuple2;
.
8
run;
9

10
/* -- Ahora añade el registro (10, 'abc') a T2: -- */
11
BEGIN
12
addtuple2(10, 'abc');
13
END;
14
.
15
run;
Ejemplo 2: Con parámetro OUT.

1 /* -- Creamos la tabla con SQL -- */

2 CREATE TABLE T3 (a INTEGER,

3 b INTEGER);

5 /* -- Procedimiento -- */

6 CREATE PROCEDURE addtuple3(a NUMBER, b OUT NUMBER) AS

7 BEGIN

8 b := 4;

9 INSERT INTO T3 VALUES(a, b);

10 END;

11 .

12 run;

13

14 /* -- Invocación al procedimiento -- */

15 DECLARE

16 v NUMBER;

17 BEGIN

18 addtuple3(10, v);
19 END;

20 .

21 run;

NOTA: Cuando usemos OUT o INOUT, no se puede usar una constante, ya que su valor

cambiará.

Un procedimiento [almacenado] es un subprograma que ejecuta una acción


específica y que no devuelve ningún valor por si mismo, como sucede con las
funciones. Un procedimiento tiene un nombre, un conjunto de parámetros
(opcional) y un bloque de código. Para crear un procedimiento (stored procedure:
procedimiento almacenado) usaremos la siguiente sintaxis:
CREATE {OR REPLACE} PROCEDURE nombre_proc( param1 [IN | OUT | IN OUT] tipo,...
)
IS
-- Declaración de variables locales
BEGIN
-- Instrucciones de ejecución
[EXCEPTION]
-- Instrucciones de excepción
END;

Tras crear el procedimiento, éste se compila y luego se almacena en la BD de


forma compilada. Este procedimiento luego puede ser invocado desde
cualquier bloque PL/SQL.

El uso de OR REPLACE permite sobrescribir un procedimiento existente. Si se


omite, y el procedimiento existe, se producirá, un error. Debemos especificar el
tipo de datos de cada parámetro.

Al especificar el tipo de dato del parámetro no debemos especificar la longitud


del tipo, aunque si puede ser utilizando el operador %TYPE.

CREATE OR REPLACE
PROCEDURE Actualiza_Saldo(cuenta NUMBER, new_saldo NUMBER)
IS
-- Declaracion de variables locales
BEGIN
UPDATE SALDOS_CUENTAS
SET SALDO = new_saldo,
FX_ACTUALIZACION = SYSDATE
WHERE CO_CUENTA = cuenta;
END Actualiza_Saldo;
También podemos asignar un valor por defecto a los parámetros, utilizando la
cláusula DEFAULT o el operador de asignación (:=).

CREATE OR REPLACE
PROCEDURE Actualiza_Saldo(cuenta NUMBER, new_saldo NUMBER DEFAULT 10)

Una vez creado y compilado el procedimiento almacenado podemos ejecutarlo.


Existen dos formas de pasar argumentos a un procedimiento almacenado a la
hora de ejecutarlo. Estas son:

Notación posicional

Se pasan los valores de los parámetros en el mismo orden en que el procedure los
define.
BEGIN
Actualiza_Saldo(200501,2500);
COMMIT;
END;
Notación nominal

Se pasan los valores en cualquier orden nombrando explícitamente el parámetro


y su valor separados por el símbolo =>.
BEGIN
Actualiza_Saldo(cuenta => 200501,new_saldo => 2500);
COMMIT;
END;

Ejemplos:
CREATE OR REPLACE PROCEDURE today_is AS
BEGIN
DBMS_OUTPUT.PUT_LINE( 'Hoy es ' || TO_CHAR(SYSDATE, ' DD/MM/YYYY') );
END today_is;

-- para ejecutarlo
SET SERVEROUTPUT ON;
BEGIN
today_is(); -- the parentheses are optional here
END;
CREATE OR REPLACE PROCEDURE today2_is ( fecha DATE ) AS
BEGIN
DBMS_OUTPUT.PUT_LINE( 'Hoy es ' || TO_CHAR(fecha, ' DD/MM/YYYY') );
END;

-- para ejecutarlo
SET SERVEROUTPUT ON;
BEGIN
today2_is(to_date('01/02/2008')); -- the parentheses are optional here
END;

-- para ejecutarlo
SET SERVEROUTPUT ON;
BEGIN
today2_is(fecha => to_date('01/02/2008')); -- the parentheses are optional
here
END;

Procedimientos y funciones PL/SQL


Los procedimientos y funciones quedan almacenados en la base de
datos a diferencia de los bloques anónimos que se almacenaban en el
buffer.

Nota: Al quedar los bloques anónimos almacenados en el buffer, a no ser que se


guardasen en ficheros, se perderían al limpiar el buffer, cosa que no ocurre con los
procedimientos y funciones, que se almacenan en la propia base de datos.

Otra cosa que nos diferencia los bloques anónimos de los


procedimientos o funciones es que en los procedimientos o funciones no
se pueden utilizar variables de sustitución.

En cuanto a su construcción es la dada en el


articulo Características de PL/SQL segunda parte añadiendo al
principio la siguiente secuencia “CREATE OR REPLACE” para
crearlo, o modificarlo si ya existe.

Pasamos a escribir un procedimiento que nos muestre los datos de


un usuario:

CREATE OR REPLACE PROCEDURE ver_usuario(nomusu VARCHAR2)


IS
NIFusu VARCHAR2(10);
Domusu VARCHAR2(10);
BEGIN
select nif, domicilio into NIFusu,Domusu from usuario where
nombre=nomusu;
DBMS_OUTPUT.PUT_LINE('Nombre:'||nomusu|| 'NIF:' ||NIFusu|| 'Domicilio'
||Domusu);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hemos encontrado al usuario || nomusu);
END;
/
Si el compilador detecta errores nos saldrá un mensaje como este:
“Procedimiento creado con errores de compilación”. Para ver estos
errores tenemos la orden SHOW ERRORS.

Al tener almacenado el procedimiento en la base de datos, este


puede ser llamado por cualquier usuario que tenga los permisos
oportunos. Para invocar un procedimiento utilizamos la orden
EXECUTE

Para invocar al procedimiento que hemos creado antes tendríamos


que ejecutar la siguiente orden:

EXECUTE ver_usuario('Luis');

Pero también podemos invocarlo desde un bloque PL/SQL de ls


siguiente forma:

BEGIN
ver_usuario('Luis');
END;
.
Como en cualquier lenguaje, podemos agregar comentarios a
nuestros procedimientos de la siguiente forma:

- - para comentar en una sola linea


/* <comentario>*/ para varias lineas.

También podría gustarte