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 :

Requêter sur une table/collection ? ORA-00942: Table ou vue inexistante


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut Requêter sur une table/collection ? ORA-00942: Table ou vue inexistante
    Bonjour,

    J'ai l'erreur ORA-00942: Table ou vue inexistante sur la requête ci-dessous

    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
    DECLARE
       TYPE cli_row IS RECORD
       (
           id               client.id%TYPE,
           name             client.name%TYPE
       );
       TYPE cli_tab_type IS TABLE OF cli_row;
       cli_tab   cli_tab_type;
       nb_rec INT;
    BEGIN
        Select  id, name
        BULK COLLECT INTO cli_tab
        FROM client 
        WHERE name='dupont';
    
        dbms_output.put_line('deb');
        
        SELECT 
            COUNT(*)
        INTO nb_rec FROM cli_tab;
        
        dbms_output.put_line('Value of Cur (0): ' || nb_rec);
    END;
    Le but final serait réutiliser x fois la table cli_tab.
    Mais ça ne fonctionne pas. Je ne sais pas faire de from cli_tab


    Comment faire ?
    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    Je n'ai pas essayé ton code, mais selon moi tu dois explicitement mentionner que tu traites ta collection comme une table, si je peux dire.
    Ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     SELECT 
            COUNT(*)
        INTO nb_rec FROM TALBE(cli_tab);
    En plus, je ne crois pas que tu puisses utiliser un type déclaré locallement dans la procédure. Je pense que tu vas devoir passer par un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    CREATE OR REPLACE TYPE cli_row AS OBJECT (
    -- ... mettre les bons champs ici
    );
    --
    -- et
    --
    CREATE OR REPLACE TYPE cli_tab AS TABLE OF cli_row ;
    ET ensuite aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        Select  cli_row (id, name)
        BULK COLLECT INTO cli_tab
        FROM client 
        WHERE name='dupont';
    A tester, je fais ça "à main levée" si je peux dire..

    @+

  3. #3
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Malheureusement ça n'a pas l'aire de fonctionner.

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Citation Envoyé par rockley Voir le message
    Malheureusement ça n'a pas l'aire de fonctionner.
    Salut,
    Ce genre de message n'aidera personne à t'aider (justement).
    Poste ici si possible suffisamment de code (la totalité du code) qui permette de reproduire ce que tu essaies de faire.

    @+

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_rec := cli_tab.COUNT ;
    ?

  6. #6
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Merci pour vos retours,

    Sunchaser j'ai fait comme tu as dit.
    Mais le problème c'est qu'il vient ajouter le schéma (Table(schemaName.cli_tab)) et donc ça plante.

    J'ai trouvé une autre solution qui fonctionne, mais ce n'est pas ce que je souhaite.
    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
     
    create global temporary table tabCli(
        id               client.id%TYPE,
        name             client.name%TYPE
    ) ON COMMIT delete ROWS;
    Declare
        nb_rec INT;
    Begin
        insert into tabCli
            Select  id, name
            BULK COLLECT INTO cli_tab
            FROM client 
            WHERE name='dupont';
     
        SELECT COUNT(*) INTO nb_rec FROM tabCli;
        dbms_output.put_line('Value of Cur (0): ' || nb_rec);
     
        execute immediate 'TRUNCATE TABLE tabCli';
        execute immediate 'DROP TABLE tabCli';
        commit;
    End;


    Comment faire pour mettre les records dans une variable "local" puis faire des requêtes sur cette variable encore et encore ?
    Le count(*) n'est qu'un exemple.

    Je ne suis pas hyper chaud pour la table temporaire car si on a deux requête qui arrivent en même temps, ça peut casser.

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Tu ne peux pas utiliser directement une variable de type nested table dans une requête SQL.
    Comme l'a suggéré JeitEmgie, si tu souhaites compter le nombre d'éléments de ta collection alors utilise la méthode count (cli_tab.count).

    Cela dit, as-tu vraiment besoin d'utiliser des collections? Le mieux est souvent de faire en SQL directement.

  8. #8
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Citation Envoyé par rockley Voir le message
    Sunchaser j'ai fait comme tu as dit.
    Mais le problème c'est qu'il vient ajouter le schéma (Table(schemaName.cli_tab)) et donc ça plante.

    Je suis désolé, je ne comprends pas du tout. Qui est "il"? J'aurais bien aimé voir le code (complet) que tu as essayé avec le type et la collection, comme proposé.
    La, c'est pas facile de comprendre la situation.

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

Discussions similaires

  1. Récupération du résultat d'une requête sur une table liée
    Par champijulie dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2007, 12h26
  2. Effectuer une requête sur une table.
    Par Premium dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/05/2007, 16h27
  3. Recupérer le résultat d'une requête sur une table Firebird
    Par defluc dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/04/2007, 18h30
  4. Réponses: 5
    Dernier message: 08/01/2007, 21h03
  5. requéte sur une table
    Par iutcien dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/06/2006, 15h42

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