Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在oracle中动态更改游标?_Oracle_Plsql - Fatal编程技术网

如何在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非常复杂的搜索屏幕中使用了这种技术。效果很好

我希望这有帮助


Christian

Lalith,我的光标约为350行,因此您的答案将降低代码的可读性。Lalith,我的光标约为350行,因此您的答案将降低代码的可读性。