如何在oracle中动态更改游标?

时间:2015-07-30 08:22:41

标签: 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;
ELSE
 FOR rec IN cur_a LOOP

在这个else部分,我想在游标的where子句中添加一些其他代码。我想知道还有其他办法吗?

3 个答案:

答案 0 :(得分:2)

  

在这个else部分,我想在游标的where子句中添加一些其他代码。

然后只需使用光标FOR循环,这样就可以使用所需的查询循环。

例如,

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;

当然,另一种方法是使用动态sql 。声明 varchar2 变量并分配sql的静态部分。

在每个 IF-ELSE 部分内,保持连接所需的动态sql。

例如,

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;

答案 1 :(得分:2)

为什么不创建一个游标并将条款的一部分与您的条件放在一起:

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));

所以只有一个光标和多个条件&#39;你需要。 知道Oracle会优化where子句以忽略条件为false的所有部分(因此除了编译之外没有任何其他成本)。

我在Oracle的非常复杂的搜索屏幕中使用了这种技术。效果很好。

我希望有所帮助。

基督教

答案 2 :(得分:0)

如果你的where条件动态变化,为什么不使用Dynamic SQL呢? 声明您想要的选择查询以及各种条件。根据条件执行相应的sql

请参阅以下官方文档链接

http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm