web-dev-qa-db-fra.com

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

J'essaie d'exécuter une procédure stockée comportant plusieurs paramètres d'input et out. La procédure ne peut être visualisée que dans le panneau Connexions en parcourant 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és). La possibilité "d'exécuter" la procédure ne semble pas possible lorsque l'utilisateur y accède.

J'ai essayé de trouver un exemple sur 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.

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 les variables out *:

   out1 VARCHAR2(100) := '';

mais obtenez la même erreur:

EDIT 2:

Sur la base de la réponse d'Alex, j'ai essayé de retirer les deux-points devant les paramètres et d'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:
69
sdoca

Avec des types de paramètres simples (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;
/


Édité pour utiliser les spécifications de l'OP, et avec une approche alternative pour utiliser les variables de liaison :var:

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;
71
Alex Poole

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

Jetez un coup d’œil à cette question que j’ai posée Meilleure solution pour obtenir les résultats d’une procédure de package Oracle

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

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

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

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

Pour ceux qui utilisent SqlDeveloper 3+, au cas où vous l'auriez manqué:

SqlDeveloper a pour fonction d’exécuter directement les proc/fonctions stockées, et les résultats sont affichés de manière facile à lire.

Cliquez avec le bouton droit de la souris sur la fonction package/stockée proc/stockée, cliquez sur Run et choisissez target comme proc/func à exécuter, SqlDeveloper générera l’extrait de code à exécuter (afin que vous puissiez définir vos paramètres d’entrée). Une fois exécutés, les paramètres de sortie sont affichés dans la moitié inférieure de la boîte de dialogue, et il dispose même d’un support intégré pour le curseur ref: le résultat du curseur sera affiché dans un onglet de sortie séparé.

16
Adrian Shum

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

BEGIN
  PROCEEDURE_NAME_HERE();
END;
11
Noel

Utilisation:

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.

6
OMG Ponies

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;

Ensuite, vous devrez vérifier dans la table ce que votre proc est censé faire avec cette variable transmise - la sortie confirmera simplement que la variable a reçu la valeur (et l'a théoriquement transmise au proc).

NOTE(différences avec le mien par rapport aux autres): 

  • Non : avant le nom de la variable
  • Pas d'insertion de .package. ou .packages. entre le nom du schéma et le nom de la procédure
  • Pas besoin de mettre un & dans la valeur de la variable.
  • Pas d'utilisation de print n'importe où
  • Non en utilisant var pour déclarer la variable

Tous ces problèmes m'ont laissé ébranler ma tête le plus longtemps possible et les réponses à ces erreurs énormes doivent être résolues et goudronnées.

1
vapcguy

A l’aide de SQL Developer Version 4.0.2.15, Build 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
Jack

Bien que cette question soit assez ancienne, je continue de tomber dans le même résultat sans trouver un moyen facile de lancer un développeur SQL . Après quelques essais, j'ai trouvé un moyen facile d'exécuter la procédure stockée à partir du développeur SQL lui-même. 

  • Sous packages, sélectionnez le package souhaité et cliquez avec le bouton droit de la souris sur le nom du package (et non sur le nom de la procédure stockée).

  • Vous trouverez une option pour courir. Sélectionnez cela et fournissez les arguments requis. Cliquez sur OK et vous pouvez voir la sortie dans la section des variables de sortie ci-dessous.

J'utilise la version 4.1.3.20 du développeur SQL

0
Narasimha

Je ne peux pas croire, cela n'exécutera pas dans SQL Developer: 

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

print r;

MAIS cela va:

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

print r;

Évidemment, tout doit être sur une seule ligne.

0
Amel Music