我已经声明了以下光标和变量:
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行
有谁知道我做错了什么? 感谢
答案 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?那也是使用动态脚本?
永远记住,动态脚本应该是最后一个和最后一个选项。你应该避免它。