IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

appel de proc stock dans shells unix


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut appel de proc stock dans shells unix
    Bonjour à tous,


    Auriez-vous des exemples de shell unix où sont appelés des proc et fonctions stockées oracle. Avec renseignement des paramètres en entrée, récupération des paramètres en sortie ...

    Tout cela se passe sous Oracle 9i, unix AIX.

    Merci d'avance.

    Cordialement.

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je pense qu'il existe beaucoup d'exemples sur ce site

    admettons que tu veux utiliser la fonction Y=LN(X)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X=2.7
    Y=`(echo "set pages 0";echo "select ln($X) from dual;")|sqlplus -s -L scott/tiger`

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    bien sûr tu peux remplacer stdin par un script!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    je pense qu'il existe beaucoup d'exemples sur ce site
    je n'en ai pas vu beaucoup.

    Question subsidiaire à l'exemple donné : si $X est un paramètre en sortie (ou en entrée/sortie), ça pourrait éventuellement fonctionner ?

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Citation Envoyé par laurentschneider
    ben c'est ce que j'ai fait !

    Et ma question subsidiaire svp ?

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    X=2
    X=`sqlplus -s -L scott/tiger <<EOF
    set head off feedb off
    var n number
    exec :n := $X
    exec p(:n)
    print n
    EOF
    `

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Merci beaucoup !

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Citation Envoyé par laurentschneider
    quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    X=2
    X=`sqlplus -s -L scott/tiger <<EOF
    set head off feedb off
    var n number
    exec :n := $X
    exec p(:n)
    print n
    EOF
    `

    Je me suis enflammé un peu vite, mon cas est un tout petit peu plus compliqué, j'appelle une fonction stockée oracle qui return un code retour et qui a également un paramètre en sortie (out). Comment faire pour récupérer ces 2 paramètres ?

    Une solution consiste dans le EOF à faire un print des 2 paramètres, et après le EOF spliter la chaine de caractères récupérée pour avoir les 2 paramètres.

    Y a-t-il une autre solution plus sioux ?

    Par ailleurs dans le script ci dessus il y a :

    exec :n := $X


    Mais il est impossible de faire le contraire : exec X := n
    car a cet endroit du script X n'est pas connu d'oracle.
    Y a-t-il un moyen de contourner ce pb ?

    Cordialement.

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    c'est exactement ce que fait mon exemple, à la fin il fait un PRINT N ce qui informe la variable Unix X (car X=sqlplus...)

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    SQL> create or replace procedure p(n in out number) is begin n:=n*n; end;
      2  /
     
    Procedure created.
     
    $ X=2
    $ X=`sqlplus -s -L scott/tiger <<EOF
     set head off feedb off
     var n number
     exec :n := $X
     exec p(:n)
     print n
     EOF
     `
    $ echo $X
    4

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    oui mais il y a 2 paramètres en sortie, et il s'agit d'une fct, voila ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    X="'$1'"
    Z="KO"
    Z=`sqlplus -s -L scott/tiger <<EOF
    set head off feedb off
    var nt varchar2(10);
    var codRet varchar2(2);
    exec begin :codRet := PACKAGE.TEST2($X, :nt); end;
    print codRet nt
    EOF
    `
    echo "XXXXXXXXXX>>" $X "<<XXXXXXXXXXXXX"
    echo "ZZZZZZZZZZ>>" $Z "<<ZZZZZZZZZZZZZ"
    Y a-t-il un moyen de faire autrement, par exemple remplacer codRet par une variable unix ?

  13. #13
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    quelqu'un pourrait il m'expliquer ce que fait chaque ligne svp ?
    je ne comprends notament pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sqlplus -s -L scott/tiger <<EOF
    set head off feedb off
    ...
    exec begin :codRet := PACKAGE.TEST2($X, :nt); end;

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Citation Envoyé par jadey
    quelqu'un pourrait il m'expliquer ce que fait chaque ligne svp ?
    je ne comprends notament pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sqlplus -s -L scott/tiger <<EOF
    set head off feedb off
    ...
    exec begin :codRet := PACKAGE.TEST2($X, :nt); end;
    sqlplus -s -L scott/tiger : connexion à sqlplus.

    set head off feedb off : supprime les commentaires parasites au lancement de sqlplus.

    exec begin :codRet := PACKAGE.TEST2($X, :nt); end; : appel d'une fonction stockée oracle, comme c'est une fct le résultat doit être stocké dans une var. (codRet).

    les ':' devant une variable : var. résultat.

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par fguigui
    oui mais il y a 2 paramètres en sortie
    ok, si tu employes le shell standard d'AIX, à savoir KSH, tu peux essayer quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    SQL> create or replace procedure p(x in out number,y out number) is begin x:=x*x;y:=x*x; end;
      2  /
     
    Procedure created.
     
     
    $ X=3
    $ sqlplus -s -L scott/tiger <<EOF | grep . | read X Y
        set head off feedb off
     var x number
     var y number
     exec :x := $X
     exec p(:x,:y)
    select :x,:y from dual;
    EOF
    $ echo $X                                            
    9
    $ echo $Y
    81

    Update:
    le read est écrit en miniscule, faut pas se fier à la formatisation du code dans ce forum

  16. #16
    Membre éprouvé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Par défaut
    les ':' devant une variable : var. résultat.
    ???

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Merci laurent, ça marche très bien !
    Et pour Jadey ce serait plutot des variables bindées oracle ? je n'en sais pas plus !

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    euh excusez moi de revenir vers vous, mais j'ai à nouveau un soucis, j'ai rajouté un 3ème paramètre en sortie, et soit le read unix ne fonctionne pas soit le select from dual oracle ne ramène que 2 paramètres sur les 3.

    Qu'est-ce qui cloche ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sqlplus -s -L scott/tiger <<EOF | grep . | read codRet nomTable peri
    SET head off feedb off
    var cr varchar2(2);
    var nt varchar2(10);
    var per varchar2(6);
    exec :cr := PACK.TEST2($nomFic, :nt, :per);
    SELECT :cr, :nt, :per from dual;
    EOF
     
    echo $codRet "=" $nomTable "=" $peri
    Avec ce code peri est perdu.

    cr, nt, per paramètres sortie

    Comment le récupérer ?

    Cordialement

  20. #20
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    set head off feedb off lin 30000 trims on

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/01/2009, 12h03
  2. Appels de procedures stockées dans une proc stockée ?
    Par Nadaa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 17/07/2008, 10h32
  3. Réponses: 6
    Dernier message: 18/01/2008, 12h22
  4. Réponses: 3
    Dernier message: 21/09/2004, 07h35
  5. Réponses: 1
    Dernier message: 04/06/2003, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo