2012-03-09 17 views
9

Próbuję zdefiniować type przy użyciu następującego kodu.Jak utworzyć typ Oracle, który odwołuje się do kolumn tabeli dla typu danych?

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

Jeśli to uruchomię, pojawia się błąd.

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

Co jest nie tak z tym?

+1

Więcej informacji na ten temat [forum Oracle] (https://forums.oracle.com/forums/thread.jspa?threadID=2269924). Wydaje mi się, że to rozsądne, ale wydawało mi się, że jest to coś, co intuicyjnie chciałem zrobić dla najlepszej praktyki. – wmorrison365

Odpowiedz

19

Co jest nie tak z tym, że %type jest składnią PL/SQL. Nie jest obsługiwany w SQL.

Zgadzam się, że to wstyd i byłoby naprawdę fajnie, gdybyśmy mogli odwoływać się do kolumn tabeli w deklaracjach typu takich jak ta. Niestety, Oracle naprawdę spowolniło zmiany w ich implementacji TYPE w ostatnich kilku wersjach, więc myślę, że jest mało prawdopodobne, że to się zmieni w najbliższej przyszłości.

Co bym naprawdę chciałbym zobaczyć jest Oracle obsługuje tej składni:

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

dynamicznych obiektów dla interfejsów: jak fajnie byłoby to możliwe?

+0

'% type' to składnia języka PL/SQL - to był ważny element, który przegapiłem. Dzięki. – AppleGrew

+1

+1, to wstyd i sprawiłoby, że kodowanie tego rodzaju "TYPE" jest bardziej elastyczne. – Ollie

+0

+2 za odpowiedź, -1 za "fajne" :-). – Ben

4

Nie można używać some_table_name.app_id%type podczas deklarowania typ w bazie danych, nie bardziej niż można to zrobić:

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

Musisz użyć albo wbudowany w rodzaju takich jak liczba, VARCHAR2 (10) lub typ zdefiniowany przez użytkownika, taki jak mytype

+0

Dzięki za odpowiedź. – AppleGrew