Estoy tratando de ejecutar un procedimiento almacenado que tiene múltiples parámetros de entrada y salida. El procedimiento solo se puede ver en mi panel Conexiones navegando Otros usuarios | | Paquetes | |
Si hago clic con el botón derecho, los elementos del menú son "Ordenar miembros por ..." y "Crear prueba de unidad" (atenuados). La capacidad de "Ejecutar" el procedimiento no parece posible cuando el usuario accede a él.
He estado tratando de encontrar un ejemplo de cómo crear un bloque anónimo para poder ejecutar el procedimiento como un archivo SQL, pero no he encontrado nada que funcione.
¿Alguien sabe cómo puedo ejecutar este procedimiento desde SQL Developer? Estoy usando la versión 2.1.1.64.
¡Gracias por adelantado!
EDITAR 1:
El procedimiento al que quiero llamar tiene esta firma:
user.package.procedure(
p_1 IN NUMBER,
p_2 IN NUMBER,
p_3 OUT VARCHAR2,
p_4 OUT VARCHAR2,
p_5 OUT VARCHAR2,
p_6 OUT NUMBER)
Si escribo mi bloque anónimo así:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;
Me sale el error:
Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed
Intenté inicializar las variables out *:
out1 VARCHAR2(100) := '';
pero obtienes el mismo error:
EDITAR 2:
Según la respuesta de Alex, intenté quitar los dos puntos de delante de los parámetros y obtuve esto:
Error starting at line 1 in command:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:
:= . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
execute
; en PL / SQL que se interpreta como el inicio deexecute immediate
, que es diferente a SQLexecute
.execute
. Eldeclare
debe haber antes de labegin
. Lo que creo que @OMG quiso decir es que puede declarar las variables en SQL Developer antes del bloque anónimo con lavariable
palabra clave, y luego usar la:out1
sintaxis como la tenía originalmente, en cuyo caso no tiene unadeclare
sección en absoluto. Pero estás mezclando los dos de tu último comentario.Respuestas:
Con tipos de parámetros simples (es decir, no cursores de referencia, etc.) puede hacer algo como esto:
SET serveroutput on; DECLARE InParam1 number; InParam2 number; OutParam1 varchar2(100); OutParam2 varchar2(100); OutParam3 varchar2(100); OutParam4 number; BEGIN /* Assign values to IN parameters */ InParam1 := 33; InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(InParam1, InParam2, OutParam1, OutParam2, OutParam3, OutParam4); /* Display OUT parameters */ dbms_output.put_line('OutParam1: ' || OutParam1); dbms_output.put_line('OutParam2: ' || OutParam2); dbms_output.put_line('OutParam3: ' || OutParam3); dbms_output.put_line('OutParam4: ' || OutParam4); END; /
Editado para usar la especificación de OP y con un enfoque alternativo para utilizar
:var
variables de enlace:var InParam1 number; var InParam2 number; var OutParam1 varchar2(100); var OutParam2 varchar2(100); var OutParam3 varchar2(100); var OutParam4 number; BEGIN /* Assign values to IN parameters */ :InParam1 := 33; :InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(:InParam1, :InParam2, :OutParam1, :OutParam2, :OutParam3, :OutParam4); END; / -- Display OUT parameters print :OutParam1; print :OutParam2; print :OutParam3; print :OutParam4;
fuente
:var
camino. Usaría ladeclare
forma por defecto si estuviera haciendo algo con PL / SQL; pero podría usar:var
si, digamos, estaba usando un poco de código existente copiado de Pro * C que ya tenía esa sintaxis y no quería tocar los parámetros en la llamada.:
(de hecho, no funcionó con él).Ejecución fácil. Obtener los resultados puede ser difícil.
Eche un vistazo a esta pregunta que hice La mejor manera / herramienta de obtener los resultados de un procedimiento de paquete de Oracle
El resumen es así.
Suponiendo que tuviera un paquete llamado mypackage y un procedimiento llamado getQuestions. Devuelve un refcursor y toma el nombre de usuario de la cadena.
Todo lo que tiene que hacer es crear un nuevo archivo SQL (archivo nuevo). Establezca la conexión y pegue lo siguiente y ejecute.
fuente
Para aquellos que usan SqlDeveloper 3+, en caso de que se lo hayan perdido:
SqlDeveloper tiene la característica de ejecutar el proceso / función almacenada directamente, y la salida se muestra de una manera fácil de leer.
Simplemente haga clic derecho en el paquete / proceso almacenado / función almacenada, haga clic en
Run
y elijatarget
el proceso / función que desea ejecutar, SqlDeveloper generará el fragmento de código para ejecutar (para que pueda poner sus parámetros de entrada). Una vez ejecutados, los parámetros de salida se muestran en la mitad inferior del cuadro de diálogo, e incluso tiene soporte incorporado para el cursor de referencia: el resultado del cursor se mostrará como una pestaña de salida separada.fuente
Abra el procedimiento en SQL Developer y ejecútelo desde allí. SQL Developer muestra el SQL que ejecuta.
BEGIN PROCEEDURE_NAME_HERE(); END;
fuente
Utilizar:
BEGIN PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); END;
Reemplace "PACKAGE_NAME", "PROCEDURE_NAME" y "parameter_value" con lo que necesita. Los parámetros OUT deberán declararse antes de.
fuente
Aunque esta pregunta es bastante antigua, sigo tropezando con el mismo resultado sin encontrar una manera fácil de ejecutar desde el desarrollador de SQL. Después de un par de intentos, encontré una manera fácil de ejecutar el procedimiento almacenado desde el propio desarrollador de SQL.
En paquetes, seleccione el paquete que desee y haga clic con el botón derecho en el nombre del paquete (no en el nombre del procedimiento almacenado).
Encontrarás la opción de ejecutar. Seleccione eso y proporcione los argumentos requeridos. Haga clic en Aceptar y podrá ver la salida en la sección de variables de salida a continuación
Estoy usando la versión de desarrollador de SQL 4.1.3.20
fuente
Ninguna de estas otras respuestas funcionó para mí. Esto es lo que tuve que hacer para ejecutar un procedimiento en SQL Developer 3.2.20.10:
SET serveroutput on; DECLARE testvar varchar(100); BEGIN testvar := 'dude'; schema.MY_PROC(testvar); dbms_output.enable; dbms_output.put_line(testvar); END;
Y luego tendría que ir a verificar la tabla para ver lo que se suponía que su proceso debía hacer con esa variable pasada; la salida simplemente confirmará que la variable recibió el valor (y, teóricamente, lo pasó al proceso).
NOTA (diferencias con el mío frente a otros):
:
antes del nombre de la variable.package.
o.packages.
entre el nombre del esquema y el nombre del procedimiento&
en el valor de la variable.print
ningún ladovar
para declarar la variableTodos estos problemas me dejaron rascándome la cabeza por más tiempo y estas respuestas que tienen estos errores atroces deben ser sacadas, alquitranadas y emplumadas.
fuente
No puedo creer, esto no se ejecutará en SQL Developer:
PERO esto hará:
Obviamente, todo tiene que estar en una sola línea.
fuente
execute
comando] establecen eso. Sin embargo, esta no es una respuesta a la pregunta que se hizo, y de todos modos se ha cubierto en respuestas más relevantes a otras preguntas .Con SQL Developer Versión 4.0.2.15 Build 15.21, funciona lo siguiente:
SET SERVEROUTPUT ON var InParam1 varchar2(100) var InParam2 varchar2(100) var InParam3 varchar2(100) var OutParam1 varchar2(100) BEGIN /* Assign values to IN parameters */ :InParam1 := 'one'; :InParam2 := 'two'; :InParam3 := 'three'; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1); dbms_output.enable; dbms_output.put_line('OutParam1: ' || :OutParam1); END; /
fuente
var
antes de que las variables NO funcionen, al menos en SQL Developer 3.2.20.10, y no debería usar dos puntos delante de ellas, no es necesario, nuevamente, al menos en 3.2.20.10 (la única razón por la que no lo hice no vote por esto ni lo edite). También necesitaría un punto y coma despuésSET SERVEROUTPUT ON
.Para ejecutar el procedimiento desde SQL solo para desarrolladores, ejecute el siguiente comando
EJECUTAR PROCEDURE_NAME;
fuente
No pude hacer funcionar las respuestas de @Alex Poole. Sin embargo, por ensayo y error, encontré los siguientes trabajos (usando SQL Developer versión 3.0.04). Publicarlo aquí en caso de que ayude a otros:
SET serveroutput on; DECLARE var InParam1 number; var InParam2 number; var OutParam1 varchar2(100); var OutParam2 varchar2(100); var OutParam3 varchar2(100); var OutParam4 number; BEGIN /* Assign values to IN parameters */ InParam1 := 33; InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(InParam1, InParam2, OutParam1, OutParam2, OutParam3, OutParam4); /* Display OUT parameters */ dbms_output.put_line('OutParam1: ' || OutParam1); dbms_output.put_line('OutParam2: ' || OutParam2); dbms_output.put_line('OutParam3: ' || OutParam3); dbms_output.put_line('OutParam4: ' || OutParam4); END;
fuente
var
a cada variable en eldeclare
bloque, que no es válido. Al intentar ejecutar esto, aparece 'PLS-00103: Se encontró el símbolo "NÚMERO" al esperar uno de los siguientes ...', y errores similares en las otras cinco variables.var
, y yo no necesitaba usar.package.
en mi llamada, al menos en 3.2.20.10, que no debería haber sido tan diferente, y obtuve errores cuando lo hice. Perdí mucho tiempo con esta respuesta.--for setting buffer size needed most of time to avoid `anonymous block completed` message set serveroutput on size 30000; -- declaration block in case output need to catch DECLARE --declaration for in and out parameter V_OUT_1 NUMBER; V_OUT_2 VARCHAR2(200); BEGIN --your stored procedure name schema.package.procedure( --declaration for in and out parameter V_OUT_1 => V_OUT_1, V_OUT_2 => V_OUT_2 ); V_OUT_1 := V_OUT_1; V_OUT_2 := V_OUT_2; -- console output, no need to open DBMS OUTPUT seperatly -- also no need to print each output on seperat line DBMS_OUTPUT.PUT_LINE('Ouput => ' || V_OUT_1 || ': ' || V_OUT_2); END;
fuente
Crear un bloque Pl / SQL puede ser doloroso si tiene muchos procedimientos que tienen muchos parámetros. Hay una aplicación escrita en Python que lo hace por ti. Analiza el archivo con declaraciones de procedimiento y crea la aplicación web para invocaciones de procedimiento convenientes.
fuente
var out_para_name refcursor; execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); print :out_para_name;
fuente