2010-10-21 42 views
60

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 | |Ejecutar procedimiento almacenado en SQL Developer?

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 que pueda 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 de antemano!

EDIT 1:

El procedimiento 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 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 

he intentado inicializar el cabo * variables:

out1 VARCHAR2(100) := ''; 

pero sale el mismo error:

EDIT 2:

Sobre la base de la respuesta de Alex, he intentado quitar los dos puntos de delante de los parámetros y obtenga 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: 
+0

posible duplicado de [La mejor forma/herramienta para obtener los resultados de un procedimiento de paquete oracle] (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from- an-oracle-package-procedure) –

+0

Intente colocar las variables OUT dentro de BEGIN, antes de la instrucción de ejecución del procedimiento. –

+0

No necesita el 'execute'; en PL/SQL que se interpreta como el inicio de 'execute immediate', que es diferente de SQL' execute'. –

Respuesta

63

Con tipos de parámetros simples (es decir, no refractors etc.) Se 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 utilizar especificaciones de la OP, y con un enfoque alternativo para utilizar :var variables se unen:

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; 
+1

+1 buena respuesta. Por curiosidad ¿sabes cuál es el preferido? –

+0

@Conrad: me imagino que es un cosa de preferencia, aunque podría haber más contexto cambiando la forma ': var'. Usaría el modo 'declare' de forma predeterminada si estaba haciendo algo con PL/SQL; pero podría usar ': var' si, por ejemplo, estaba usando un poco del código existente copiado de Pro * C que ya tenía esa sintaxis y no quería tocar los parms en la llamada. –

+1

Gracias por la ayuda y la respuesta detallada. Estoy seguro de que será una ayuda para otros también. Una cosa a tener en cuenta es que estos deben ejecutarse como scripts, no como declaraciones. – sdoca

23

Ejecución fácil. Obtener los resultados puede ser difícil.

Tome un vistazo a esta pregunta me preguntó Best way/tool to get the results from an oracle package procedure

El resumen de la misma es la siguiente.

Suponiendo que tiene un paquete denominado mypackage y el procedimiento denominado 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 ejecútelo.

var r refcursor; 
exec mypackage.getquestions(:r, 'OMG Ponies'); 
print r; 
+3

Tuve que usar la palabra completa "ejecutar" en lugar de "ejecutivo" – Patrick

4

Uso:

BEGIN 

    PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); 

END; 

reemplazar "PACKAGE_NAME", "PROCEDURE_NAME", y "parameter_value", con lo que necesita. Los parámetros OUT deberán declararse antes.

7

abierto el procedimiento en SQL Developer y ejecutarlo desde allí. SQL Developer muestra el SQL que se ejecuta.

BEGIN 
    PROCEEDURE_NAME_HERE(); 
END; 
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); 
print :out_para_name; 
0

No se puede creer, esto no va a 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 ..

+2

Los [documentos SQL * Plus para el comando 'execute'] indican eso. Sin embargo, esta no es una respuesta a la pregunta que se hizo, y se ha cubierto [en las respuestas más relevantes a otras preguntas] (http://stackoverflow.com/a/15649958/266304) antes de todos modos. –

+0

Pude usarlo en SQL Developer. Gracias – Sergejs

-1

No pude conseguir @Alex Poole nswers trabajando. Sin embargo, por prueba y error, encontré los siguientes trabajos (usando SQL Developer versión 3.0.04). Publicar aquí en caso de que ayuda a los demás:

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; 
+2

Es lo mismo que la primera versión en mi respuesta, excepto que ha agregado una 'var' a cada variable en el bloque' declare', que no es válida. Intentar ejecutar esto da 'PLS-00103: Encontró el símbolo' NÚMERO 'cuando esperaba uno de los siguientes ...', y errores similares contra las otras cinco variables. –

+0

Estoy de acuerdo con Alex. Downvoted porque 'var', y yo no necesité 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. Perdió mucho tiempo con esta respuesta. – vapcguy

0

Uso de SQL Developer versión 4.0.2.15 Build 15.21 las siguientes obras:

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; 
/
+0

No, lo siento: '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, de nuevo, al menos en 3.2.20.10 (solo razón por la que no voté esto o lo edité). También necesitaría un punto y coma después de 'SET SERVEROUTPUT ON'. – vapcguy

8

Para aquellos que utilizan SQLDeveloper 3+, en el caso de que se ha perdido:

SqlDeveloper tiene la función para ejecutar proc/función almacenada directamente, y los resultados se muestran de una manera fácil de leer.

clic Justo a la derecha en el directorio/proc almacenado función de paquete/almacenado, haga clic en Run y elija target ser el proc/func desea ejecutar, SQLDeveloper va a generar el fragmento de código para ejecutar (de modo que usted puede poner su entrada parámetros). 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.

+0

Esta debería ser la respuesta seleccionada. – EvilTeach

-2

Crear un bloque Pl/SQL puede ser doloroso si tiene muchos procedimientos que tienen muchos parámetros. Hay un application escrito 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.

1

Ninguna de estas otras respuestas funcionó para mí. Esto es lo que tenía que hacer para ejecutar un procedimiento de 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 ver la tabla para lo que se suponía que su proc que ver con ese pasado-en la variable - - La salida simplemente confirmará que la variable recibió el valor (y teóricamente, lo pasó al proceso).

NOTA (diferencias con la mía vs.otros):

  • Sin : antes del nombre de la variable
  • Sin poner .package. o .packages. entre el nombre de esquema y el nombre del procedimiento
  • Sin tener que poner & en el valor de la variable.
  • Sin utilizando print cualquier lugar
  • Sin utilizando var declarar la variable

Todos estos problemas me dejó rascándome la cabeza de la más larga y estas respuestas que tienen estos errores flagrantes a ser sacado y alquitranado y emplumado

Cuestiones relacionadas