2010-10-21 9 views
60

J'essaie d'exécuter une procédure stockée avec plusieurs paramètres d'entrée et de sortie. La procédure peut uniquement être affichée dans le panneau Connexions en naviguant sur Autres utilisateurs | | Forfaits | | Si je clique avec le bouton droit de la souris, les éléments de menu sont "Ordre des membres par ..." et "Créer un test unitaire" (grisé). La possibilité de "lancer" la procédure ne semble pas possible lorsque l'utilisateur y accède.Exécuter une procédure stockée dans SQL Developer?

J'ai essayé de trouver un exemple de la façon de créer un bloc anonyme afin que je puisse exécuter la procédure en tant que fichier SQL, mais je n'ai rien trouvé qui fonctionne.

Est-ce que quelqu'un sait comment je peux exécuter cette procédure à partir de SQL Developer? J'utilise la version 2.1.1.64.

Merci d'avance!

EDIT 1:

La procédure que je veux appeler a cette signature:

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 j'écris mon bloc anonyme comme ceci:

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; 

Je reçois l'erreur :

Bind Varialbe "out1" is NOT DECLCARED 
anonymous block completed 

J'ai essayé d'initialiser la série * variables:

out1 VARCHAR2(100) := ''; 

mais obtenir la même erreur:

EDIT 2:

Sur la base de la réponse d'Alex, j'ai essayé de retirer les colons de en face des paramètres et obtenir ceci:

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

duplication possible de [Meilleure façon/outil pour obtenir les résultats d'une procédure de package oracle] (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from- an-oracle-package-procedure) –

+0

Essayez de placer les variables OUT dans le BEGIN, avant l'instruction d'exécution de la procédure. –

+0

Vous n'avez pas besoin de 'execute'; dans PL/SQL qui est interprété comme le début de 'execute immediate', qui est différent de SQL' execute'. –

Répondre

63

Avec des types de paramètres simples (c'est-à-dire pas de refcurseurs, etc.) Vous pouvez faire quelque chose comme ceci:

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


Edité utiliser la spécification de l'OP, et une autre approche d'utiliser :var variables de liaison:

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 belle réponse.Par curiosité savez-vous ce qui est préféré? –

+0

@Conrad: J'imagine que c'est un chose de préférence, Cependant, il peut y avoir plus de changement de contexte de la façon ': var'. J'utiliserais la méthode 'declare' par défaut si je faisais quelque chose avec PL/SQL; mais je pourrais utiliser ': var' si, disons, j'utilisais un peu de code existant copié à partir de Pro * C qui avait déjà cette syntaxe et je ne voulais pas toucher aux paramètres de l'appel. –

+1

Merci pour l'aide et la réponse détaillée. Je suis sûr que ce sera aussi une aide pour les autres. Une chose à noter est que ceux-ci doivent être exécutés en tant que scripts et non en tant que déclarations. – sdoca

23

Exécution facile. Obtenir les résultats peut être difficile.

Jetez un oeil à cette question que je posais Best way/tool to get the results from an oracle package procedure

Le résumé de celui-ci va comme ceci.

En supposant que vous ayez un package nommé mypackage et une procédure appelée getQuestions. Il renvoie un refcursor et prend le nom d'utilisateur de la chaîne.

Tout ce que vous avez à faire est de créer un nouveau fichier SQL (nouveau fichier). Définissez la connexion et collez ce qui suit et exécutez.

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

Je devais utiliser le mot complet "exécuter" plutôt que "exec" – Patrick

4

Utilisation:

BEGIN 

    PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); 

END; 

Remplacer "PACKAGE_NAME", "PROCEDURE_NAME" et "parameter_value" avec ce que vous avez besoin. Les paramètres OUT devront être déclarés avant.

7

ouvrir la procédure dans SQL Developer et lancez-le à partir de là. SQL Developer affiche le SQL qu'il exécute.

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

ne peux pas croire, ce ne sera pas exécuter dans SQL Developer:

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

print r; 

MAIS cela:

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

print r; 

tout a évidemment être dans une ligne ..

+2

La documentation [SQL * Plus pour la commande 'execute'] indique que. Ce n'est pas une réponse à la question qui a été posée si, et a été couvert [dans des réponses plus pertinentes à d'autres questions] (http://stackoverflow.com/a/15649958/266304) avant de toute façon. –

+0

A pu l'utiliser dans SQL Developer. Merci – Sergejs

-1

Je n'ai pas réussi à obtenir @Alex Poole nswers travail. Cependant, par essais et erreurs, j'ai trouvé les travaux suivants (en utilisant SQL Developer version 3.0.04). Affichage ici au cas où il aide les autres:

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

C'est la même que la première version dans ma réponse, sauf que vous avez ajouté un 'var' à chaque variable dans le bloc' declare', ce qui est invalide. Essayer d'exécuter ceci donne 'PLS-00103: J'ai rencontré le symbole "NUMBER" quand j'attendais l'un des suivants ...', et des erreurs similaires contre les cinq autres variables. –

+0

Je suis d'accord avec Alex. Downvoted parce que 'var', et je n'ai pas besoin d'utiliser' .package.' dans mon appel, au moins au 3.2.20.10, ce qui n'aurait pas dû être si différent, et j'ai eu des erreurs quand je l'ai fait. J'ai perdu beaucoup de temps avec cette réponse. – vapcguy

0

Utilisation de la version SQL Developer 4.0.2.15 Construire 15.21 les travaux suivants:

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

Non, désolé - 'var' avant que les variables NE FONCTIONNE PAS - au moins dans SQL Developer 3.2.20.10, et ne devrait pas utiliser deux-points devant eux - pas besoin, encore une fois, au moins dans 3.2.20.10 (seule raison pour laquelle je n'ai pas voté cela ou l'éditer). Aussi besoin d'un point-virgule après 'SET SERVEROUTPUT ON'. – vapcguy

8

Pour ceux qui utilisent sqldeveloper 3+, dans le cas où vous avez manqué que:

SqlDeveloper dispose d'une fonction permettant d'exécuter directement la proc/fonction stockée, et les résultats affichés sont faciles à lire.

suffit de cliquer à droite sur le paquet/proc stocké/fonction stockée, cliquez sur Run et choisissez target être le proc/func que vous voulez exécuter, sqldeveloper va générer l'extrait de code à exécuter (de sorte que vous pouvez mettre votre entrée paramètres). Une fois exécuté, les paramètres de sortie sont affichés dans la moitié inférieure de la boîte de dialogue, et il a même un support intégré pour le curseur ref: le résultat du curseur sera affiché comme un onglet de sortie séparé.

+0

Cela devrait être la réponse sélectionnée. – EvilTeach

-2

Créer un bloc Pl/SQL peut être douloureux si vous avez beaucoup de procédures qui ont beaucoup de paramètres. Il y a un application écrit sur python qui le fait pour vous. Il analyse le fichier avec les déclarations de procédure et crée l'application Web pour des appels de procédure pratiques.

1

Aucune de ces autres réponses n'a fonctionné pour moi. Voici ce que je devais faire pour exécuter une procédure dans 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; 

Et vous avez alors d'aller vérifier la table pour quel que soit votre proc était censé faire avec ce passé-dans la variable - - La sortie confirmera simplement que la variable a reçu la valeur (et théoriquement, l'a transmise au proc).

NOTE (différences avec le mien vs.autres):

  • Pas : avant le nom de la variable
  • Aucune mise .package. ou .packages. entre le nom de schéma et le nom de la procédure
  • Non avoir à mettre un & dans la valeur de la variable.
  • Pas en utilisant print partout
  • Non Usure var pour déclarer la variable

Tous ces problèmes me laissait me gratter la tête pour la plus longue et ces réponses qui ont ces erreurs flagrantes sur être retirées et goudronné et à plumes.

Questions connexes