2010-10-18 9 views
7

İlişkisel diziyi kullanırken SELECT FROM kullanmak mümkün mü? Bir .NET uygulamasında saklı bir yordam için bir dizi geçiriyorum ve ben başka bir tablodan seçim yaparken bu diziyi bir koşul olarak kullanmak istiyorum. Ben prosedüre kimlikleri dizisi geçiyorum Diyelim, ben bunu yapmak mümkün istiyorum:PLSQL Birleştirici dizisinden seçim yapın mı?

dizisi için tip pakette tanımlanır

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

:

type id_array is type of number index by pls_integer

cevap

1

Hayır, SQL'de DB tanımlı Yuvalı Tablolar türlerini kullanabilmenize rağmen, select from ifadelerinde SQL kullandığınızdan, PL/SQL dizileri arasından seçim yapamazsınız. This short article başlamanıza yardımcı olabilir.

bir bakmak bu basit sentetik exmple atın:

> 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

? Sadece veri iletmek için kullanılır mı? – ashtame

+0

Bir ilişkilendirme dizisini bir tablo olarak yayınlamak mümkün mü? – ashtame

+0

@ashtame SQL'de ilişkisel diziyi kullanmanın bir yolu yok, yalnızca iç içe geçmiş tablolar ve değişkenler izin verdi. – andr

10

Evet, bir ardışık fonksiyonu ile dizi sararak mümkündür.

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

GÜNCELLEME: Burada pipelined fonksiyonlar üzerinde iyi bir astar var https://galobalda.wordpress.com/2014/08/02/new-in-oracle-12c-querying-an-associative-array-in-plsql-programs/

örn: Oracle 12c şimdi sürece tip bir paket spec açıkça belirtildiği gibi, TABLO operatörünü kullanarak ilişkilendirilebilir diziler sorgulama destekler

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

PLSQL kullanan bir örnek (iç içe geçmiş bir tablodan seçmek için):

Yani hiç bir ilişkisel dizi erişmenin bir yolu yoktur
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; 
/