2009-06-30 33 views
7

Trong cơ sở dữ liệu Oracle 10g, có thể tạo kiểu mảng liên kết bên ngoài gói hoặc thủ tục không? Tôi muốn để có thể làm điều này để tôi có thể tham khảo loại mảng liên kết này trong một loại khác. Ví dụ:Có thể tạo kiểu mảng kết hợp Oracle bên ngoài gói/thủ tục không?

create type my_type_map is table of varchar2(10) index by varchar2(10); 

create type my_other_type as object ( 
    id number(15), 
    member procedure initialize(p_my_type_map my_type_map) 
) not instantiable not final; 

Các lỗi tôi nhận được là:

SQL> create type my_type_map is table of varchar2(20) index by varchar2(10); 
    2/

Warning: Type created with compilation errors. 

SQL> show errors; 
Errors for TYPE MY_TYPE_MAP: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
0/0  PL/SQL: Compilation unit analysis terminated 
1/21  PLS-00355: use of pl/sql table not allowed in this context 
SQL> 

Có vẻ rằng Oracle coi:

index by varchar2(10)  

là PL/SQL và doens't cho phép nó trong việc tạo ra Các loại SQL. Nếu Oracle thực sự không cho phép các mảng kết hợp được định nghĩa bên ngoài các gói thì có một lựa chọn tốt không? Có thể tạo các loại mở rộng đối tượng của Oracle bên trong một gói để tất cả các loại được định nghĩa trong cùng một gói không?

Cảm ơn, Jeff

Sửa: Sửa mẫu mã, thêm vào nhật ký, bổ sung khả năng thay thế như câu hỏi.

+0

Khi nào bạn gặp lỗi? Tôi vừa tạo cả hai loại trên mà không có khiếu nại từ oracle, 10gR2. Ví dụ của bạn nói INDEX BY VARCHAR2, chứ không phải pls_integer ... – DCookie

+0

Đã thêm chi tiết và chỉnh sửa. Cảm ơn! – jlpp

Trả lời

5

Câu trả lời là không, bạn không thể làm những gì bạn đang cố gắng làm, nhiều hơn bạn có thể tạo một loại để thêm biến kiểu BOOLEAN vào một đối tượng. Các mục trong một đối tượng phải chứa các kiểu Oracle, không phải các kiểu PL/SQL. Một thay thế bit clunky có thể là:

CREATE TYPE t_aa AS VARRAY(10) OF VARCHAR2(10); 

CREATE OR REPLACE TYPE t_ua AS OBJECT (ID NUMBER(15) 
            , MEMBER PROCEDURE initialize(p_aa t_aa) 
            , MEMBER PROCEDURE initialize(p_aa_i taa)) 
           NOT INSTANTIABLE NOT FINAL; 

Lưu trữ các cặp liên quan của biến trong hai VARRAY. Bạn sẽ phải biết kích thước lớn nhất có thể của mảng của bạn.

+1

Cảm ơn DCookie. Tôi đã quyết định chống lại việc sử dụng các kiểu đối tượng Oracle và đang đi với các kiểu PL/SQL thẳng và bản ghi. – jlpp

+1

Tôi không phải là một fan hâm mộ lớn của Oracle Objects - Tôi không thấy những lợi ích to lớn, và họ hoàn toàn không chuẩn, làm cho cấu trúc dữ liệu của bạn không di động. – DCookie

0

Đó là các loại PL/SQL như lỗi đề xuất. Không có gì ngăn cản bạn khai báo chúng trong đặc tả chung của một gói, sau đó bạn có thể tham khảo chúng trong bất kỳ mã PL/SQL nào bạn cần.

+0

Không giống như các gói cho phép định nghĩa kiểu đối tượng: tạo hoặc thay thế gói my_package là type my_type_map là bảng varchar2 (10) chỉ mục bởi varchar2 (10); nhập my_other_type làm đối tượng ( số id (15), khởi tạo thủ tục thành viên (số p_my_type_map) ) không thể thay đổi được trước; kết thúc; Lỗi (2.1): PLS-00707: cấu trúc không được hỗ trợ hoặc lỗi nội bộ [2603] Lỗi (5,3): PLS-00540: đối tượng không được hỗ trợ trong ngữ cảnh này. Lỗi (5,3): PL/SQL: Tuyên bố bị bỏ qua Tôi có đi sai đường không? – jlpp

+0

Tôi nghĩ những gì anh ta nói là bạn nên khai báo đối tượng và kiểu pl/sql cách nhau – moleboy

+0

Một kiểu đối tượng được định nghĩa bên ngoài PL/SQL không thể tham chiếu bất cứ thứ gì trong PL/SQL. – jlpp

Các vấn đề liên quan