我有一个关于“EXECUTE IMMEDIATE”的问题。 我在下一个plsql语句
中动态更改了表名DECLARE
TYPE CurTyp IS REF CURSOR;
cur CurTyp;
str1 VARCHAR2(30);
str2 VARCHAR2(30);
table_name VARCHAR2(30);
BEGIN
select data
into table_name
from ref
where o_id = 111
and a_id = 222;
OPEN cur FOR
'select name, sname from :1 b,myobjects a where a.obj_id = b.obj_id'
USING table_name;
LOOP
FETCH cur INTO str1, str2;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(str1||str2);
END LOOP;
CLOSE cur;
END
是否可以将下一个执行立即查询的结果读取到游标?
'select name, sname from :1 b,myobjects a where a.obj_id = b.obj_id'
USING table_name;
或者有没有办法做到这一点?
提前致谢。
答案 0 :(得分:6)
您可以使用ref_cursor 见http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm
示例:
CREATE OR REPLACE PROCEDURE query_invoice(
month VARCHAR2,
year VARCHAR2) IS
TYPE cur_typ IS REF CURSOR;
c cur_typ;
query_str VARCHAR2(200);
inv_num NUMBER;
inv_cust VARCHAR2(20);
inv_amt NUMBER;
BEGIN
query_str := 'SELECT num, cust, amt FROM inv_' || month ||'_'|| year
|| ' WHERE invnum = :id';
OPEN c FOR query_str USING inv_num;
LOOP
FETCH c INTO inv_num, inv_cust, inv_amt;
EXIT WHEN c%NOTFOUND;
-- process row here
END LOOP;
CLOSE c;
END;
/
但正如@jonearles所说,你不能将表名插入为params
答案 1 :(得分:5)
对于对象名,您必须使用连接,而不是绑定变量。
来自Dynamic SQL chapter of the PL/SQL Language Reference:
数据库专门使用绑定变量的值,并且确实如此 不以任何方式解释其内容。
绑定变量有助于提高安全性和性能。但它们不适用于像表这样的对象。如果传入表名,则Oracle必须解释内容,这将抵消安全性和性能优势。