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

Sql*Plus Oracle Discussion :

PLS-00428: an INTO clause is expected in this SELECT statement


Sujet :

Sql*Plus Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Par défaut PLS-00428: an INTO clause is expected in this SELECT statement
    Bonjour à tous,

    J'ai une requête imbriquée à exécuter via un script SQLplus :
    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
    32
     
    SELECT * FROM product_category_content PCC 
    WHERE 
    PCC.product_category_id IN (
    SELECT 
      product_category_id 
    FROM (
      SELECT 
        CCC.campaign_id,
        CCC.product_category_id, 
        CCC.content_id 
      FROM 
        campaign CAMP,
        campaign_prod_cat_content CCC --- Ligne en erreur
      WHERE 
        CAMP.campaign_id = CCC.campaign_id 
        AND CAMP.thru_date < TO_DATE('01/07/2009', 'DD/MM/YYYY') 
        AND CAMP.is_active = 'N'
      MINUS 
      SELECT 
        CCC.campaign_id,
        CCC.product_category_id, 
        CCC.content_id 
      FROM 
        campaign CAMP,
        campaign_prod_cat_content CCC
      WHERE 
        CAMP.campaign_id = CCC.campaign_id 
        AND CAMP.thru_date >= TO_DATE('01/07/2009', 'DD/MM/YYYY') 
        AND CAMP.is_active = 'Y'
    )
    );
    Cette requête fonctionne correctement si je l'exécute dans un requêteur SQL (SQL Developer), mais pas via le script SQLplus.
    J'ai l'erreur suivante à la ligne indiquée dans le code :
    PLS-00428: an INTO clause is expected in this SELECT statement
    J'ai également essayé plusieurs emplacements dans la requête pour le INTO demandé, mais je ne comprends pas pourquoi il en faut un, et où il doit être.

    Quelqu'un a-t-il une idée ?

    Merci d'avance.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par satoreel Voir le message
    Cette requête fonctionne correctement si je l'exécute dans un requêteur SQL (SQL Developer), mais pas via le script SQLplus.
    SQLPlus n'est pas un script. Quelle opération effectuez-vous exactement?
    Cette erreur indique que votre requête est exécutée à l'intérieur d'un bloc PL/SQL.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Par défaut
    Bonjour,

    En effet, sqlplus n'est pas un script, c'est bien un abus de langage de ma part. La requête citée se trouve dans le fichier epure_01.sql, que j'exécute en lançant un .sh contenant le code suivant :
    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
     
    for i in `ls $SCRIPTS_DIRECTORY/epure_*.sql`
    do
     
    echo $i
    echo ""
     
    $ORACLE_HOME/bin/sqlplus -silent $2/$3 << EOF
     
    WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
     
    SET serveroutput ON SIZE UNLIMITED;
     
    DECLARE
    BEGIN
    @$i;
    END;
    /
    EOF
     
    done
    La requête se retrouve donc dans un bloc PL/SQL. Il semble que ce contexte particulier modifie son interprétation. Cela m'échappe pour le moment.
    Mon indication donne-t-elle suffisamment de précisions pour comprendre le problème ?

  4. #4
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    En PL/SQL, il faut absolument stocker le résultat de la requête dans des variables pour ensuite en faire quelque chose.
    Si votre besoin est simplement d'exécuter le SELECT et d'afficher son résultat, il ne faut pas l'encapsuler dans un bloc PL/SQL.
    Enlevez les lignes "DECLARE", "BEGIN", "END;" et "/" et faites simplement le "@$i".

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    C'est cela. Dans un bloc PL, le résultat d'un SELECT doit être récupéré.
    Que voulez-vous faire avec ce résultat?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Par défaut
    Bonjour à tous,

    Merci pour votre disponibilité et vos premières précisions, ça commence à s'éclaircir un peu.

    @xdescamp

    1) Si je ne suis pas dans un bloc PL/SQL, les variables déclarées/initialisées dans mon .sh seront elles visibles dans les .sql appelés ?

    2) Si je reste dans un bloc PL/SQL, comment récupérer le résultat de mon SELECT ? J'ai essayé avec un curseur, mais là aussi c'est
    encore trop nouveau pour moi. Existe-t-il un tutorial qui donne une explication pertinente de l'utilisation de ce principe ?

    3) Un UPDATE est-il soumis à la même règle que le SELECT dans un bloc PL/SQL ?

    4) Quel est l'avantage de déclarer/utiliser un bloc PL/SQL ? (lien vers article/tutorial ?)

    @GolDoz
    Je dois dans un premier temps compter les enregistrements sélectionnés par la requête (white run + rapport de volumétrie traitée),
    puis les modifier (un UPDATE ... SET ... remplacera la clause SELECT).
    Un UPDATE + la variable SQL%ROWCOUNT seront utilisés une fois que la requête passera correctement.
    Existe-t-il une manière plus appropriée ?

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Utilisez un curseur et un compteur, vous modifierez les lignes à la volée:
    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
    DECLARE
       ln_compteur   NUMBER;
    BEGIN
       FOR mon_curseur IN (SELECT ID
                             FROM ma_table
                            WHERE ceci = cela)
       LOOP
          UPDATE ma_table
             SET ma_colonne = ma_valeur
           WHERE ID = mon_curseur.ID;
     
          mon_compteur := mon_compteur + SQL%ROWCOUNT;
       END LOOP;
     
       COMMIT;
    EXCEPTION
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.put_line ('Erreur!');
          DBMS_OUTPUT.put_line (SUBSTR (SQLERRM, 1, 255));
          ROLLBACK;
    END;
    /
    UPDATE/DELETE/INSERT ne ramènent pas de lignes, donc vous pouvez les exécuter directement.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 4
    Par défaut
    Merci GoLDoZ, votre exemple m'a permis de débloquer mon problème.

    Merci à xdescamp pour votre réponse également.

    Cordialement.

Discussions similaires

  1. Utilisation des alias dans la clause WHERE d'une requête SELECT
    Par OursRêveur dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 13/07/2013, 04h34
  2. Réponses: 6
    Dernier message: 17/06/2013, 15h23
  3. T-SQL equiv de la clause WHERE (col1, col2,)IN(select )
    Par DJAIF2a dans le forum Développement
    Réponses: 1
    Dernier message: 02/08/2008, 17h31
  4. Réponses: 6
    Dernier message: 28/01/2008, 11h29
  5. Réponses: 18
    Dernier message: 01/10/2006, 19h17

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