2010-10-18 32 views
7

Có thể sử dụng SELECT FROM khi sử dụng mảng kết hợp không? Tôi đang chuyển một mảng tới một thủ tục được lưu trữ thông qua một ứng dụng .NET và tôi muốn có thể sử dụng mảng đó làm điều kiện khi chọn từ một bảng khác. Cho phép nói rằng tôi đang đi qua một loạt các ID để các thủ tục, tôi muốn có thể làm điều này:Chọn từ mảng PLSQL Associative?

select * from table1 where userID in (select column_value from array)

Loại cho mảng được định nghĩa trong gói:

type id_array is type of number index by pls_integer

Trả lời

1

Không, bạn không thể chọn từ các mảng PL/SQL, vì bạn sử dụng câu lệnh SQL trong câu lệnh select from, mặc dù bạn có thể sử dụng các kiểu bảng lồng nhau do DB định nghĩa trong SQL. This short article có thể giúp bạn bắt đầu.

Hãy xem một exmple tổng hợp đơn giản này:

> create type temp_t as table of int;/ 
Type created. 
> select 'test' from dual where 1 in (select * from table(temp_t(1,2,3))); 

'TES 
---- 
test 
+0

Vì vậy, không có cách nào tiếp cận một mảng kết hợp ở tất cả? Nó chỉ được sử dụng để truyền dữ liệu? – ashtame

+0

là nó có thể đúc một mảng kết hợp như một bảng? – ashtame

+0

@ashtame không có cách nào bạn có thể sử dụng mảng kết hợp trong SQL, chỉ cho phép các bảng lồng nhau và vectơ. – andr

10

Vâng, đó là có thể, bằng cách gói mảng với một hàm pipelined. Dưới đây là một mồi tốt về chức năng pipelined:

http://www.oracle-developer.net/display.php?id=429

UPDATE: Oracle 12c bây giờ hỗ trợ truy vấn các mảng kết hợp sử dụng các nhà điều hành TABLE, miễn là kiểu được khai báo trong một spec gói: https://galobalda.wordpress.com/2014/08/02/new-in-oracle-12c-querying-an-associative-array-in-plsql-programs/

ví dụ

select * from table1 
where userID in (select column_value from table(array)); 
-1

Một ví dụ sử dụng PLSQL (để chọn từ một bảng lồng nhau):

create type temp_r as OBJECT(
    temp_varchar2 varchar2(100), 
    temp_number number(20) 
    ); 
/

create type temp_t as TABLE of temp_r; 
/ 

set serveroutput on size 1000000 
/

-- PLSQL starts here 
declare 
    temp_rec temp_r := temp_r(null, null); -- empty constructor to initialize object 
    temp_table temp_t := temp_t();   -- empty constructor to initialize object 
    lv_ref_cursor  SYS_REFCURSOR; 

    lv_temp_varchar2 varchar(100); 
    lv_temp_number number(20); 

begin 
    temp_rec.temp_varchar2 := 'first'; 
    temp_rec.temp_number := 1; 

    temp_table.extend; 
    temp_table(1) := temp_rec; 
    temp_table.extend; 
    temp_table(2) := temp_r('second', 2); 


    OPEN lv_ref_cursor FOR 
     SELECT temp_varchar2, temp_number 
     FROM table(temp_table) 
     where temp_number = 1; 

    fetch lv_ref_cursor into lv_temp_varchar2, lv_temp_number; 
    close lv_ref_cursor; 

    dbms_output.put_line('returns: ' || lv_temp_varchar2 || ', ' || lv_temp_number); 

end; 
/
Các vấn đề liên quan