我有一个关于“立即执行”的问题。
我在下一个 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;
或者也许有什么办法可以做到这一点?
提前致谢。
最佳答案
对于对象名称,您必须使用连接,而不是绑定(bind)变量。
来自 Dynamic SQL chapter of the PL/SQL Language Reference :
The database uses the values of bind variables exclusively and does not interpret their contents in any way.
绑定(bind)变量有助于提高安全性和性能。但它们不适用于表格等对象。如果您传入一个表名,那么 Oracle 必须解释其内容,这将抵消安全性和性能优势。
关于sql - 如何在 EXECUTE IMMEDIATE 查询中添加表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441064/