oracle - procedimientos - Ejecute el procedimiento almacenado en SQL Developer?
procedimiento almacenado oracle select (12)
Estoy intentando ejecutar un procedimiento almacenado que tiene múltiples parámetros de entrada y salida. El procedimiento solo se puede ver en mi panel de Conexiones navegando por Otros usuarios | | Paquetes | |
Si hago clic derecho, los elementos del menú son "Solicitar miembros por ..." y "Crear prueba de unidad" (en gris). La capacidad de "ejecutar" el procedimiento no parece posible cuando el usuario tiene acceso a ella.
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!
EDIT 1:
El procedimiento que deseo 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 de esta manera:
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 recibe el mismo error:
EDICION 2:
En base a la respuesta de Alex, traté de eliminar los dos puntos de delante de los params y obtener 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:
Abra el procedimiento en SQL Developer y ejecútelo desde allí. SQL Developer muestra el SQL que se ejecuta.
BEGIN
PROCEEDURE_NAME_HERE();
END;
Aunque esta pregunta es bastante antigua, sigo tropezando con el mismo resultado sin encontrar una manera fácil de ejecutar desde el desarrollador sql. Después de un par de intentos, encontré una manera fácil de ejecutar el procedimiento almacenado desde el propio desarrollador sql.
Debajo de los paquetes, seleccione su paquete deseado y haga clic derecho en el nombre del paquete (no en el nombre del procedimiento almacenado).
Encontrarás la opción para ejecutar. Seleccione eso y proporcione los argumentos requeridos. Haga clic en Aceptar y puede ver la salida en la sección de variables de salida a continuación
Estoy usando SQL Developer versión 4.1.3.20
Con tipos de parámetros simples (es decir, no refuerzos, 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 las especificaciones de OP, y con un enfoque alternativo para utilizar :var
bind variables:
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;
Crear bloques Pl / SQL puede ser doloroso si tienes muchos procedimientos que tienen muchos parámetros. Hay una application escrita en python que lo hace por usted. Analiza el archivo con declaraciones de procedimientos y crea la aplicación web para invocaciones de procedimientos convenientes.
Ejecutando fácil. Obtener los resultados puede ser difícil.
Eche un vistazo a esta pregunta que le hice a Best way / tool para obtener los resultados de un procedimiento de paquete de Oracle
El resumen de esto es así.
Suponiendo que tiene un paquete llamado mypackage y un procedimiento llamado getQuestions. Devuelve un refcursor y toma el nombre de usuario de la cadena.
Todo lo que tienes que hacer es crear un nuevo archivo SQL (archivo nuevo). Establezca la conexión y pegue lo siguiente y ejecútelo.
var r refcursor;
exec mypackage.getquestions(:r, ''OMG Ponies'');
print r;
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 verificar la tabla para saber qué se suponía que debía hacer su proc con esa variable pasada, la salida simplemente confirmaría que la variable recibió el valor (y teóricamente, lo pasó al proceso).
NOTA (diferencias con el mío vs. otros):
- No
:
antes del nombre de la variable - Sin poner
.package.
o.packages.
entre el nombre del esquema y el nombre del procedimiento - No tener que poner un
&
en el valor de la variable. - No usar
print
cualquier lugar - No usar
var
para declarar la variable
Todos estos problemas me dejaron rascándome la cabeza durante más tiempo y estas respuestas que tienen estos errores atroces que se sacarán y se empolvarán.
No pude obtener respuestas @Alex Poole funcionando. Sin embargo, por prueba 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;
No puedo creer, esto no se ejecutará en SQL Developer:
var r refcursor;
exec PCK.SOME_SP(:r,
''02619857'');
print r;
PERO esto:
var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, ''02619857'');
print r;
Obviamente, todo tiene que estar en una línea ...
Para aquellos que usan SqlDeveloper 3+, en caso de que hayas olvidado eso:
SqlDeveloper tiene una función para ejecutar proc / función almacenada directamente, y los resultados se muestran de una manera fácil de leer.
Simplemente haga clic derecho en el paquete / función almacenada / proc almacenada, haga clic en Run
y elija el target
para ser el proc / func 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 tienen soporte incorporado para el cursor de ref .: el resultado del cursor se mostrará como una pestaña de salida separada.
Usando SQL Developer Versión 4.0.2.15 Build 15.21 los siguientes trabajos:
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;
/
Utilizar:
BEGIN
PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);
END;
Reemplaza "PACKAGE_NAME", "PROCEDURE_NAME" y "parameter_value" con lo que necesites. Los parámetros OUT deberán declararse antes.
var out_para_name refcursor;
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;