Domanda

Questo mi sta facendo impazzire da un po ':

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;

L'uso di % TYPE su un campo record non sembra funzionare. Produce il seguente errore:

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

Mentre la definizione esplicita del tipo funziona di nuovo:

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;

Qualcuno può spiegarmi perché non funziona? C'è un modo per fare riferimento al tipo dichiarato nella definizione del record invece di definirlo nuovamente esplicitamente nella funzione?

Grazie.

È stato utile?

Soluzione

guarda documentazione . % TYPE e% ROWTYPE: utilizzare solo per fare riferimento alle colonne del database. ma provi a fare riferimento al tipo di utente.

la soluzione è definire il tipo pl / sql con% TYPE-referer su una colonna del database, quindi creare una funzione con parametri che si riferiscono alla stessa colonna del database.

Aggiorna

non è la verità perché il commentatore principale pubblica un'idea utile. il riepilogo% TYPE e% ROWTYPE può riferirsi non solo alle colonne della tabella. fare riferimento a "reale" anche oggetti come variabili e cursori sono validi.

Altri suggerimenti

Devi effettivamente creare una variabile del tuo tipo per fare riferimento agli attributi.

Aggiungilo dopo la dichiarazione del tipo e prima della funzione.


  attrib_value  AttribValueRec;

Quindi nell'intestazione della funzione puoi fare riferimento al tipo di attributi nella tua funzione in questo modo:


  attr  attrib_value.attr%TYPE;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top