parametros - procedimientos y funciones oracle pl/sql
Llamar a un procedimiento almacenado con otro en Oracle (5)
¿Alguien sabe de alguna manera, o incluso si es posible, para llamar a un procedimiento almacenado desde dentro de otro? Si es así, ¿cómo lo harías?
Aquí está mi código de prueba:
SET SERVEROUTPUT ON;
DROP PROCEDURE test_sp_1;
DROP PROCEDURE test_sp;
CREATE PROCEDURE test_sp
AS
BEGIN
DBMS_OUTPUT.PUT_LINE(''Test works'');
END;
/
CREATE PROCEDURE test_sp_1
AS
BEGIN
DBMS_OUTPUT.PUT_LINE(''Testing'');
test_sp;
END;
/
CALL test_sp_1;
@Michael Lockwood: no es necesario que use la palabra clave "CALL" en ningún lugar. Solo necesita mencionar el procedimiento directamente.
Es decir
Begin
proc1(input1, input2);
end;
/
en lugar de
Begin
call proc1(input1, input2);
end;
/
Claro, solo lo llamas desde el SP, no hay sintaxis especial.
Ex:
PROCEDURE some_sp
AS
BEGIN
some_other_sp(''parm1'', 10, 20.42);
END;
Si el procedimiento está en un esquema diferente al que está en el procedimiento de ejecución, debe prefijarlo con el nombre del esquema.
PROCEDURE some_sp
AS
BEGIN
other_schema.some_other_sp(''parm1'', 10, 20.42);
END;
Llamar a un procedimiento de otro procedimiento:
Uno para un procedimiento normal:
CREATE OR REPLACE SP_1() AS
BEGIN
/* BODY */
END SP_1;
Procedimiento de llamada SP_1 desde SP_2:
CREATE OR REPLACE SP_2() AS
BEGIN
/* CALL PROCEDURE SP_1 */
SP_1();
END SP_2;
Llame a un procedimiento con REFCURSOR o cursor de salida:
CREATE OR REPLACE SP_1
(
oCurSp1 OUT SYS_REFCURSOR
) AS
BEGIN
/*BODY */
END SP_1;
Llame al procedimiento SP_1 que devolverá el REFCURSOR como parámetro de salida
CREATE OR REPLACE SP_2
(
oCurSp2 OUT SYS_REFCURSOR
) AS `enter code here`
BEGIN
/* CALL PROCEDURE SP_1 WITH REF CURSOR AS OUTPUT PARAMETER */
SP_1(oCurSp2);
END SP_2;
Para invocar el procedimiento desde la línea de comandos SQLPlus, pruebe uno de estos:
CALL test_sp_1();
EXEC test_sp_1
Sus procedimientos almacenados funcionan como codificados. El problema es con la última línea, no puede invocar ninguno de sus procedimientos almacenados.
Tres opciones en SQL * Plus son: call
, exec
y un bloque PL / SQL anónimo.
call
parece ser una palabra clave SQL, y está documentada en la Referencia SQL. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG El diagrama de sintaxis indica que se requieren parentesis, incluso cuando no se pasan argumentos a la rutina de llamada.
CALL test_sp_1();
Un bloque PL / SQL anónimo es PL / SQL que no está dentro de un procedimiento, función, disparador, etc. nombrado. Se puede usar para llamar a su procedimiento.
BEGIN
test_sp_1;
END;
/
Exec
es un comando SQL * Plus que es un atajo para el bloque anónimo anterior. EXEC <procedure_name>
pasará al servidor de BEGIN <procedure_name>; END;
datos como BEGIN <procedure_name>; END;
BEGIN <procedure_name>; END;
Ejemplo completo:
SQL> SET SERVEROUTPUT ON
SQL> CREATE OR REPLACE PROCEDURE test_sp
2 AS
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(''Test works'');
5 END;
6 /
Procedure created.
SQL> CREATE OR REPLACE PROCEDURE test_sp_1
2 AS
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(''Testing'');
5 test_sp;
6 END;
7 /
Procedure created.
SQL> CALL test_sp_1();
Testing
Test works
Call completed.
SQL> exec test_sp_1
Testing
Test works
PL/SQL procedure successfully completed.
SQL> begin
2 test_sp_1;
3 end;
4 /
Testing
Test works
PL/SQL procedure successfully completed.
SQL>