Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 08/06/2004, 15h31   #1
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Par défaut PLSQL : Analyse syntaxe

J'ai besoin d'analyser des requetes SQL saisie par des utilisateurs (avertis)
pour ensuite générer de manière dynamique ces requetes entre elles.

8) Exemple :
J'ai une table
Code :
1
2
3
4
5
6
TABLE Entete (
C1 number(4),
C2 varchar2(10),
C3 char(5),
C4 date
)

J'ai une requete
Code :
V_requete := 'Select C1,C2,C3,C4  from Entete';
Existe t'il un package ORACLE permettant de faire l'analyse de "V_requete"
a savoir :
le nombre de colonne sélectionnés (Ici 4)
le type et le nom des colonnes sélectionnées
C1 number(4),
C2 varchar2(10),
C3 char(5),
C4 date

Le but de cette analyse est de générer un curseur "PL/SQL" à partir de "V_requete"
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 15h43   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
pourquoi ne pas utiliser la vue all_tab_columns ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 15h53   #3
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Le package DBMS_SQL

Code :
1
2
3
4
5
dbms_sql.open_cursor;
dbms_sql.parse();
dbms_sql.execute();
dbms_sql.describe_columns2();
dbms_sql.close_cursor();
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 15h58   #4
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
V_requete est le resultat d'une saisie
c'est juste un exemple , je ne sais absolument pas quel est le contenu de la requete . la seule chose que je connais : c'est le contenu d'un varchar2 ==> V_requete que je doit analyser et ensuite lancer pour recuperer les valeurs selectionnées . Ces valeures seront ensuite réutilisées pour générer d'autres "Requete SQL" elles meme analysées et lancées .

PS : En ProC c'est possible avec les structures et fonctions fournies avec "SQLDA" mais je ne sait pas (Encore) comment réaliser la meme chose en PL/SQL
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 16h14   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Tu peux très bien faire une boucle sur cette requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE
 
TYPE t_ref_cursor IS REF CURSOR;
list_values      t_ref_cursor;
V_requete VARCHAR2(4000);
 
mavaleur ???
 
BEGIN
 
V_requete := 'Select C1,C2,C3,C4  from Entete';
OPEN list_values FOR V_requete;
 
LOOP
FETCH list_values INTO mavaleur;
EXIT WHEN list_values%NOTFOUND;
 
END LOOP;
END;
/
ton probléme c'est que tu ne sais pas comment définir mavaleur, c'est bien ça ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 16h33   #6
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 530
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 530
Points : 6 460
Points : 6 460
Orafrance il veut faire une analyse du parse de sa requête

nombre de colonnes
quel type
etc...

package DBMS_SQL quoi...
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 16h36   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
non non, pas seulement : V_requete que je doit analyser et ensuite lancer pour recuperer les valeurs selectionnées

c'est donc bien ce que je demande... je crois
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 17h09   #8
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Merci SheikYerbouti ... orafrance itoo !!!
par contre j'ai rien trouvé dans la doc ORACLE sur "dbms_sql.describe_columns2" (2) ==> :


et pour ceux que cela interesse !!! 8)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
SET serveroutput ON;
 
declare
  curseur number;     /* Pointeur sur le Curseur Dynamique  */
  result number;      /* Resultat sur l'ordre de la requete (OK/KO) */
  nbr_col integer;    /* Nbre de colonne de la requete      */
  les_colonnes dbms_sql.desc_tab;  /* Structure donnant le descriptif des colonnes */
 
 
  procedure decrit_la_colonne(rec IN dbms_sql.desc_rec) IS
  begin
    dbms_output.put_line('-----------------------------------------------------------');
    dbms_output.put_line('col_type            =    ' || rec.col_type);
    dbms_output.put_line('col_maxlen          =    ' || rec.col_max_len);
    dbms_output.put_line('col_name            =    ' || rec.col_name);
    dbms_output.put_line('col_name_len        =    ' || rec.col_name_len);
    dbms_output.put_line('col_schema_name     =    ' || rec.col_schema_name);
    dbms_output.put_line('col_schema_name_len =    ' || rec.col_schema_name_len);
    dbms_output.put_line('col_precision       =    ' || rec.col_precision);
    dbms_output.put_line('col_scale           =    ' || rec.col_scale);
    dbms_output.put('col_null_ok         =    ');
 
    IF (rec.col_null_ok) Then
           dbms_output.put_line('Oui'); 
    else    
           dbms_output.put_line('Non'); 
    end IF;
  end;
 
begin
  curseur := dbms_sql.open_cursor;
  dbms_sql.parse(curseur, 'select par_code,par_nom,par_lib,''OK'' TestOK , sysdate LA_DATE from par', dbms_sql.native);
  result := dbms_sql.execute(curseur);
  dbms_sql.describe_columns(curseur, nbr_col, les_colonnes);
 
  ----------------------------------------------------------------
  --   Je decrit les colonnes de ma requete
  ----------------------------------------------------------------
  FOR j IN 1..nbr_col Loop
      decrit_la_colonne(les_colonnes(j));
  End Loop;
 
  dbms_sql.close_cursor(curseur);
end;
/
Le resultat est le suivant

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
-----------------------------------------------------------
col_type            =    2
col_maxlen          =    22
col_name            =    PAR_CODE
col_name_len        =    8
col_schema_name     =
col_schema_name_len =    0
col_precision       =    2
col_scale           =    0
col_null_ok         =    Non
-----------------------------------------------------------
col_type            =    1
col_maxlen          =    12
col_name            =    PAR_NOM
col_name_len        =    7
col_schema_name     =
col_schema_name_len =    0
col_precision       =    0
col_scale           =    0
col_null_ok         =    Non
-----------------------------------------------------------
col_type            =    1
col_maxlen          =    40
col_name            =    PAR_LIB
col_name_len        =    7
col_schema_name     =
col_schema_name_len =    0
col_precision       =    0
col_scale           =    0
col_null_ok         =    Oui
-----------------------------------------------------------
col_type            =    96
col_maxlen          =    2
col_name            =    TESTOK
col_name_len        =    6
col_schema_name     =
col_schema_name_len =    0
col_precision       =    0
col_scale           =    0
col_null_ok         =    Oui
-----------------------------------------------------------
col_type            =    12
col_maxlen          =    7
col_name            =    LA_DATE
col_name_len        =    7
col_schema_name     =
col_schema_name_len =    0
col_precision       =    0
col_scale           =    0
col_null_ok         =    Oui
 
PL/SQL procedure successfully completed.
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 17h17   #9
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Citation:
Envoyé par orafrance
Tu peux très bien faire une boucle sur cette requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE
 
TYPE t_ref_cursor IS REF CURSOR;
list_values      t_ref_cursor;
V_requete VARCHAR2(4000);
 
mavaleur ???
 
BEGIN
 
V_requete := 'Select C1,C2,C3,C4  from Entete';
OPEN list_values FOR V_requete;
 
LOOP
FETCH list_values INTO mavaleur;
EXIT WHEN list_values%NOTFOUND;
 
END LOOP;
END;
/
ton probléme c'est que tu ne sais pas comment définir mavaleur, c'est bien ça ?
Orafrance , je trouve ton idée interessante : mais justement comment declares tu "mavaleur"
en list_values%ROWTYPE ??? ==> C'est possible ça ???
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2004, 17h34   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
bah je ne crois pas, et je suis bien embêté parce que je ne sais pas moi-même
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 10h49   #11
Membre éprouvé
 
Inscription : mai 2003
Messages : 412
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2003
Messages : 412
Points : 419
Points : 419
Citation:
Envoyé par argoet
Orafrance , je trouve ton idée interessante : mais justement comment declares tu "mavaleur"
en list_values%ROWTYPE ??? ==> C'est possible ça ???
Non c'est pas possible. Il faut que tu te construise la variable de "réception" avec un type de donnée précis.
__________________
Mes articles: http://helyos.developpez.com/
Mon site : http://www.sylohe.com
helyos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 10h54   #12
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est bien ce que je pensais
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 13h08   #13
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Pendant que le sujet est encore chaud ...
Kestion 1 : connaissez vous les différences entre dbms_sql.describe_columns2
Et dbms_sql.describe_columns :

Kestion 2 : Y a t'il une fct ou une Procedure dans dbms_sql qui fasse cette meme analyse sur la condition "where" :
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2004, 14h29   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
non, il n'y a pas sur la clause where... pour la différence, tout ce que je peux te dire c'est que j'ai jamais réussi à faire marché describe_columns , alors que describe_columns2 marche nickel
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 14h22   #15
Membre du Club
 
Inscription : janvier 2006
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 117
Points : 51
Points : 51
Citation:
Envoyé par argoet
Pendant que le sujet est encore chaud ...
Kestion 1 : connaissez vous les différences entre dbms_sql.describe_columns2 et dbms_sql.describe_columns :
Je remonte ce très vieux topic, car il vient de me servir.

Donc, si tu utilises dbms_sql.describe_columns avec certaines requêtes, tu obtiens ce message d'erreur très explicite :

Code :
1
2
3
4
5
 
ORA-06502: PL/SQL: numeric OR value error: dbms_sql.describe_columns overflow, col_name_len=33. USE describe_columns2
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1569
ORA-06512: at "SYS.DBMS_SQL", line 621
ORA-06512: at line 62
Donc a priori, mieux vaut utiliser dbms_sql.describe_columns2 . Je suppose que dbms_sql.describe_columns est l'implantation d'origine, et que les gens d'Oracle se sont rendus compte de ses faiblesses?

Merci aux gens qui ont contribué à ce topic qui m'a bien aidé.

Nico'
Nico57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 15h01   #16
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
probablement... j'ai toujours utilisé le 2 pour ma part
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 11h39   #17
Invité de passage
 
Inscription : avril 2007
Messages : 1
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 1
Points : 1
Points : 1
Par défaut votre solution d'ouvrir un curseur sur une chaine ne parche pa

comment ca marche pour vous , open cur for chaine ca marche pa
quelkun peut maidé
hjijira 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 10h19.


 
 
 
 
Partenaires

Hébergement Web