86 votes

Exécuter une procédure stockée dans SQL Developer ?

J'essaie d'exécuter une procédure stockée qui a plusieurs paramètres d'entrée et de sortie. La procédure ne peut être consultée que dans mon panneau Connexions en naviguant dans Autres utilisateurs | | Packages | | |.

Si je fais un clic droit, les éléments de menu sont "Order Members By..." et "Create Unit Test" (en grisé). La possibilité d'"exécuter" la procédure ne semble pas possible lorsqu'elle est accessible par l'utilisateur.

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

Quelqu'un sait-il 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 les variables out* :

   out1 VARCHAR2(100) := '';

mais je reçois la même erreur :

EDIT 2 :

En me basant sur la réponse d'Alex, j'ai essayé de supprimer les deux points devant les paramètres et j'ai obtenu 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 votes

0 votes

Essayez de placer les variables OUT à l'intérieur du BEGIN, avant l'instruction d'exécution de la procédure.

0 votes

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

79voto

Alex Poole Points 43006

Avec des types de paramètres simples (c'est-à-dire sans réflecteurs, 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;
/

Modifié pour utiliser la spécification de l'OP, et avec une approche alternative pour utiliser la spécification de l'OP. :var lier les 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;

1 votes

+1 belle réponse. Par curiosité, savez-vous lequel est préféré ?

0 votes

@Conrad : J'imagine qu'il s'agit d'une question de préférence, bien qu'il puisse y avoir plus de changement de contexte dans l'utilisation de l'Internet. :var moyen. J'utiliserais le declare par défaut si je faisais quoi que ce soit avec PL/SQL ; mais je pourrais utiliser :var si, par exemple, j'utilisais un bout de code existant copié depuis Pro*C qui avait déjà cette syntaxe et que je ne voulais pas toucher aux paramètres de l'appel.

2 votes

Merci pour votre aide et votre réponse détaillée. Je suis sûr qu'elle sera également utile à d'autres personnes. Une chose à noter est que ceux-ci doivent être exécutés en tant que scripts et non en tant que déclarations.

30voto

Conrad Frix Points 34272

Exécuter facilement. Obtenir les résultats peut être difficile.

Jetez un coup d'œil à cette question que j'ai posée Meilleur moyen/outil pour obtenir les résultats d'une procédure de package oracle

Le résumé de la situation est le suivant .

Supposons que vous ayez un paquet nommé mypackage et une procédure appelée getQuestions. Elle renvoie un réflecteur et prend le nom d'utilisateur en chaîne.

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

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

3 votes

J'ai dû utiliser le mot complet "execute" plutôt que "exec".

14voto

Noel Points 124

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

BEGIN
  PROCEEDURE_NAME_HERE();
END;

7voto

OMG Ponies Points 144785

Utilisez :

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

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

1voto

Amel Music Points 49

Je ne peux pas croire que ça ne s'exécute pas dans SQL Developer :

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

print r;

MAIS ceci le fera :

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

print r;

Évidemment, tout doit être dans une seule ligne

3 votes

La [docs SQL*Plus pour l'option execute commande] l'affirment. Ce n'est pas une réponse à la question posée, qui a déjà été traitée. dans des réponses plus pertinentes à d'autres questions avant de toute façon.

0 votes

J'ai pu l'utiliser dans SQL Developer. Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X