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:
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;
/
: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;
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;
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é.
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;
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.
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):
:
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
n'importe oùvar
pour déclarer la variableTous 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.
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;
/
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
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.