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
¿Has oído hablar de "SQuirreL SQL Client"?
Hay dos posibilidades, ambas de Quest Software, TOAD y SQL Navigator:
Aquí está la descarga del software gratuito TOAD: http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx
Y el navegador de SQL (versión de prueba): http://www.quest.com/sql-navigator/software-downloads.aspx
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;
simplementevar 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.