web-dev-qa-db-fra.com

Comment puis-je utiliser le développeur Oracle SQL pour exécuter des procédures stockées?

* EDIT6: * C'est ce qui a fini par fonctionner pour moi (d'après la réponse acceptée):

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc)
print :tran_cnt
print :msg_cnt
print :rc

Le développeur SQL rend cela super difficile/impossible?. Je me fiche que l'utilitaire soit basé sur la ligne de commande; Je veux juste pouvoir courir et le voir rapidement. Ce serait bien s'il captait aussi bien les erreurs. ce serait bien de pouvoir se connecter progressivement (de manière interactive), ainsi que de tout spécifier à la fois (comme le fonctionnement d'un client ftp/sftp cmd typique).

Ma plateforme est Windows Server 2008 + Cygwin.

EDIT: Peut-être sauriez-vous comment écrire ceci en utilisant Python?

EDIT 2: Dans le serveur MSFT SQL, je peux simplement taper ceci:

get_user 1;

puis mettez-le en surbrillance et appuyez sur F5, et j'obtiens:

login   name    
NULL    Somename

imprimé dans la fenêtre de sortie. Le développeur Oracle SQL n'aide pas du tout. Je ne sais pas comment passer un 1, je ne sais pas comment voir les lignes/enregistrements réels qui reviennent.

EDIT3: Quand je tape juste var rc refcursor; et sélectionnez-le et exécutez-le, j'obtiens cette erreur (GUI):

An error was encountered performing the requested operation:

ORA-00900: invalid SQL statement
00900.00000 - "invalid SQL statement"
* Cause:
* Action:
Vendor code 900Error at Line: 2

EDIT4:

J'essaie d'exécuter une procédure dont la définition commence comme ceci:

create or replace procedure get_account
(
    Vret_val out number,
    Vtran_count in out number,
    Vmessage_count in out number,
    Vaccount_id     IN NUMBER
    , rc1 in out sys_refcursor
)as
begin
...

Je reçois une erreur:

Error starting at line 2 in command:
exec :rc := get_account(1) 
Error report:
ORA-06550: line 1, column 24:
PLS-00306: wrong number or types of arguments in call to 'GET_ACCOUNT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
rc
------

Je suis si proche ... aidez-moi.

* EDIT 5: *

Script que j'exécute (fonctionnellement le même), l'erreur était toujours la même:

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)

Sortie de script (sur F5) (Il pourrait y avoir plusieurs messages de plusieurs exécutions.):

Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
anonymous block completed
anonymous block completed

Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
anonymous block completed
anonymous block completed

Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Pourquoi dit-on ligne 1, colonne 134? Aucune ligne ne s'étendait jusque-là ...

19
Hamish Grubijan

Non seulement il existe un moyen de le faire, il y a plus d'un moyen de le faire (ce que je concède n'est pas très Pythonic, mais SQL * Developer est écrit en Java).

J'ai une procédure avec cette signature: get_maxsal_by_dept( dno number, maxsal out number).

Je le surligne dans le navigateur d'objets développeur SQL *, appelle le menu contextuel et choisis Run. (Je pourrais utiliser ctrl+F11.) Cela génère une fenêtre pop-up avec un faisceau de test. ( Remarque: Si la procédure stockée réside dans un package, vous devrez cliquer avec le bouton droit sur le package, pas l'icône sous le package contenant le nom de la procédure; vous sélectionnerez ensuite le sproc dans la liste "Target" du package lorsque le faisceau de test apparaîtra.) Dans cet exemple, le faisceau de test affichera le Suivant:

DECLARE
  DNO NUMBER;
  MAXSAL NUMBER;
BEGIN
  DNO := NULL;

  GET_MAXSAL_BY_DEPT(
    DNO => DNO,
    MAXSAL => MAXSAL
  );
  DBMS_OUTPUT.PUT_LINE('MAXSAL = ' || MAXSAL);
END;

J'ai défini la variable DNO sur 50 et appuyez sur OK. Dans le volet Running - Log (coin inférieur droit, sauf si vous l'avez fermé/déplacé/masqué), je peux voir la sortie suivante:

Connecting to the database apc.
MAXSAL = 4500
Process exited.
Disconnecting from the database apc. 

Pour être juste, le coureur est moins convivial pour les fonctions qui renvoient un curseur de référence, comme celui-ci: get_emps_by_dept (dno number) return sys_refcursor.

DECLARE
  DNO NUMBER;
  v_Return sys_refcursor;
BEGIN
  DNO := 50;

  v_Return := GET_EMPS_BY_DEPT(
    DNO => DNO
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
END;

Cependant, au moins, il offre la possibilité d'enregistrer toutes les modifications dans le fichier, afin que nous puissions conserver notre investissement dans l'ajustement du faisceau ...

DECLARE
  DNO NUMBER;
  v_Return sys_refcursor;
  v_rec emp%rowtype;
BEGIN
  DNO := 50;

  v_Return := GET_EMPS_BY_DEPT(
    DNO => DNO
  );

  loop
    fetch v_Return into v_rec;
    exit when v_Return%notfound;
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ename);
  end loop;
END;

La sortie du même emplacement:

Connecting to the database apc.
name = TRICHLER
name = VERREYNNE
name = FEUERSTEIN
name = PODER
Process exited.
Disconnecting from the database apc. 

Alternativement, nous pouvons utiliser les anciennes commandes SQL PLus dans le SQL Feuille de travail développeur:

var rc refcursor 
exec :rc := get_emps_by_dept(30) 
print rc

Dans ce cas, la sortie apparaît dans le volet Sortie de script (l'emplacement par défaut est l'onglet à droite de l'onglet Résultats).

Les toutes premières versions de IDE ne prenaient pas beaucoup en charge SQL * Plus. Cependant, toutes les commandes ci-dessus sont prises en charge depuis 1.2.1. Reportez-vous à le matrice dans la documentation en ligne pour plus d'informations.


"Quand je tape juste var rc refcursor; Et le sélectionne et l'exécute, j'obtiens cette erreur (GUI):"

Il existe une fonctionnalité - ou un bogue - dans la façon dont la feuille de calcul interprète les commandes SQL Plus. Cela suppose SQL Les commandes plus font partie d'un script. Donc, si nous entrons une ligne de SQL * Plus, dites var rc refcursor Et cliquez sur Execute Statement (Ou F9 ) la feuille de calcul lance ORA-900 parce que ce n'est pas une instruction exécutable c'est-à-dire que ce n'est pas SQL. Ce que nous devons faire, c'est cliquer sur Run Script (Ou F5 ), même pour une seule ligne de SQL * Plus.


"Je suis si proche ... aidez-moi."

Votre programme est une procédure avec une signature de cinq paramètres obligatoires. Vous obtenez une erreur car vous l'appelez en tant que fonction et avec un seul paramètre:

exec :rc := get_account(1)

Ce dont vous avez besoin est quelque chose comme ce qui suit. J'ai utilisé la notation nommée pour plus de clarté.

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor

exec :tran_cnt := 0
exec :msg_cnt := 123

exec get_account (Vret_val => :ret1, 
                  Vtran_count => :tran_cnt, 
                  Vmessage_count => :msg_cnt, 
                  Vaccount_id   => 1,
                  rc1 => :rc )

print tran_count 
print rc

Autrement dit, vous avez besoin d'une variable pour chaque paramètre OUT ou IN OUT. Les paramètres IN peuvent être passés sous forme de littéraux. Les deux premières instructions EXEC affectent des valeurs à quelques paramètres IN OUT. Le troisième EXEC appelle la procédure. Les procédures ne renvoient pas de valeur (contrairement aux fonctions), nous n'utilisons donc pas de syntaxe d'affectation. Enfin, ce script affiche la valeur de quelques variables mappées aux paramètres OUT.

35
APC

Je ne sais pas comment voir les lignes/enregistrements réels qui reviennent.

Les procédures stockées ne renvoient pas d'enregistrements. Ils peuvent avoir un curseur comme paramètre de sortie, qui est un pointeur vers une instruction select. Mais cela nécessite une action supplémentaire pour ramener les lignes de ce curseur.

Dans SQL Developer, vous pouvez exécuter une procédure qui renvoie un curseur ref comme suit

var rc refcursor
exec proc_name(:rc)

Après cela, si vous exécutez ce qui suit, il affichera les résultats du curseur:

print rc
4
Gary Myers

Ma recommandation est TORA

3
Sujee

Avez-vous entendu parler de "SQuirreL SQL Client"?

http://squirrel-sql.sourceforge.net/

2
redcayuga

Il existe deux possibilités, à la fois de Quest Software, TOAD et SQL Navigator:

Voici le téléchargement de TOAD Freeware: http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx

Et le SQL Navigator (version d'essai): http://www.quest.com/sql-navigator/software-downloads.aspx

0
Matthew Farwell