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

  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 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    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 169
    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 169
    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 é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
    Bonjour,

    J'ai simplifié au max la requête pour que ce soit compréhensible.
    Je n'ai pas pas besoin du count(*), c'est juste pour faire des tests.

    En gros j'ai environ 20 requêtes SQL à exécuter.
    Les 20 requêtes n'ont besoin que de max 10.000 ligne plutôt que l'ensemble de la DB avec plusieurs millions.

    Je souhaite faire une store proc qui fait un premier call et récupère max 10.000 ligne clients.
    Puis on requête 20 fois sur cette mini-table.

    Je souhaite pré-loader les données de 3/4 tables, puis réaliser l'ensemble des traitements sans à chaque fois refaire mes select.

  9. #9
    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
    En gros j'ai environ 20 requêtes SQL à exécuter.
    Est ce que ces SQLs renvoient le même nombre de colonnes, même type de données?

  10. #10
    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.

  11. #11
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 169
    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 169
    Par défaut
    Citation Envoyé par rockley Voir le message
    Bonjour,

    Je souhaite faire une store proc qui fait un premier call et récupère max 10.000 ligne clients.
    Puis on requête 20 fois sur cette mini-table.

    Je souhaite pré-loader les données de 3/4 tables, puis réaliser l'ensemble des traitements sans à chaque fois refaire mes select.

    Si tu comptes réutiliser les données plusieurs fois alors stocke les dans une Global Temporary Table. Tu pourras alors requêter cette table directement.

  12. #12
    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
    Mais si j'ai 10 requêtes concurrentes ça va planter non ?
    Au moment où il va vouloir créer la table temporaire ça va péter je pense.

    La question est simple.
    Est-il possible de créer une table locale intermédiaire et de requêter dessus sur oracle.

  13. #13
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 169
    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 169
    Par défaut
    Non dans Oracle une table temporaire tu ne la crées qu'une fois. Son contenu est automatiquement vidée, soit quand tu commites (si la table est définie ON COMMIT DELETE ROWS), soit quand la session prend fin (ON COMMIT PRESERVE ROWS). L'avantage d'une table temporaire est que son contenu est privé à la session. Donc plusieurs sessions différentes peuvent utiliser la même table temporaire de manière indépendante.
    Si tu as besoin d'une table dont le contenu est visible pour plusieurs sessions, alors crée une table de travail. C'est une vraie table que tu gères comme une table de travail. Pareil tu ne la crées qu'une seule fois.
    Perso je définis mes tables de travail en NOLOGGING car son contenu n'aura pas besoin d'être restauré en cas de crash.

  14. #14
    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 à tous pour vos retours.
    Je vais clôturé mon poste.

    Ce que j'avais en tête n'est finalement pas faisable.

+ 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