使用关联数组时是否可以使用SELECT FROM?我通过.NET应用程序将数组传递给存储过程,并且我希望能够在从另一个表中进行选择时将该数组用作条件。假设我正在向程序传递一系列ID,我希望能够这样做:
select * from table1 where userID in (select column_value from array)
数组的类型在包中定义:
type id_array is type of number index by pls_integer
答案 0 :(得分:11)
是的,可以通过使用流水线函数包装数组来实现。这是关于流水线功能的一个很好的入门:
http://www.oracle-developer.net/display.php?id=429
更新:Oracle 12c现在支持使用TABLE运算符查询关联数组,只要在包规范中声明类型:https://galobalda.wordpress.com/2014/08/02/new-in-oracle-12c-querying-an-associative-array-in-plsql-programs/
e.g。
select * from table1
where userID in (select column_value from table(array));
答案 1 :(得分:1)
不,您不能从PL / SQL数组中选择,因为您在select from
语句中使用SQL,尽管您可以在SQL中使用DB定义的嵌套表类型。 This short article可以帮助您入门。
看看这个简单的合成例子:
> 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
答案 2 :(得分:-1)
使用PLSQL(从嵌套表中选择)的示例:
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;
/