2009-05-05 6 views
1

Cela a été me rend fou pendant un certain temps:En utilisant% TYPE sur un champ d'enregistrement en PL/SQL

DECLARE 
    TYPE AttrValueRec IS RECORD (
     attr  VARCHAR2(40), 
     val   VARCHAR2(2000), 
     inst  NUMBER(4) 
    ); 

    FUNCTION create_attrval(attr AttrValueRec.attr%TYPE, 
          val AttrValueRec.val%TYPE, 
          inst AttrValueRec.inst%TYPE := 1) 
    RETURN AttrValueRec IS 
     attr_value AttrValueRec; 
    BEGIN 
     attr_value.attr := attr; 
     attr_value.val := val; 
     attr_value.inst := inst; 
     RETURN attr_value; 
    END; 
BEGIN 
    NULL; 
END; 

En utilisant %TYPE sur un champ d'enregistrement ne semble pas fonctionner. Elle produit l'erreur suivante:

ORA-06550: line 8, column 36: 
PLS-00206: %TYPE must be applied to a variable, column, field or attribute, not to "ATTRVALUEREC.ATTR" 
ORA-06550: line 8, column 5: 
PL/SQL: Item ignored 

Tout en définissant explicitement le type fonctionne à nouveau:

DECLARE 
    TYPE AttrValueRec IS RECORD (
     attr  VARCHAR2(40), 
     val   VARCHAR2(2000), 
     inst  NUMBER(4) 
    ); 

    FUNCTION create_attrval(attr VARCHAR2, 
          val VARCHAR2, 
          inst NUMBER := 1) 
    RETURN AttrValueRec IS 
     attr_value AttrValueRec; 
    BEGIN 
     attr_value.attr := attr; 
     attr_value.val := val; 
     attr_value.inst := inst; 
     RETURN attr_value; 
    END; 
BEGIN 
    NULL; 
END; 

Quelqu'un peut-il me expliquer pourquoi il ne fonctionne pas? Existe-t-il un moyen de faire référence au type déclaré dans la définition d'enregistrement au lieu de le définir explicitement dans la fonction?

Merci.

Répondre

1

Regardez documentation. % TYPE et% ROWTYPE - utilisez uniquement pour référencer la base de données colonnes. mais vous essayez de faire référence au type d'utilisateur. Solution est de définir votre type pl/sql avec% TYPE-referer sur une colonne de base de données, puis créer une fonction avec des paramètres qui se réfèrent à la même colonne de base de données.

MISE À JOUR

sa pleine vérité pas parce que commentateur principal idée post UTILE. summary% TYPE et% ROWTYPE peuvent faire référence non seulement aux colonnes de la table. référez-vous à des objets "réels" comme des variables et les curseurs sont bons aussi.

4

Vous devez créer une variable de votre type pour faire référence aux attributs.

Ajoutez ceci après votre déclaration de type et avant la fonction.


    attrib_value AttribValueRec; 

Puis, en-tête de votre fonction, vous pouvez référencer le type des attributs dans votre fonction comme ceci:


    attr attrib_value.attr%TYPE; 
+0

grande réponse! Comment diable avez-vous trouvé cela? et la solution de contournement existe toujours en 11g ... J'espère que Oracle mettra en œuvre quelque chose de plus raisonnable bientôt. – Pancho

Questions connexes