使用绑定变量动态传递表和列名称

Gau*_*oni 4 sql oracle plsql oracle11gr2

有没有办法使用绑定变量动态地将列名和表名传递给查询?这可以通过使用简单的连接运算符来完成||,但我想要一种不同的方法来实现这一点.

编辑

OPEN abc_cur FOR 'Select :column_name
                  from :table_name' 
                USING column_name,table_name;
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我传递column_nameempno,ename,并table_name作为emp

但这种方法对我不起作用.除了传统的连接方法之外,是否有可能采用不同的方法?

Jus*_*ave 16

表和列名称不能作为绑定变量传递,否.绑定变量的重点是Oracle可以为语句生成一次查询计划,然后使用不同的绑定变量值多次执行它.如果优化程序不知道正在访问哪个表或者正在选择和筛选哪些列,则它无法生成查询计划.

如果您的关注与SQL注入攻击有关,并且假设动态SQL实际上是必要的(大多数情况下,需要求助于动态SQL意味着数据模型存在问题),您可以使用该DBMS_ASSERT来验证表名称和列名不包含嵌入式SQL.

  • @Gaurav Soni-您是否担心字符串连接本身很慢?你正在做过多的硬解析?您是否正在为SQL注入攻击打开安全漏洞?或者是其他东西?大多数设计良好的系统都不需要使用动态SQL,所以我总是怀疑动态SQL被用来掩盖糟糕的设计.但是,如果您确实需要查询是动态的,则需要动态组合字符串. (2认同)

Ton*_*ews 5

你不能。更改查询中的表名或列名会更改该查询的语义 -即它变成一个不同的查询。

绑定变量都是关于将不同的值传递给同一查询。优化器可以重用具有不同值的查询,而不必重新解析和优化查询。