J’essaie d’exécuter une procédure stockée comportant plusieurs parameters d’entrée et de sortie. La procédure ne peut être affichée que dans mon panneau Connexions en naviguant dans Autres utilisateurs | | Forfaits |
Si je clique avec le bouton droit de la souris, les éléments du menu sont “Commander les membres par …” et “Créer un test d’unité” (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 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 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 parameters 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:
Avec des types de parameters simples (pas de refcursors, 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 la spécification de l’OP, et avec une autre approche à utiliser :var
bind 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;
Exécution facile Obtenir les résultats peut être difficile.
Jetez un oeil à cette question, j’ai demandé à la meilleure façon / outil pour obtenir les résultats d’une procédure de package oracle
Le résumé de ceci va comme ça.
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 chaîne.
Tout ce que vous avez à faire est de créer un nouveau fichier SQL (fichier nouveau). Définissez la connexion et collez-la dans la suite et exécutez.
var r refcursor; exec mypackage.getquestions(:r, 'OMG Ponies'); print r;
Pour ceux qui utilisent SqlDeveloper 3+, au cas où vous auriez manqué cela:
SqlDeveloper a la fonction d’exécuter directement les fonctions / fonctions stockées, et les résultats sont affichés de manière facile à lire.
Cliquez avec le bouton droit sur le paquet / stocké / fonction stockée, cliquez sur Run
et choisissez la target
comme processus / fonction que vous voulez exécuter, SqlDeveloper générera l’extrait de code à exécuter (afin de pouvoir placer vos parameters d’entrée). Une fois exécutés, les parameters de sortie sont affichés dans la moitié inférieure de la boîte de dialog, et ils ont même un support intégré pour le curseur ref: le résultat du curseur sera affiché sous la forme d’un onglet de sortie séparé.
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;
Utilisation:
BEGIN PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); END;
Remplacez “PACKAGE_NAME”, “PROCEDURE_NAME” et “parameter_value” par ce dont vous avez besoin. Les parameters OUT devront être déclarés avant.
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 puis, il vous faudra vérifier la table pour savoir ce que votre proc était supposé faire avec cette variable passée – la sortie confirmera simplement que la variable a reçu la valeur (et théoriquement, la passera à la procédure).
REMARQUE (différences avec les miennes et les autres):
:
avant le nom de la variable .package.
ou .packages.
entre le nom du schéma et le nom de la procédure &
dans la valeur de la variable. print
partout var
pour déclarer la variable Tous ces problèmes m’ont laissé la tête la plus longue et ces réponses qui ont ces énormes erreurs sont éliminées et goudronnées.
Je ne peux pas croire, cela ne s’exécutera pas dans SQL Developer:
var r refcursor; exec PCK.SOME_SP(:r, '02619857'); print r;
MAIS ceci:
var r refcursor; exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857'); print r;
De toute évidence, tout doit être dans une seule ligne.
Utilisation de SQL Developer Version 4.0.2.15 Build 15.21:
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; /
Bien que cette question soit assez ancienne, je continue à tomber dans le même résultat sans trouver un moyen facile de fonctionner avec sql developer. Après quelques essais, j’ai trouvé un moyen simple d’exécuter la procédure stockée à partir de sql developer lui-même.
Sous packages, sélectionnez le package souhaité et cliquez avec le bouton droit sur le nom du package (pas sur le nom de la procédure stockée).
Vous trouverez l’option à exécuter. Sélectionnez-le et fournissez les arguments requirejs. 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
Je n’ai pas pu obtenir de réponses @Alex Poole. Cependant, par essais et erreurs, j’ai trouvé les travaux suivants (en utilisant SQL Developer version 3.0.04). L’afficher ici au cas où cela aiderait 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;
Créer un bloc Pl / SQL peut être pénible si vous avez beaucoup de procédures qui ont beaucoup de parameters. Il y a une application écrite sur python qui le fait pour vous. Il parsing le fichier avec les déclarations de procédure et crée l’application Web pour des appels de procédure pratiques.
var out_para_name refcursor; execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); print :out_para_name;