salida procedimientos procedimiento parametros funciones entrada ejemplos ejecutar developer con como almacenado sql oracle stored-procedures

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>