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 :

Oracle 10g pls-00302 composant doit être déclaré


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut Oracle 10g pls-00302 composant doit être déclaré
    Bonjour,

    je dois migrer une application d' Oracle9 vers Oracle10g .

    Cette application est composée de quelques tables et d' un package PL/SQL .

    Ce package fonctionne tres bien en oracle9 .

    Tout est intégré dans le schéma d'un utilisateur que j'ai importé dans une base Oracle10 existante .

    La compilation du package est OK .

    L'execution d'une des procédures du package renvoie l' erreur :

    ORA-06550: Ligne 4, colonne 33 :
    PLS-00302: Le composant 'T_VARCHAR_1000' doit être déclaré
    ORA-06550: Ligne 4, colonne 17 :
    PL/SQL: Item ignored
    ORA-06550: Ligne 9, colonne 3 :
    PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
    ORA-06550: Ligne 9, colonne 3 :
    PL/SQL: Statement ignored
    ORA-06550: Ligne 11, colonne 83 :
    PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
    ORA-06550: Ligne 11, colonne 3 :
    PL/SQL: Statement ignored

    voici la procédure :

    PROCEDURE sql_generer_fichier_indigo (
    v_target_file IN VARCHAR2, -- Nom du fichier de sortie
    v_target_directory IN VARCHAR2, -- Nom du chemin de sortie
    v_output_file OUT t_varchar_1000
    )
    IS
    ref_fichier UTL_FILE.file_type;
    processus_name VARCHAR2 (60) := 'sql_generer_fichier_indigo';
    err_msg VARCHAR2 (300);
    err_num INTEGER;
    num_flag INTEGER;
    rc INTEGER;
    pcf$table VARCHAR2 (30);
    ligne_temp VARCHAR2 (500) := ' ';
    l_nb INTEGER := 0;
    l_rc INTEGER;

    l_target_file VARCHAR2 (60);
    v_type_evenement journal.detail%TYPE;
    v_login utilisateur.login%TYPE;
    l_code_table VARCHAR2 (60);
    v_detail journal.detail%TYPE;

    lc$montant NUMBER := 0;
    lc$annee indigo.id_annee%TYPE;
    lc$trimestre indigo.id_trimestre%TYPE;
    lc$requete VARCHAR2 (10000);

    CURSOR c_indigo
    IS
    SELECT t1.*
    FROM indigo t1
    WHERE t1.date_generation IS NOT NULL
    AND t1.date_validation IS NOT NULL
    AND t1.date_envoi IS NULL
    ORDER BY t1.id_indigo;

    CURSOR c_lignes_indigo (v_id_indigo indigo.id_indigo%TYPE)
    IS
    SELECT t1.ID_INDIGO, t1.EXERCICE, t1.CODE_COLLECTIVITE,
    t1.CODE_BUDGET, t1.ARTICLE_BUDGETAIRE, t1.FONCTION,
    t1.OPERATION, SUM (TO_NUMBER (t1.MONTANT)) AS MONTANT, t1.TVA,
    t1.ETAT_CIVIL, t1.NOM_CREANTIER, t1.TITULAIRE_COMPTE,
    t1.CODE_ETABLISSEMENT, t1.CODE_GUICHET, t1.NUMERO_COMPTE,
    t1.CLE_RIB, t1.LIBELLE_BANQUE, t1.CORRESPONDANCE_1,
    t1.CORRESPONDANCE_2, t1.NATURE_MANDAT, t1.SERVICE_EMETTEUR,
    t1.NUMERO_REGIE, t1.MODE_REGLEMENT, t1.IDENTIFIANT_STABLE,
    t1.FILLER1, t1.NUMERO_PROG, t1.EXERCICE_RATTAC,
    t1.NUMERO_MANDAT_RATTAC, t1.NUMERO_ORDRE_RATTAC, t1.NUMERO_MARCHE,
    t1.FILLER2, t1.CODE_MONNAIE, t1.SUIVI_DELAI,
    t1.DATE_DEBUT_DELAI_GLOBAL, t1.DATE_FIN_DELAI_GLOBAL, t1.DUREE_DELAI_GLOBAL,
    t1.TAUX_INTERETS_MORATOIRES, t1.FILLER3, t1.VERSION,
    t1.TYPE_ENREGISTREMENT, t1.ID_RESPONSABLE, t1.NUMERO_ORDRE_RESPONSABLE,
    t2.num_bordereau, t2.num_mandat
    FROM lignes_indigo t1, indigo t2
    WHERE t2.id_indigo = t1.id_indigo
    AND t1.id_indigo = v_id_indigo
    GROUP BY t1.ID_INDIGO, t1.EXERCICE, t1.CODE_COLLECTIVITE,
    t1.CODE_BUDGET, t1.ARTICLE_BUDGETAIRE, t1.FONCTION,
    t1.OPERATION, t1.TVA,
    t1.ETAT_CIVIL, t1.NOM_CREANTIER, t1.TITULAIRE_COMPTE,
    t1.CODE_ETABLISSEMENT, t1.CODE_GUICHET, t1.NUMERO_COMPTE,
    t1.CLE_RIB, t1.LIBELLE_BANQUE, t1.CORRESPONDANCE_1,
    t1.CORRESPONDANCE_2, t1.NATURE_MANDAT, t1.SERVICE_EMETTEUR,
    t1.NUMERO_REGIE, t1.MODE_REGLEMENT, t1.IDENTIFIANT_STABLE,
    t1.FILLER1, t1.NUMERO_PROG, t1.EXERCICE_RATTAC,
    t1.NUMERO_MANDAT_RATTAC, t1.NUMERO_ORDRE_RATTAC, t1.NUMERO_MARCHE,
    t1.FILLER2, t1.CODE_MONNAIE, t1.SUIVI_DELAI,
    t1.DATE_DEBUT_DELAI_GLOBAL, t1.DATE_FIN_DELAI_GLOBAL, t1.DUREE_DELAI_GLOBAL,
    t1.TAUX_INTERETS_MORATOIRES, t1.FILLER3, t1.VERSION,
    t1.TYPE_ENREGISTREMENT, t1.ID_RESPONSABLE, t1.NUMERO_ORDRE_RESPONSABLE,
    t2.num_bordereau, t2.num_mandat
    ORDER BY TO_NUMBER (t1.NUMERO_ORDRE_RESPONSABLE);

    -- * ************* BEGIN ****************
    BEGIN
    DBMS_OUTPUT.ENABLE (1000000);

    num_flag := 1;
    IF v_target_file IS NULL OR v_target_directory IS NULL
    THEN
    rc := 5;
    err_msg := 'Nom de fichier ou de repertoire non renseigné ! ';
    sql_print_error (num_flag, processus_name, err_msg, rc);
    RETURN;
    END IF;

    num_flag := 2;
    FOR v_indigo IN c_indigo
    LOOP
    v_output_file := t_varchar_1000 ();
    l_nb := 0;

    -- Verification des champs num_mandat et num_bordereau
    num_flag := 3;
    FOR i IN 1 .. LENGTH (v_indigo.num_mandat)
    LOOP
    num_flag := 4;
    IF SUBSTR(v_indigo.num_mandat, i, 1) NOT IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
    THEN
    rc := 6;
    err_msg := ' La valeur num_mandat=['|| v_indigo.num_mandat ||'] doit etre numerique !';
    sql_print_error (num_flag, processus_name, err_msg, rc);
    RETURN;
    END IF;
    END LOOP;

    num_flag := 5;
    FOR i IN 1 .. LENGTH (v_indigo.num_bordereau)
    LOOP
    num_flag := 6;
    IF SUBSTR(v_indigo.num_bordereau, i, 1) NOT IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
    THEN
    rc := 7;
    err_msg := ' La valeur num_bordereau=['|| v_indigo.num_bordereau ||'] doit etre numerique !';
    sql_print_error (num_flag, processus_name, err_msg, rc);
    RETURN;
    END IF;
    END LOOP;

    num_flag := 7;
    l_target_file := REPLACE(v_target_file, '%seq', TO_CHAR(v_indigo.id_indigo, 'fm0000'));
    ref_fichier := UTL_FILE.fopen (v_target_directory, l_target_file, 'w');

    l_nb := 0;

    lc$annee := v_indigo.id_annee;
    lc$trimestre := v_indigo.id_trimestre;

    num_flag := 8;
    FOR v_lignes_indigo IN c_lignes_indigo (v_indigo.id_indigo)
    LOOP

    ligne_temp := v_lignes_indigo.code_collectivite;
    ligne_temp := ligne_temp || v_lignes_indigo.code_budget;
    ligne_temp := ligne_temp || v_lignes_indigo.exercice;
    ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.num_bordereau), 'fm0000000');
    ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.num_mandat), 'fm00000000');
    ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.numero_ordre_responsable),'fm000000');
    ligne_temp := ligne_temp || v_lignes_indigo.article_budgetaire;
    ligne_temp := ligne_temp || v_lignes_indigo.fonction;
    ligne_temp := ligne_temp || v_lignes_indigo.operation;
    ligne_temp := ligne_temp || SUBSTR (TO_CHAR (TO_NUMBER (v_lignes_indigo.montant), '00000000000000.00'), 2, 14);
    ligne_temp := ligne_temp || SUBSTR (TO_CHAR (TO_NUMBER (v_lignes_indigo.montant), '00000000000000.00'), 17, 2);
    ligne_temp := ligne_temp || v_lignes_indigo.tva;
    ligne_temp := ligne_temp || v_lignes_indigo.etat_civil;
    ligne_temp := ligne_temp || v_lignes_indigo.nom_creantier;
    ligne_temp := ligne_temp || v_lignes_indigo.titulaire_compte;
    ligne_temp := ligne_temp || v_lignes_indigo.code_etablissement;
    ligne_temp := ligne_temp || v_lignes_indigo.code_guichet;
    ligne_temp := ligne_temp || v_lignes_indigo.numero_compte;
    ligne_temp := ligne_temp || TO_CHAR (TO_NUMBER (v_lignes_indigo.cle_rib), 'fm00');
    ligne_temp := ligne_temp || v_lignes_indigo.libelle_banque;
    ligne_temp := ligne_temp || RPAD (v_lignes_indigo.correspondance_1, 30);
    ligne_temp := ligne_temp || RPAD (v_lignes_indigo.correspondance_2, 30);
    ligne_temp := ligne_temp || v_lignes_indigo.nature_mandat;
    ligne_temp := ligne_temp || v_lignes_indigo.service_emetteur;
    ligne_temp := ligne_temp || v_lignes_indigo.numero_regie;
    ligne_temp := ligne_temp || v_lignes_indigo.mode_reglement;
    ligne_temp := ligne_temp || v_lignes_indigo.identifiant_stable;
    ligne_temp := ligne_temp || v_lignes_indigo.filler1;
    ligne_temp := ligne_temp || v_lignes_indigo.numero_prog;
    ligne_temp := ligne_temp || v_lignes_indigo.exercice_rattac;
    ligne_temp := ligne_temp || v_lignes_indigo.numero_mandat_rattac;
    ligne_temp := ligne_temp || v_lignes_indigo.numero_ordre_rattac;
    ligne_temp := ligne_temp || v_lignes_indigo.numero_marche;
    ligne_temp := ligne_temp || v_lignes_indigo.filler2;
    ligne_temp := ligne_temp || v_lignes_indigo.code_monnaie;
    ligne_temp := ligne_temp || v_lignes_indigo.suivi_delai;
    ligne_temp := ligne_temp || v_lignes_indigo.date_debut_delai_global;
    ligne_temp := ligne_temp || v_lignes_indigo.date_fin_delai_global;
    ligne_temp := ligne_temp || v_lignes_indigo.duree_delai_global;
    ligne_temp := ligne_temp || v_lignes_indigo.taux_interets_moratoires;
    ligne_temp := ligne_temp || v_lignes_indigo.filler3;
    ligne_temp := ligne_temp || v_lignes_indigo.VERSION;
    ligne_temp := ligne_temp || v_lignes_indigo.type_enregistrement;

    num_flag := 9;
    UTL_FILE.put_line (ref_fichier, ligne_temp);

    -- Initialisation de la variable v_output_file par une structure null et
    -- allocation memoire pour un élément dans cette structure
    num_flag := 10;
    v_output_file.EXTEND;
    v_output_file (v_output_file.LAST) := ligne_temp;
    rc := 3;

    END LOOP;

    -- Flager l'enregistrement par date_envoi pour qu'elle ne soit plus traité.
    -- Un fichier généré est un fichier considéré comme à envoyer.
    -- Si on a besoin de regenere le fihcier infigo, mettre a jour la date_envoi à null
    -- puis relancer sql_genere_fichier_indigo .

    num_flag := 11;
    UPDATE indigo
    SET date_envoi = SYSDATE
    WHERE id_indigo = v_indigo.id_indigo;

    num_flag := 12;
    UTL_FILE.fflush (ref_fichier);
    UTL_FILE.fclose (ref_fichier);

    END LOOP;

    err_msg := 'Processus=['|| processus_name ||'], génération du fichier indigo=['|| TRIM (v_target_directory) ||'\'|| TRIM(l_target_file) ||'], par l''utilisateur=['|| v_login ||']';
    sql_add_journal (evt_indigo, err_msg, 1, l_rc);

    err_msg := 'OK';
    sql_print_ok (processus_name, err_msg);
    -- * *********** EXCEPTION **************
    EXCEPTION
    -- Traitement des erreurs rencontrees
    WHEN NO_DATA_FOUND
    THEN
    sql_print_dbms ('Pas de donnée trouvée.');
    UTL_FILE.fclose (ref_fichier);
    WHEN UTL_FILE.invalid_path
    THEN
    sql_print_dbms ('UTL_FILE.INVALID_PATH invalide.');
    UTL_FILE.fclose (ref_fichier);
    WHEN UTL_FILE.read_error
    THEN
    sql_print_dbms ('UTL_FILE.READ_ERROR invlide.');
    UTL_FILE.fclose (ref_fichier);
    WHEN UTL_FILE.write_error
    THEN
    sql_print_dbms ('UTL_FILE.WRITE_ERROR invalide.');
    UTL_FILE.fclose (ref_fichier);
    WHEN OTHERS
    THEN
    rc := 9;
    err_num := SQLCODE;
    err_msg := SUBSTR (SQLERRM, 1, 200);
    sql_print_error (num_flag, processus_name, err_msg, rc);
    UTL_FILE.fclose (ref_fichier);
    END;


    L' objet T_VARCHAR_1000 qu' Oracle ne connait pas vient de l'import
    le l' ai recée à tout hasard :


    CREATE OR REPLACE TYPE t_varchar_1000 AS TABLE OF VARCHAR2 (1000);
    J'ai parcouru la doc, normalement on ne doit pas redéclaré l'objet dans le package .

    Je lance l'execution via TOAD
    le développeur de ce package m'avait précisé à l' èpoque
    qu' on ne pouvait l'executer que sous TOAD, effectivement
    sous sqlplus , il faut réécrire un petit bloc pl/sql pour le lancer .

    si vous avez une idée , car je ne suis pas moi-même développeur
    et mes connaissances déjà limitées en pl/sql sont nulles
    en objet .

    Cordialement

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Bonjour

    Première chose, le log de l'import est-il exempt de toute erreur ?
    Ensuite, un import d'un schéma unique (je suppose que c'est ce que vous avez fait) ne prend pas en compte les objets globaux de la base : rôles, synonymes publics, etc. Et ça peut être un synonyme public qui manque.

  3. #3
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    pas d'erreurs dans l' Import.

    je vérifie les dépendances ...

    cdlt

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Il s'agit probablement de la définition d'un type dans la base manquant, probablement une collection.

  5. #5
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    A priori, les schémas de l' utilisateur et PUBLIC sont identiques
    dans les deux bases .

    Est-ce possible que cela soit dû au client depuis lequel on execute
    le package ?

    les droits et rôles sont identiques .

    cdlt

  6. #6
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    Bon, j'ai trouvé l' erreur .
    En executant la procédure, ce cher TOAD cherchait le type
    t_varchar_1000 dans le package, alors qu' il était déclaré
    dans le schéma mais en dehors du package .

    une meilleure connaissance de "comment s'execute un package pl/sql" m'aurait évité ces désagréments.

    cordialement

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/09/2011, 12h04
  2. Réponses: 2
    Dernier message: 20/09/2007, 09h22
  3. Réponses: 3
    Dernier message: 26/02/2007, 15h02
  4. Réponses: 3
    Dernier message: 14/02/2007, 17h56
  5. Réponses: 2
    Dernier message: 12/12/2006, 09h48

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