【发布时间】:2014-03-08 20:20:30
【问题描述】:
有人可以帮助我创建一个示例,以实现使用 IN 子句并将结果填充到游标的动态查询。 输入参数可以是数组或字符串连接。
我尝试了很多,但没有成功。
谢谢..
【问题讨论】:
-
请参考:我也有这个问题。 stackoverflow.com/questions/34497184/…
标签: oracle dynamic database-cursor in-clause
有人可以帮助我创建一个示例,以实现使用 IN 子句并将结果填充到游标的动态查询。 输入参数可以是数组或字符串连接。
我尝试了很多,但没有成功。
谢谢..
【问题讨论】:
标签: oracle dynamic database-cursor in-clause
每个人都有的经典情况。您可以根据您的数组或其他东西动态地形成一个查询字符串。并用作 OPEN CURSOR。 .
DECLARE
v_mystring VARCHAR(50);
v_my_ref_cursor sys_refcursor;
in_string varchar2='''abc'',''bcd''';
id2 varchar2(10):='123';
myrecord tablename%rowtype;
BEGIN
v_mystring := 'SELECT a.*... from tablename a where name= :id2 and
id in('||in_string||')';
OPEN v_my_ref_cursor FOR v_mystring USING id2;
LOOP
FETCH v_my_ref_cursor INTO myrecord;
EXIT WHEN v_my_ref_cursor%NOTFOUND;
..
-- your processing
END LOOP;
CLOSE v_my_ref_cursor;
END;
IN 子句最多支持 1000 个项目。您始终可以使用表来代替。
该表可能是Global Temporary Table(GTT),其数据对特定会话可见。
您仍然可以使用nested table(如 PL/SQL 表)
TABLE() 将 PL/Sql 表转换为 SQL 可理解的表对象(实际上是一个对象)
下面是一个简单的例子。
CREATE TYPE pr AS OBJECT
(pr NUMBER);
/
CREATE TYPE prList AS TABLE OF pr;
/
declare
myPrList prList := prList ();
cursor lc is
select *
from (select a.*
from yourtable a
TABLE(CAST(myPrList as prList)) my_list
where
a.pr = my_list.pr
order by a.pr desc) ;
rec lc%ROWTYPE;
BEGIN
/*Populate the Nested Table, with whatever collection you have */
myPrList := prList ( pr(91),
pr(80));
/*
Sample code: for populating from your TABLE OF NUMBER type
FOR I IN 1..your_input_array.COUNT
LOOP
myPrList.EXTEND;
myPrList(I) := pr(your_input_array(I));
END LOOP;
*/
open lc;
loop
FETCH lc into rec;
exit when lc%NOTFOUND; -- Your Exit WHEN condition should be checked afte FETCH iyself!
dbms_output.put_line(rec.pr);
end loop;
close lc;
END;
/
【讨论】: