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 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 176
    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 176
    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 176
    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 176
    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 176
    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 176
    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