Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/04/2007, 11h22   #1
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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.
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 15h24   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
je pense qu'il existe beaucoup d'exemples sur ce site

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

Code :
1
2
3
 
X=2.7
Y=`(echo "set pages 0";echo "select ln($X) from dual;")|sqlplus -s -L scott/tiger`
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 15h26   #3
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
bien sûr tu peux remplacer stdin par un script!
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 16h00   #4
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Citation:
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 ?
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 16h35   #5
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 16h36   #6
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Citation:
Envoyé par laurentschneider
ben c'est ce que j'ai fait !

Et ma question subsidiaire svp ?
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 16h52   #7
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
quelque chose du style

Code :
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
`
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2007, 17h03   #8
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Merci beaucoup !
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 10h45   #9
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Citation:
Envoyé par laurentschneider
quelque chose du style

Code :
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.
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 10h58   #10
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
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...)
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 11h02   #11
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Code :
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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 11h13   #12
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
oui mais il y a 2 paramètres en sortie, et il s'agit d'une fct, voila ce que j'ai fait :
Code :
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 ?
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 11h17   #13
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
quelqu'un pourrait il m'expliquer ce que fait chaque ligne svp ?
je ne comprends notament pas:
Code :
1
2
3
4
sqlplus -s -L scott/tiger <<EOF
SET head off feedb off
...
exec begin :codRet := PACKAGE.TEST2($X, :nt); end;
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 11h39   #14
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Citation:
Envoyé par jadey
quelqu'un pourrait il m'expliquer ce que fait chaque ligne svp ?
je ne comprends notament pas:
Code :
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.
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 12h00   #15
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
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 :
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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 12h08   #16
Membre éclairé
 
Inscription : juin 2005
Messages : 1 056
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 1 056
Points : 329
Points : 329
Envoyer un message via AIM à jadey Envoyer un message via MSN à jadey Envoyer un message via Yahoo à jadey
Citation:
les ':' devant une variable : var. résultat.
???
jadey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 13h15   #17
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Merci laurent, ça marche très bien !
Et pour Jadey ce serait plutot des variables bindées oracle ? je n'en sais pas plus !
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 17h02   #18
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
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 ?
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 11h19   #19
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 133
Points : 32
Points : 32
Code :
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
fguigui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 13h52   #20
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
set head off feedb off lin 30000 trims on
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h07.


 
 
 
 
Partenaires

Hébergement Web