2012-03-09 7 views
9

Sto provando a definire un type utilizzando il seguente codice.Come si crea il tipo Oracle che fa riferimento alle colonne della tabella per il tipo di dati?

CREATE OR REPLACE TYPE MY_TYPE AS OBJECT (
    app_id  some_table_name.app_id%type 
); 

Se eseguo questo, ottengo l'errore.

Error(4,32): PLS-00201: identifier 'some_table_name.app_id' must be declared 

Cosa c'è di sbagliato in questo?

+1

Ulteriori dettagli su questo [forum Oracle] (https://forums.oracle.com/forums/thread.jspa?threadID=2269924). Credo che immagino, ma mi sembrava di essere qualcosa che intuitivamente volevo fare per le migliori pratiche. – wmorrison365

risposta

19

Ciò che non va è che %type è la sintassi PL/SQL. Non è supportato in SQL.

Sono d'accordo che è un peccato, e sarebbe davvero bello se potessimo fare riferimento alle colonne della tabella in dichiarazioni di tipo come questo. Sfortunatamente Oracle ha davvero rallentato le modifiche alla loro implementazione di TYPE nell'ultimo paio di versioni, quindi penso che sia improbabile che questo cambierà nel prossimo futuro.

Quello che vorrei davvero piacerebbe vedere è Oracle sostengo questa sintassi:

CREATE OR REPLACE TYPE MY_TYPE AS OBJECT 
     ( one_row  some_table_name.%rowtype); 

oggetti dinamici per le interfacce: quanto freddo sarebbe?

+0

'% type' è sintassi PL/SQL - Questo era il bit importante che mi mancava. Grazie. – AppleGrew

+1

+1, è un peccato e renderebbe più flessibile la codifica per questo tipo di 'TYPE'. – Ollie

+0

+2 per la risposta, -1 per "cool" :-). – Ben

4

Non è possibile utilizzare some_table_name.app_id%type quando si dichiara un tipo nel database, non più di quanto si può fare questo:

create table emp (empno number, 
        deptno dept.deptnp%type, -- NOT ALLOWED 
       ); 

È necessario utilizzare un tipo built-in come il numero, VARCHAR2 (10) o un tipo definito dall'utente come mytype

+0

Grazie per la risposta. – AppleGrew