oracle sql动态查询选择游标中的列

时间:2014-01-31 15:09:02

标签: oracle plsql toad

我已经声明了以下光标和变量:

l_level           VARCHAR2(100);
l_level_value     VARCHAR2(100);
l_select_clause   CLOB;
CURSOR l_data IS
    SELECT LEVEL1, LEVEL2, LEVEL3 
     FROM  LEVELS;

然后我遍历光标:

FOR c1line IN l_data
LOOP
    CASE WHEN c1line.LEVEL1 IS NULL THEN l_level := 'c1line.LEVEL2'
         WHEN c1line.LEVEL2 IS NULL THEN l_level := 'c1line.LEVEL3'
         WHEN c1line.LEVEL3 IS NULL THEN l_level := 'c1line.LEVEL4'
         ELSE l_level := NULL
    END CASE;
END LOOP;

l_select_clause := 'SELECT ' || l_level || ' INTO l_level_value FROM dual;';

EXECUTE IMMEDIATE l_select_clause;

然后我根据变量l_level_value

中选择的内容执行其他一些语句

我的问题是,当执行我的程序时,我收到以下错误:

ORA-00904:“C1LINE”。“LEVEL2”:标识符无效 ORA-06512:在“MY_PROCEDURE”,第110行 ORA-06512:第2行

有谁知道我做错了什么? 感谢

2 个答案:

答案 0 :(得分:1)

关于实际错误c1line.LEVEL1,您是否动态打开游标?它似乎在您展示的代码中有效

然后..

EXECUTE IMMEDIATE接受绑定变量,而INTO应该仅在执行之后。需要说明的是,查询字符串

中不需要使用分号(;
l_select_clause := 'SELECT ' || l_level || '  FROM dual';

EXECUTE IMMEDIATE l_select_clause INTO l_level_value;

答案 1 :(得分:0)

我的问题是,你真的需要动态脚本吗?我的意思是同样的操作可以作为

执行
FOR c1line IN l_data
LOOP
    CASE WHEN c1line.LEVEL1 IS NULL THEN l_level_value := c1line.LEVEL2
         WHEN c1line.LEVEL2 IS NULL THEN l_level_value := c1line.LEVEL3
         WHEN c1line.LEVEL3 IS NULL THEN l_level_value := c1line.LEVEL4
         ELSE l_level_value := NULL
    END CASE;
END LOOP;

为什么要采取两个步骤?首先将值赋给l_level,然后将相同的值赋给l_level_value?那也是使用动态脚本?

永远记住,动态脚本应该是最后一个和最后一个选项。你应该避免它。