¿Ejecutar procedimiento almacenado en SQL Developer?

81

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:
sdoca
fuente
Intente poner las variables OUT dentro de BEGIN, antes de la instrucción de ejecución del procedimiento.
OMG Ponies
No necesita el execute; en PL / SQL que se interpreta como el inicio de execute immediate, que es diferente a SQL execute.
Alex Poole
2
@sdoca: estás confundiendo dos enfoques ahora; con su versión edit 2 simplemente elimine la palabra execute. El declaredebe haber antes de la begin. Lo que creo que @OMG quiso decir es que puede declarar las variables en SQL Developer antes del bloque anónimo con la variablepalabra clave, y luego usar la :out1sintaxis como la tenía originalmente, en cuyo caso no tiene una declaresección en absoluto. Pero estás mezclando los dos de tu último comentario.
Alex Poole
1
Sí, sabía que estaba confundido, pero no estaba muy seguro de dónde / cómo.
sdoca

Respuestas:

75

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 :varvariables 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;
Alex Poole
fuente
1
+1 buena respuesta. ¿Por curiosidad sabes cuál es el preferido?
Conrad Frix
@Conrad: Me imagino que es una cuestión de preferencia, aunque podría haber más contexto cambiando el :varcamino. Usaría la declareforma por defecto si estuviera haciendo algo con PL / SQL; pero podría usar :varsi, 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.
Alex Poole
2
Gracias por la ayuda y la respuesta detallada. Estoy seguro de que también ayudará a otros. Una cosa a tener en cuenta es que estos deben ejecutarse como scripts, no como declaraciones.
sdoca
1
Al ejecutar en SQL Developer, no tuve que prefijar los nombres de las variables con :(de hecho, no funcionó con él).
haridsv
29

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.

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
Conrad Frix
fuente
3
Tuve que usar la palabra completa "ejecutar" en lugar de "ejecutivo"
Patrick
21

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 Runy elija targetel 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.

Adrian Shum
fuente
2
Esta debería ser la respuesta seleccionada.
EvilTeach
12

Abra el procedimiento en SQL Developer y ejecútelo desde allí. SQL Developer muestra el SQL que ejecuta.

BEGIN
  PROCEEDURE_NAME_HERE();
END;
Navidad
fuente
6

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.

Ponis dios mio
fuente
2

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

Narasimha
fuente
1

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):

  • 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 en printningún lado
  • No se usa varpara declarar la variable

Todos 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.

vapcguy
fuente
0

No puedo creer, esto no se ejecutará en SQL Developer:

var r refcursor;
exec PCK.SOME_SP(:r,
 '02619857');

print r;

PERO esto hará:

var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');

print r;

Obviamente, todo tiene que estar en una sola línea.

Música de Amel
fuente
2
Los [documentos SQL * Plus para el executecomando] 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 .
Alex Poole
Pude usarlo en SQL Developer. Gracias
Sergejs
0

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;
/
Jack
fuente
No, lo siento, varantes 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és SET SERVEROUTPUT ON.
vapcguy
0

Para ejecutar el procedimiento desde SQL solo para desarrolladores, ejecute el siguiente comando

EJECUTAR PROCEDURE_NAME;

AmolRavan
fuente
-1

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;
ggkmath
fuente
2
Eso es lo mismo que la primera versión en mi respuesta, excepto que ha agregado un vara cada variable en el declarebloque, 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.
Alex Poole
Estoy de acuerdo con Alex. Voté en contra porque 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.
vapcguy
-1
--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;
v8-E
fuente
-2

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.

nmax
fuente
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
Ayudante
fuente