我想动态更改运行时光标。
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子句中添加一些其他代码。我想知道还有其他办法吗?
答案 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