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

PL/SQL Oracle Discussion :

SQL dyanmic Cursor et SPLT de String PLS-00457


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut SQL dyanmic Cursor et SPLT de String PLS-00457
    Bonjour,

    j'ai l'erreur PLS-00457: les expressions doivent être de type SQL dans une procedure PL sous Oracle10
    J'utilise du SQL dynamic et c'est au moment ou open le curseur
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    DECLARE
           -- TYPE typeTeu_tab IS TABLE OF LO_TEU.TEU_UID%TYPE INDEX BY BINARY_INTEGER;
            TYPE typeTeu_tab IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
     
    ----
    ----
     
     PROCEDURE P_EXPORT_CONSO_VESSEL(pLst IN VARCHAR2
     
      v_SQLYEAR varchar2(4000);
    TYPE CURSOR_EXPORT IS REF CURSOR;
       cValuationReport   CURSOR_EXPORT;
     arrayTeu typeTeu_tab; 
     arrayTeu:=SPLIT (vLst,',');
     
     v_SQLYEAR :='SELECT 
    ----
    ----
    v_SQLYEAR+'(select teu_uid from lo_teu where TEU_UID in (: arrayTeu))';
     
    //Erreur ICI  PLS-00457: les expressions doivent être de type SQL 
      OPEN  cValuationReport FOR v_SQLYEAR USING   arrayTeu;
           LOOP
      END LOOP;
     
    END P_EXPORT_CONSO_VESSEL;
     
    BEGIN
    vLst:='2,6,8,10,12';
    P_EXPORT_CONSO_VESSEL(vLst,

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Il y a un tutoriel de SQL dynamique sur ce site et plan des exemples sur Internet. Cherchez aussi sur ce forum comment passer des valeurs à une requête avec In ou allez sur "Varying in lists..." ou Oracle-Base "Dynamic IN-Lists"

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    Merci,

    Cela fonctionne t'il directement depuis SQLDevelopper et Oracle10 Express Edition ?
    Lorsque je met "TYPE myTableType AS TABLE OF VARCHAR2(100);" dans mon package PL/SQL, cela ne passe pas, SQLDevelopper met objet Opaque ?
    Erreur(4,25): PLS-00103: Symbole "TABLE" rencontré à la place d'un des symboles suivants : object opaque


    J'ai essayé aussi sans succes
    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
     
     
    --type myTableType2 is table  of  LO_VESSEL.VESSEL_uid%TYPE ;
    --select * from lo_vessel where vessel_uid in(dp_lo_graph.in_list3('1,2,3,4,5'))
    function in_list3( p_string in varchar2 ) return myTableType2
    as
    l_data          myTableType2 := myTableType2();
        BEGIN
          dbms_utility.comma_to_table(p_string , l_tablen, l_tab);
         for i in 1..l_tablen
         loop
           l_data.extend;
             l_data(l_data.count) := l_tab(i);
         end loop;
         return l_data;
       END in_list3;
    select * from lo_vessel where vessel_uid in(dp_lo_graph.in_list3('1,2,3,4,5'));
    invalid data type

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Voilà un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Begin
     For rEmp In (Select employee_id, first_name, last_name
                   From hr.employees e
                  Where e.department_id In (Select column_value 
                                             From Table(sys.odcinumberlist(10, 20, 30)))
                 )
     Loop
       dbms_output.put_line(To_Char(rEmp.employee_id)||' '||rEmp.first_name||','||rEmp.last_Name);
     End Loop;                                         
    end;
    Je ne sais plus si la collection sys.odcinumberlist fonctionne en Oracle 10g (de mémoire oui) mais sinon il suffit de définir une collection des entiers au niveau du schéma où le bloc PL/SQL s'exécute et de modifier le code en conséquence.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    MERCI c'est ok
    Je dois mettre cela dans un package avec un autre curseur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    set serveroutput on
    Begin
     dbms_output.put_line('DEBUT');
     For rEmp In (Select vessel_uid, vessel_name
                   From lo_vessel e
                  Where e.vessel_uid In (Select column_value 
                                             From Table(sys.odcinumberlist(2,6,8,10, 20, 30)))
                 )
     Loop
       dbms_output.put_line(To_Char(rEmp.vessel_uid)||' '||rEmp.vessel_Name);
     End Loop;
     dbms_output.put_line('FIN');
    end;

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Et pourquoi pas tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from lo_vessel where ',1,2,3,4,5,' like '%,' || vessel_uid || ',%';
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete sql + stockage données dans un tableau String.
    Par halloumiali dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 11/04/2012, 14h06
  2. [SQL Server 2005] From int to String
    Par Prodige2020 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 08/10/2011, 12h02
  3. java.sql.SQLException:Cursor not valid.
    Par TOPGUN89 dans le forum Websphere
    Réponses: 2
    Dernier message: 12/07/2007, 13h30
  4. [PL/SQL] Ref Cursor
    Par duboisfa dans le forum Oracle
    Réponses: 1
    Dernier message: 24/02/2006, 16h15
  5. Réponses: 1
    Dernier message: 05/12/2005, 12h50

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