【发布时间】:2019-09-12 14:23:17
【问题描述】:
如何在游标选择查询中使用 EXECUTE IMMEDIATE。
CREATE OR REPLACE PROCEDURE biq_attendee_report (in_from_date IN DATE)
IS
l_cur_query VARCHAR2 (5000) := 'SELECT * from table X where c1='|| in_from_date;
CURSOR cur_attendee_data
IS
EXECUTE IMMEDIATE l_cur_query;
TYPE rec_attendee_data IS TABLE OF cur_attendee_data%ROWTYPE
INDEX BY PLS_INTEGER;
l_cur_attendee_data rec_attendee_data;
BEGIN
OPEN cur_attendee_data;
LOOP
FETCH cur_attendee_data BULK COLLECT INTO l_cur_attendee_data;
EXIT WHEN l_cur_attendee_data.COUNT = 0;
DBMS_OUTPUT.put_line ('here in first insert');
lrec := return_attendee_report ();
out_attendee_tab :=
return_attendee_arr_result (return_attendee_report ());
out_attendee_tab.DELETE;
FOR i IN 1 .. l_cur_attendee_data.COUNT
LOOP
BEGIN
NULL;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error occurred : ' || SQLERRM);
END;
END LOOP;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('HERE INSIIDE OTHERS' || SQLERRM);
END;
这里我尝试在开始块之外使用初始化游标,但它会引发异常,如何为游标编写动态查询,
cur_attendee_data is
EXECUTE IMMEDIATE l_cur_query;
错误(113,8):PLS-00103:在预期以下情况之一时遇到符号“CUR_ATTENDEE_DATA”::=。 (@%;
【问题讨论】:
-
你从哪里得到
l_date?是in_from_date吗? -
你的代码中没有动态的东西(至少,看起来不是这样;
l_cur_query看起来不对;你发布了你真正拥有的东西吗?);为什么要使用execute immediate?此外,您“忘记”关闭光标。 -
@Littlefoot,如果你没有关闭光标,那将永远不会抛出错误。
-
@Ankit,打开的光标必须关闭 - 如果没有别的,因为有一个好的做法。除此之外,假设您打开它,从未关闭它,然后 - 在您的程序稍后 - 尝试再次打开相同的光标。那么,是的——它会抛出一个错误(ORA-06511: PL/SQL: cursor already open)。
-
动态查询的原因是什么?