web-dev-qa-db-fra.com

Comment obtenir la valeur de retour de la procédure pl sql et l'affecter à une variable?

Code:

   execute x.procedurename(row.accc_no, row.bill_no, 0, null, row.total_balance, 'A',assgn_scen_site_cv, :assgn_scen_site_cv);

C'est ma procédure.

Comment obtenir la valeur de retour de ce proc et l'affecter à une variable?

3
Serdar

Vous pouvez le créer comme ceci:

CREATE OR REPLACE PROCEDURE procedurename(param1 NUMBER, param2 varchar(20), returnvalue OUT NUMBER);
IS
BEGIN
    ... your code
END;

Et puis utilisez-le comme ceci:

returnvalue NUMBER;
procedurename(0, 'xxx', returnvalue);
dbms_output.putline(returnvalue);

Vous pouvez consulter la documentation CREATE PROCEDURE sur le site Web d'Oracle.

3
Julien Vavasseur

Si je comprends bien, vous essayez de consommer une procédure existante qui a une valeur de retour. Cela peut être fait dans une autre procédure, package ou fonction, mais la méthode la plus simple utilise un bloc. Dans la section declare, vous définissez les variables qui recevront les valeurs, puis vous les utilisez dans l'appel à la procédure.

DECLARE
   vAccc_no              Number(10);
   vBill_no              Number(10);
   vTotal_Balance        Number(10,2);
   vAssgn_scen_site_cv   Varchar(80);   
   vAssgn_scen_site_cv_i Varchar(80);
BEGIN   
   vAssgn_scen_site_cv_i := 'Pass To Procedure';
   x.procedurename(vAccc_no, vBill_no, 0, null, vTotal_Balance, 'A', vAssgn_scen_site_cv
      , vAssgn_scen_site_cv_i);
   DBMS_Output.Put_Line('New value of Total_Balance: ' || vTotalBalance);
END;
/

Je devine les types de données et ce qui est entrée/sortie.

1
Leigh Riffel

Si vous êtes celui qui écrit la procédure, vous voudrez peut-être en faire une fonction à la place. Alors que "procédure" et "fonction" sont souvent utilisés comme synonymes, en PL/SQL, ils sont assez différents et doivent être utilisés en conséquence.

Si vous avez besoin d'un programme qui change quelque chose (supprimer du contenu, créer de nouvelles structures, etc.), ce devrait être une procédure. Cependant, si l'objectif principal est d'obtenir une valeur de retour (sélection de données, obtention de résultats pour les calculs, etc.), il doit s'agir d'une fonction.

Les fonctions sont très faciles à utiliser en SQL (comme pour appeler des fonctions intégrées comme to_char (), length (), instr () ...), vous écrivez simplement:

select my_function('foo') from dual;

L'utilisation de dual est juste exemplaire, vous pouvez l'utiliser dans n'importe quelle instruction SQL.

Exemple de code:

CREATE OR REPLACE FUNCTION my_function (i_input IN varchar2) RETURN varchar2
IS
BEGIN
    RETURN 'input: ' || i_input;
END;

L'appel ci-dessus renverra "input: foo".

1
makrom

Enveloppez votre SQL dans un bloc anonyme, par exemple:

declare
    result VARCHAR2(4000);
    A_STRING VARCHAR2(4000) := '';
    A_START_POS NUMBER := 0;
    A_END_POS NUMBER := 0;
begin
    result := BETWNSTR(
        A_STRING => A_STRING,
        A_START_POS => A_START_POS,
        A_END_POS => A_END_POS
    );
    -- optional value select
    open ? for select result as result from dual;
end;

Notez que result := ... Évite le changement de contexte entre les moteurs PL et SQL si vous souhaitez comparer avec select BETWNSTR(...) into result from dual;

0
Vasilii Chernov