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 :

Erreur ORA-00913: too many values


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut Erreur ORA-00913: too many values
    Bonjour à tous,
    j'ai une erreur de code sous Oracle que voici. En fait je crée une fonction dans un package, là voici. C'est une requête en PL/SQL.

    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
    function p1 ( p1_id in number) return varchar2
        is
        retour varchar2(80);
        begin
     
        retour := null;
     
        begin
        SELECT paym.payment_method_code
        INTO retour
        FROM ap_suppliers fou,
        ap_supplier_sites_all fous,
        iby_external_payees_all payee,
        iby_ext_party_pmt_mthds paym
        WHERE fou.party_id = payee.payee_party_id
        AND payee.ext_payee_id = paym.ext_pmt_party_id
        AND fous.vendor_site_id = p1_id
        AND fou.vendor_id = fous.vendor_id
        AND fous.vendor_site_id = payee.supplier_site_id
        AND paym.primary_flag = 'Y';
        exception
        when no_data_found then null;
        end;
        return retour;
        end;
    Ensuite, j'essaye d'insérer cette fonction dans une table pour me retourner une valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into table_test (
        org_id,
        champ_test
        )
        select
        fous.org_id, --ORG_id
        package1.p1 (fous.vendor_site_id)
        from ap_supplier_sites_all fous
        where ( fous.vendor_site_id) in (select DISTINCT vendor_site_id_attribute1 from table_test2_v);
    Mais en retour j'ai une erreur. Pourtant j'ai bien 2 champs dans mon INSERT. Pourquoi il met cette erreur 'Too many values' ? Quelqu'un a une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into table_test (
        *
        ERROR at line 1:
        ORA-00913: too many values

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    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 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour,

    Es tu sûr que ta fonction ne retourne qu'au plus une ligne?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Bonjour

    Non, je ne suis pas sûr et je soupçonne qu'elle retourne plusieurs lignes.
    Mais comment le savoir ? Sur SQLDeveloper par exemple

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 757
    Points : 52 535
    Points
    52 535
    Billets dans le blog
    5
    Par défaut
    Votre erreur ne serait-elle pas ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    in (select DISTINCT vendor_site_id_attribute1 from table_test2_v)
    Combien de valeurs sont retournées par cette sous-requête ?
    Optez pour un jointure !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    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 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Il faudrait joindre la requête de la fonction à la requête servant à l'insertion Déjà, pour savoir si c'est bien le problème, ajoute "or too_many_rows" à l'exception de ta fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    when no_data_found or too_many_rows then null;

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Il faudrait joindre la requête de la fonction à la requête servant à l'insertion Déjà, pour savoir si c'est bien le problème, ajoute "or too_many_rows" à l'exception de ta fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    when no_data_found or too_many_rows then null;

    Alors que je rajoute le too_many_rows, j'ai le message Package created No errors
    En revanche, la console ne me rend pas la main, donc pour quitter je fais un CTRL C et j'ai ce message

    Nom : error.PNG
Affichages : 2182
Taille : 4,9 Ko

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    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 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Tu dois annuler quand tu fais la requête d'insertion?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Non, c'est juste depuis que j'ai ajouté le too_many_values

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Le problème vient clairement de cette fonction là, car j'ai testé une autre fonction (avec une autre requête à l'intérieur) dans mon INSERT et ça fonctionnait

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Si je fais un ROWNUM <= 1 dans le WHERE de mon fonction, ça va me ramener qu'une ligne, non ?

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    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 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Oui, mais "au hasard". Si peut importe la ligne retournée si plusieurs occurrences sont trouvées, alors tu peux utiliser rownum = 1 en effet.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    OK, j'essaye ça dans un 1er temps pour voir le résultat.
    Mais je pense que je devrais trouver autre chose pour avoir une cohérence des données.

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    ORA-00913 or ORA-00947 complains about returned number of columns, not rows

  14. #14
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Merci
    Donc je retourne trop de colonnes ? Ce n'est pas le nombre de lignes le souci ?
    Effectivement, mon ROWNUM <= 1 n'a rien changé pour l'instant, toujours le même souci

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Votre erreur ne serait-elle pas ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    in (select DISTINCT vendor_site_id_attribute1 from table_test2_v)
    Combien de valeurs sont retournées par cette sous-requête ?
    Optez pour un jointure !

    A +
    Alors effectivement, je pense que la piste est plutôt à creuser ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DISTINCT vendor_site_id_attribute1 from table_test2_v
    me retourne 25 lignes.

  16. #16
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    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 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Non ce n'est pas grave si la sous-requête ramène plusieurs lignes. Au fait le distinct ne sert à rien dans une sous-requête IN, dans ce cas il vaut mieux faire un EXISTS.
    Il faut y aller par étape. D'abord, enlever l'appel à la fonction. Est-ce que l'instruction suivante fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    insert into table_test (
        org_id,
        champ_test
        )
        select
        fous.org_id, --ORG_id
        'Test', --package1.p1 (fous.vendor_site_id)
        from ap_supplier_sites_all fous
        where exists (select 1 from table_test2_v v
                            where v.vendor_site_id_attribute1  = fous.vendor_site_id
                           );

  17. #17
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par NewJS Voir le message
    Alors effectivement, je pense que la piste est plutôt à creuser ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select DISTINCT vendor_site_id_attribute1 from table_test2_v
    me retourne 25 lignes.
    ce n'est pas le nombre de lignes le problème.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Non ce n'est pas grave si la sous-requête ramène plusieurs lignes. Au fait le distinct ne sert à rien dans une sous-requête IN, dans ce cas il vaut mieux faire un EXISTS.
    Il faut y aller par étape. D'abord, enlever l'appel à la fonction. Est-ce que l'instruction suivante fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    insert into table_test (
        org_id,
        champ_test
        )
        select
        fous.org_id, --ORG_id
        'Test', --package1.p1 (fous.vendor_site_id)
        from ap_supplier_sites_all fous
        where exists (select 1 from table_test2_v v
                            where v.vendor_site_id_attribute1  = fous.vendor_site_id
                           );
    Oui tout à fait. Cela fonctionne, j'ai testé d'autres fonctions (que j'avais crée dans mon package) et le INSERT se passe sans problèmes.
    C'est vraiment cette fonction en particulier qui me ramène l'erreur Erreur ORA-00913: too many values au moment de l'INSERT.

    Quand je l'a crée dans mon package et que je compile, c'est crée avec succès et sans erreur. C'est vraiment au moment d'insérer ce champ dans ma table qu'il y a une erreur.

  19. #19
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 757
    Points : 52 535
    Points
    52 535
    Billets dans le blog
    5
    Par défaut
    Votre fonction utilise la même table (ap_supplier_sites_all fous) que la requête. Il est probable que vous avez alors une récursivité induite....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  20. #20
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Intéressant. Mais quand j'ai crée d'autres fonctions, celles ci utilisaient aussi la même table, et il n'y avait pas d'erreur au moment de l'INSERT.

Discussions similaires

  1. Erreur du type "too many indices for array"
    Par scorpion291084 dans le forum Général Python
    Réponses: 2
    Dernier message: 27/09/2015, 17h14
  2. [Python 2.X] too many values to unpack
    Par Sh0rtY dans le forum Général Python
    Réponses: 5
    Dernier message: 07/07/2014, 19h22
  3. [MySQL] Erreur accès dossier : Too many levels of symbolic links
    Par Max_ASUS dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 27/05/2010, 09h59
  4. Réponses: 6
    Dernier message: 16/04/2010, 15h02
  5. Pgsql : erreur de connexion 'too many clients ...'
    Par petitmoosse dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/08/2003, 14h03

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