Utilizzo di% TYPE su un campo record in PL / SQL
-
05-07-2019 - |
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.
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;