2012-02-06 7 views
16

Bạn có thể vui lòng giúp tôi làm cách nào để tạo mảng hai chiều trong PL/SQL cho các thủ tục được lưu trữ? Các cột là động để nó có thể phát triển và thay đổi trong các loại cũng. Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn bạn trước!Tạo hoặc mô phỏng các mảng hai chiều trong PL/SQL

Tôi có đoạn mã sau:

Type CAR_TABLE_ARRAY is varray(2) of varchar2(255); 
TYPE CAR_TABLE_TYPE IS TABLE OF CAR_TABLE_ARRAY; 
CAR_TABLE CAR_TABLE_TYPE; 

CAR_TABLE := CAR_TABLE_TYPE(); 
CAR_TABLE.EXTEND(10); 
CAR_TABLE(1)(1) := 'DODGE'; 
CAR_TABLE(2)(1) := 'FORD'; 
CAR_TABLE(3)(1) := 'MUSTANG'; 
CAR_TABLE(4)(1) := 'EDSEL'; 
CAR_TABLE(5)(1) := 'STUDEBAKER'; 

DBMS_OUTPUT.put_line('1 ' || CAR_TABLE(1)(1)); 
DBMS_OUTPUT.put_line('2 ' || CAR_TABLE(2)(1)); 
DBMS_OUTPUT.put_line('3 ' || CAR_TABLE(3)(1)); 
DBMS_OUTPUT.put_line('4 ' || CAR_TABLE(4)(1)); 
DBMS_OUTPUT.put_line('5 ' || CAR_TABLE(5)(1)); 

Khi tôi chạy tôi nhận được lỗi sau:

ORA-06531: Reference to uninitialized collection

+0

Mảng hai chiều tính toán chỉ là ánh xạ (X, Y) -> VALUE. Vì vậy, làm thế nào về việc tạo ra một bảng tạm thời với 3 cột: X, Y, VALUE trong PL/SQL? –

+0

hi BycycleDude, cảm ơn bạn đã trả lời. Tuy nhiên tôi không thể tạo bảng tạm thời mà tôi nghĩ vì các cột cần phải động nên nó có thể thay đổi kiểu cột và số cột. – Jemru

+0

Dễ dàng, chỉ cần tạo cột 'TYPE' và tạo nhiều cột' VALUE' không có giá trị và chỉ đặt cột bạn cần: X, Y, TYPE, VALUE_FLOAT, VALUE_STRING, VALUE_TIMESTAMP, VALUE_BLOB, ... –

Trả lời

19

Dưới đây là một ví dụ của việc sử dụng một mảng đa chiều trong pl/sql. Ở đây tôi sử dụng một mảng có chứa một mảng.

declare 

    type t_features is table of varchar(100) index by pls_integer; 
    type t_car_rec is record 
    (
    make varchar2(50), 
    model varchar2(50), 
    features t_features 
); 

    type t_car_tab is table of t_car_rec index by pls_integer; 
    car_tab t_car_tab; 

    procedure show_detail is 
    car_idx pls_integer; 
    features_idx pls_integer; 
    begin 
    car_idx := car_tab.first; 
    loop 
     exit when car_idx is null; 
     dbms_output.put_line('Details for ' || car_tab(car_idx).make || ' ' || car_tab(car_idx).model); 

     features_idx := car_tab(car_idx).features.first; 
     loop 
     exit when features_idx is null; 
     dbms_output.put_line(' =>' || car_tab(car_idx).features(features_idx)); 

     features_idx := car_tab(car_idx).features.next(features_idx); 
     end loop; 

     car_idx := car_tab.next(car_idx); 
    end loop; 
    end; 

begin 

    -- using sequential index values 
    car_tab(1).make := 'Ferrari'; 
    car_tab(1).model := 'Testarossa'; 
    car_tab(1).features(1) := 'Fast'; 
    car_tab(1).features(2) := 'Looks cool'; 
    car_tab(1).features(3) := 'Expensive'; 

    -- using random index values (sparse) 
    car_tab(2).make := 'Acura'; 
    car_tab(2).model := 'TSX'; 
    car_tab(2).features(14) := 'Small'; 
    car_tab(2).features(200) := 'Good MPG'; 
    car_tab(2).features(36) := 'Inexpensive'; 

    show_detail; 

end; 

Output sẽ là:

Details for Ferrari Testarossa 
    =>Fast 
    =>Looks cool 
    =>Expensive 
Details for Acura TSX 
    =>Small 
    =>Inexpensive 
    =>Good MPG 

Hy vọng rằng sẽ giúp

3

Đó là bởi vì bạn đang tham khảo các mảng nội mà không được khởi tạo.
Hoặc là thêm một cái gì đó như:

CAR_TABLE(1) := CAR_TABLE_ARRAY(); 
CAR_TABLE(1).EXTEND(1); 
CAR_TABLE(2) := CAR_TABLE_ARRAY(); 
CAR_TABLE(2).EXTEND(1); 
... 

Hoặc làm cho các mảng nội (CAR_TABLE_ARRAY) như mảng asociative:

Type CAR_TABLE_ARRAY is TABLE of varchar2(255) index by binary_integer; 
6

VARRAY và bảng kiểu dữ liệu do người dùng định nghĩa lồng nhau luôn luôn phải được khởi tạo sử dụng một constructor. Bạn đang làm điều đó một cách chính xác cho bảng lồng nhau, nhưng không phải cho VARRAY mà nó chứa. Cách khắc phục đơn giản nhất là gọi hàm khởi tạo trong các đường phân công:

declare 
    Type CAR_TABLE_ARRAY is varray(2) of varchar2(255); 
    TYPE CAR_TABLE_TYPE IS TABLE OF CAR_TABLE_ARRAY; 
    CAR_TABLE CAR_TABLE_TYPE; 
begin  
    CAR_TABLE := CAR_TABLE_TYPE(); 
    CAR_TABLE.EXTEND(10); 
    CAR_TABLE(1) := CAR_TABLE_ARRAY('DODGE',null); 
    CAR_TABLE(2) := CAR_TABLE_ARRAY('FORD',null); 
    CAR_TABLE(3) := CAR_TABLE_ARRAY('MUSTANG',null); 
    CAR_TABLE(4) := CAR_TABLE_ARRAY('EDSEL',null); 
    CAR_TABLE(5) := CAR_TABLE_ARRAY('STUDEBAKER',null); 

    DBMS_OUTPUT.put_line('1 ' || CAR_TABLE(1)(1)); 
    DBMS_OUTPUT.put_line('2 ' || CAR_TABLE(2)(1)); 
    DBMS_OUTPUT.put_line('3 ' || CAR_TABLE(3)(1)); 
    DBMS_OUTPUT.put_line('4 ' || CAR_TABLE(4)(1)); 
    DBMS_OUTPUT.put_line('5 ' || CAR_TABLE(5)(1)); 
end;