tipos salida procedimientos procedimiento parametros funciones entrada ejemplos ejecutar developer con bloques almacenado oracle stored-procedures plsql oracle-sqldeveloper sys-refcursor

salida - ¿Cómo puedo usar el desarrollador de Oracle SQL para ejecutar procedimientos almacenados?



procedure oracle ejemplos (5)

* EDIT6: * Esto es lo que terminó trabajando para mí (de la respuesta aceptada):

var ret1 number var tran_cnt number var msg_cnt number var rc refcursor exec :tran_cnt := 0 exec :msg_cnt := 123 exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc) print :tran_cnt print :msg_cnt print :rc

El desarrollador de SQL hace esto super-duro / imposible ?. No me importa si la utilidad está basada en la línea de comandos; Solo quiero poder correr y verlo rápidamente. Sería bueno si también capturara los errores. sería bueno poder iniciar sesión de forma gradual (interactiva), así como especificar todo a la vez (similar a cómo funciona un cliente típico basado en ftp / sftp cmd).

Mi plataforma es Windows Server 2008 + Cygwin.

EDITAR: ¿ Tal vez usted sabría cómo escribir esto usando Python?

EDIT 2: En el servidor MSFT SQL puedo simplemente escribir esto:

get_user 1;

luego resáltalo y pulsa F5, y obtengo:

login name NULL Somename

impreso en la ventana de salida. El desarrollador de Oracle SQL no ayuda con esto en absoluto. No estoy seguro de cómo pasar un 1, no estoy seguro de cómo ver las filas / registros reales que regresan.

EDIT3: Cuando escribo sólo var rc refcursor; y seleccionarlo y ejecutarlo, me sale este error (GUI):

An error was encountered performing the requested operation: ORA-00900: invalid SQL statement 00900.00000 - "invalid SQL statement" * Cause: * Action: Vendor code 900Error at Line: 2

EDIT4:

Estoy tratando de ejecutar un procedimiento cuya definición comienza así:

create or replace procedure get_account ( Vret_val out number, Vtran_count in out number, Vmessage_count in out number, Vaccount_id IN NUMBER , rc1 in out sys_refcursor )as begin ...

Me sale un error:

Error starting at line 2 in command: exec :rc := get_account(1) Error report: ORA-06550: line 1, column 24: PLS-00306: wrong number or types of arguments in call to ''GET_ACCOUNT'' ORA-06550: line 1, column 7: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:/n%s" *Cause: Usually a PL/SQL compilation error. *Action: rc ------

Estoy tan cerca ... por favor ayuda.

* EDITAR 5: *

Script que estoy ejecutando (funcionalmente el mismo), el error siempre fue el mismo:

var ret1 number var tran_cnt number var msg_cnt number var rc refcursor exec :tran_cnt := 0 exec :msg_cnt := 123 exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)

Salida de script (en F5) (Podría haber varios mensajes de varias ejecuciones):

Error report: ORA-06550: line 1, column 134: PLS-00201: identifier ''RC'' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:/n%s" *Cause: Usually a PL/SQL compilation error. *Action: anonymous block completed anonymous block completed Error starting at line 7 in command: exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc) Error report: ORA-06550: line 1, column 134: PLS-00201: identifier ''RC'' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:/n%s" *Cause: Usually a PL/SQL compilation error. *Action: anonymous block completed anonymous block completed Error starting at line 7 in command: exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc) Error report: ORA-06550: line 1, column 134: PLS-00201: identifier ''RC'' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:/n%s" *Cause: Usually a PL/SQL compilation error. *Action:

¿Por qué dice la línea 1, columna 134? Ninguna línea se extendió tan lejos ...


No estoy seguro de cómo ver las filas / registros reales que regresan.

Los procedimientos almacenados no devuelven registros. Pueden tener un cursor como parámetro de salida, que es un puntero a una instrucción de selección. Pero requiere una acción adicional para recuperar realmente las filas de ese cursor.

En SQL Developer, puede ejecutar un procedimiento que devuelve un cursor de referencia de la siguiente manera

var rc refcursor exec proc_name(:rc)

Después de eso, si ejecuta lo siguiente, mostrará los resultados del cursor:

print rc




Mi recomendación es TORA


No solo hay una manera de hacer esto, hay más de una manera de hacerlo (lo cual considero que no es muy Pythonic, sino que el desarrollador de SQL * está escrito en Java).

Tengo un procedimiento con esta firma: get_maxsal_by_dept( dno number, maxsal out number) .

Lo resalto en el SQL * Developer Object Navigator, invoco el menú del botón derecho y elegí Ejecutar . (Podría usar ctrl + F11 ). Esto genera una ventana emergente con un arnés de prueba. ( Nota: si el procedimiento almacenado reside en un paquete, deberá hacer clic derecho en el paquete, no en el ícono debajo del paquete que contiene el nombre del procedimiento; a continuación, seleccionará el sproc de la lista "Destino" del paquete cuando finalice la prueba aparece el arnés.) En este ejemplo, el arnés de prueba mostrará lo siguiente:

DECLARE DNO NUMBER; MAXSAL NUMBER; BEGIN DNO := NULL; GET_MAXSAL_BY_DEPT( DNO => DNO, MAXSAL => MAXSAL ); DBMS_OUTPUT.PUT_LINE(''MAXSAL = '' || MAXSAL); END;

Configuré la variable DNO en 50 y presioné OK. En el panel Ejecutar - Registro (esquina inferior derecha a menos que lo haya cerrado / movido / escondido) puedo ver el siguiente resultado:

Connecting to the database apc. MAXSAL = 4500 Process exited. Disconnecting from the database apc.

Para ser justos, el corredor es menos amigable para las funciones que devuelven un Cursor de referencia, como este: get_emps_by_dept (dno number) return sys_refcursor .

DECLARE DNO NUMBER; v_Return sys_refcursor; BEGIN DNO := 50; v_Return := GET_EMPS_BY_DEPT( DNO => DNO ); -- Modify the code to output the variable -- DBMS_OUTPUT.PUT_LINE(''v_Return = '' || v_Return); END;

Sin embargo, al menos ofrece la posibilidad de guardar cualquier cambio en el archivo, por lo que podemos conservar nuestra inversión para ajustar el arnés ...

DECLARE DNO NUMBER; v_Return sys_refcursor; v_rec emp%rowtype; BEGIN DNO := 50; v_Return := GET_EMPS_BY_DEPT( DNO => DNO ); loop fetch v_Return into v_rec; exit when v_Return%notfound; DBMS_OUTPUT.PUT_LINE(''name = '' || v_rec.ename); end loop; END;

La salida desde la misma ubicación:

Connecting to the database apc. name = TRICHLER name = VERREYNNE name = FEUERSTEIN name = PODER Process exited. Disconnecting from the database apc.

Alternativamente, podemos usar los antiguos comandos de PLUS de SQL en la hoja de trabajo del Desarrollador de SQL :

var rc refcursor exec :rc := get_emps_by_dept(30) print rc

En ese caso, la salida aparece en el panel Salida de secuencia de comandos (la ubicación predeterminada es la pestaña a la derecha de la pestaña Resultados ).

Las versiones más tempranas del IDE no eran compatibles con SQL * Plus. Sin embargo, todos los comandos anteriores han sido soportados desde 1.2.1. Consulte la matriz en la documentación en línea para obtener más información.

"Cuando var rc refcursor; simplemente var rc refcursor; selecciono y lo ejecuto, var rc refcursor; este error (GUI):"

Hay una característica, o un error, en la forma en que la hoja de trabajo interpreta los comandos de SQL Plus. Se supone que los comandos de SQL Plus son parte de un script. Entonces, si ingresamos una línea de SQL * Plus, digamos var rc refcursor y var rc refcursor clic en Execute Statement var rc refcursor (o F9 ) la hoja de trabajo arroja ORA-900 porque no es una instrucción ejecutable, es decir, no es SQL. Lo que debemos hacer es hacer clic en Run Script (o F5 ), incluso para una sola línea de SQL * Plus.

"Estoy tan cerca ... por favor ayuda".

Su programa es un procedimiento con una firma de cinco parámetros obligatorios. Recibes un error porque lo llamas como una función y solo con un parámetro:

exec :rc := get_account(1)

Lo que necesitas es algo como lo siguiente. He usado la notación nombrada para mayor claridad.

var ret1 number var tran_cnt number var msg_cnt number var rc refcursor exec :tran_cnt := 0 exec :msg_cnt := 123 exec get_account (Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc ) print tran_count print rc

Es decir, necesita una variable para cada parámetro OUT o IN OUT. Los parámetros IN se pueden pasar como literales. Las dos primeras sentencias EXEC asignan valores a un par de los parámetros IN OUT. El tercer EXEC llama al procedimiento. Los procedimientos no devuelven un valor (a diferencia de las funciones), por lo que no usamos una sintaxis de asignación. Por último, este script muestra el valor de un par de las variables asignadas a los parámetros OUT.