2011-11-28 20 views
9

Czy możliwe jest zdefiniowanie typu użytkownika w definicji pakietu Oracle? Kiedy próbuję następująceOracle Typ zdefiniowany przez użytkownika wewnątrz definicji pakietu

CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec 
    -- PROCEDURE my_rpcedure (emp_id NUMBER); 
    TYPE DTO_GRID AS OBJECT 
    (
    ROWKEY NVARCHAR2(200), 
    COLUMNKEY NVARCHAR2(200), 
    CELLVALUE NVARCHAR2(200), 
    OLDVALUE NVARCHAR2(200), 
    TAG  NVARCHAR2(200) 
    ); 
END AF_CONTRACT; 
/
CREATE OR REPLACE PACKAGE BODY AF_CONTRACT AS -- body 

-- PROCEDURE my_procedure (emp_id NUMBER) IS 
-- BEGIN 
--  
-- END my_procedure; 

END AF_CONTRACT; 

zawsze pojawia się błąd

Error: PLS-00540: object not supported in this context. 

w definicji typu.

Odpowiedz

14

Nie, to nie jest dozwolone: ​​

SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec 
    -- PROCEDURE my_rpcedure (emp_id NUMBER); 
    TYPE DTO_GRID AS OBJECT 
    (
    ROWKEY NVARCHAR2(200), 
    COLUMNKEY NVARCHAR2(200), 
    CELLVALUE NVARCHAR2(200), 
    OLDVALUE NVARCHAR2(200), 
    TAG  NVARCHAR2(200) 
    ); 
END AF_CONTRACT; 
/
    2 3 4 5 6 7 8 9 10 11 12 

Warning: Package created with compilation errors. 

SQL> SQL> sho err 
Errors for PACKAGE AF_CONTRACT: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
3/4  PLS-00540: object not supported in this context. 
SQL> 

Jeśli chcesz utworzyć typ, który jest tylko przekazywanie danych między procedur PL/SQL, a następnie użyć PL/SQL RECORD składnia:

SQL> CREATE OR REPLACE PACKAGE AF_CONTRACT AS -- spec 
    -- PROCEDURE my_rpcedure (emp_id NUMBER); 
    TYPE DTO_GRID IS RECORD 
    (
    ROWKEY NVARCHAR2(200), 
    COLUMNKEY NVARCHAR2(200), 
    CELLVALUE NVARCHAR2(200), 
    OLDVALUE NVARCHAR2(200), 
    TAG  NVARCHAR2(200) 
    ); 
END AF_CONTRACT; 
/
    2 3 4 5 6 7 8 9 10 11 12 
Package created. 

SQL> 

jednak jeśli chcesz typu, które można wykorzystać w SQL - to jest jak wejście doFunkcja- musisz ją utworzyć jako typ SQL. SQL i PL/SQL używają dwóch różnych silników i tylko typy SQL są widoczne dla silnika SQL.


Moja rada dotycząca konieczności stosowania typów SQL nie jest już prawdą w przypadku późniejszych wersji Oracle. Z pewnością w 11gR2 i 12c silnik SQL będzie obsługiwał SQL w pakietach PL/SQL, które używają tabel PL/SQL w klauzuli TABLE(). Typy muszą być zadeklarowane w specyfikacji pakietu, a więc publiczne i widoczne dla silnika SQL. Pod okładkami Oracle generuje typy SQL dla każdej deklaracji. Możesz wykryć te typy, ponieważ ich nazwy zaczynają się od SYS_PLSQL_, a po nich numeryczne identyfikatory.