sql - 如何在 EXECUTE IMMEDIATE 查询中添加表名?

标签 sql oracle plsql

我有一个关于“立即执行”的问题。
我在下一个 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/

相关文章:

oracle - 如何在 Oracle/PLSQL 中只计算 NULL 值?

oracle - 在 Oracle 过程中的字符串中调用函数

sql - 在 SQL 中创建一个表,其中复合主键也是外键

mysql - SQL:如何连接表并将值放入单列中

python - cx_Oracle 和数据源范式

linux - 在 Red Hat Enterprise Linux Server 6.4 Santiago 上安装 node-oracle

c - 我无法在 ubuntu 上编译 OCILIB

sql - if 条件中的 Postgres 语法错误

mysql - MySQL中三张表的连接

javascript - 您可以在 PL-SQL 包中使用 JavaScript 中的 PL-SQL 过程吗?