如何在oracle中动态更改游标?
我想在运行时动态更改光标如何在oracle中动态更改游标?,oracle,plsql,Oracle,Plsql,我想在运行时动态更改光标 PROCEDURE test_cur(a IN VARCHAR2, b IN VARCHAR2) IS CURSOR cur_a IS SELECT x.col_a,x.col_b FROM tab_a x, tab_b y WHERE x.col_a = y.col_a BEGIN IF (condition) THEN FOR rec IN cur_a LOOP --DO SOME WORK END LOOP; E
PROCEDURE test_cur(a IN VARCHAR2,
b IN VARCHAR2)
IS
CURSOR cur_a IS
SELECT x.col_a,x.col_b FROM tab_a x, tab_b y
WHERE x.col_a = y.col_a
BEGIN
IF (condition) THEN
FOR rec IN cur_a LOOP
--DO SOME WORK
END LOOP;
ELSE
FOR rec IN cur_a LOOP
在这个else部分中,我想在游标的where子句中添加一些其他代码。我想知道还有别的方法吗
在这个else部分中,我想在游标的where子句中添加一些其他代码
然后简单地使用游标进行循环,这样就可以使用所需的查询进行循环
比如说,
IF (condition) THEN
FOR rec IN (SELECT .. FROM table_1 ..)
LOOP --
--DO SOME WORK
END LOOP;
ELSE
FOR rec IN (SELECT .. FROM table_2 ..)
LOOP
--DO SOME OTHER WORK
END LOOP;
DECLARE
v_sql VARCHAR2(2000);
TYPE cur IS REF CURSOR;
v_cur cur;
BEGIN
v_sql := 'SELECT x.col_a,x.col_b FROM tab_a x, tab_b y WHERE x.col_a = y.col_a';
IF (condition)
THEN
v_sql := v_sql || ' AND <desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
ELSE
v_sql := v_sql || ' AND <other desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
当然,另一种方法是使用动态sql。声明varchar2变量并分配sql的静态部分
在每个IF-ELSE部分中,保持连接所需的动态sql
比如说,
IF (condition) THEN
FOR rec IN (SELECT .. FROM table_1 ..)
LOOP --
--DO SOME WORK
END LOOP;
ELSE
FOR rec IN (SELECT .. FROM table_2 ..)
LOOP
--DO SOME OTHER WORK
END LOOP;
DECLARE
v_sql VARCHAR2(2000);
TYPE cur IS REF CURSOR;
v_cur cur;
BEGIN
v_sql := 'SELECT x.col_a,x.col_b FROM tab_a x, tab_b y WHERE x.col_a = y.col_a';
IF (condition)
THEN
v_sql := v_sql || ' AND <desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
ELSE
v_sql := v_sql || ' AND <other desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
在这个else部分中,我想在游标的where子句中添加一些其他代码
然后简单地使用游标进行循环,这样就可以使用所需的查询进行循环
比如说,
IF (condition) THEN
FOR rec IN (SELECT .. FROM table_1 ..)
LOOP --
--DO SOME WORK
END LOOP;
ELSE
FOR rec IN (SELECT .. FROM table_2 ..)
LOOP
--DO SOME OTHER WORK
END LOOP;
DECLARE
v_sql VARCHAR2(2000);
TYPE cur IS REF CURSOR;
v_cur cur;
BEGIN
v_sql := 'SELECT x.col_a,x.col_b FROM tab_a x, tab_b y WHERE x.col_a = y.col_a';
IF (condition)
THEN
v_sql := v_sql || ' AND <desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
ELSE
v_sql := v_sql || ' AND <other desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
当然,另一种方法是使用动态sql。声明varchar2变量并分配sql的静态部分
在每个IF-ELSE部分中,保持连接所需的动态sql
比如说,
IF (condition) THEN
FOR rec IN (SELECT .. FROM table_1 ..)
LOOP --
--DO SOME WORK
END LOOP;
ELSE
FOR rec IN (SELECT .. FROM table_2 ..)
LOOP
--DO SOME OTHER WORK
END LOOP;
DECLARE
v_sql VARCHAR2(2000);
TYPE cur IS REF CURSOR;
v_cur cur;
BEGIN
v_sql := 'SELECT x.col_a,x.col_b FROM tab_a x, tab_b y WHERE x.col_a = y.col_a';
IF (condition)
THEN
v_sql := v_sql || ' AND <desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
ELSE
v_sql := v_sql || ' AND <other desired conditions>';
OPEN v_cur FOR v_sql;
LOOP
--DO SOME WORK
END LOOP;
如果您的where条件发生动态变化,为什么不为此使用动态SQL呢。 声明所需的select查询以及各种where条件。根据条件执行相应的sql语句 请参阅以下链接中的官方文档
如果您的where条件发生动态变化,为什么不为此使用动态SQL呢。 声明所需的select查询以及各种where条件。根据条件执行相应的sql语句 请参阅以下链接中的官方文档
为什么不创建一个游标并将子句的一部分与您的条件放在一起:
CURSOR cur_a IS
SELECT x.col_a,x.col_b FROM tab_a x, tab_b y
WHERE x.col_a = y.col_a
AND (condition AND (rest of your where clause));
因此,只需一个光标和您需要的尽可能多的“条件”。
要知道Oracle将优化where子句,以忽略条件为false的所有部分,这样除了编译之外就不会产生任何成本
我在Oracle非常复杂的搜索屏幕中使用了这种技术。效果很好
我希望这有帮助
Christian为什么不创建一个光标,并将该子句的一部分与您的条件放在一起:
CURSOR cur_a IS
SELECT x.col_a,x.col_b FROM tab_a x, tab_b y
WHERE x.col_a = y.col_a
AND (condition AND (rest of your where clause));
因此,只需一个光标和您需要的尽可能多的“条件”。
要知道Oracle将优化where子句,以忽略条件为false的所有部分,这样除了编译之外就不会产生任何成本
我在Oracle非常复杂的搜索屏幕中使用了这种技术。效果很好
我希望这有帮助
ChristianLalith,我的光标约为350行,因此您的答案将降低代码的可读性。Lalith,我的光标约为350行,因此您的答案将降低代码的可读性。