[英]how to use a variable in oracle script for the table name
我有一个pl \\ sql脚本,我想将脚本中使用的表名设置为变量。 因此,从我在网上找到的一些例子中,我编写了下面的代码。 第一部分工作,所以我认为我的一般语法是正确的,但第二部分,我尝试使用一个变量的表名称它错误(“ SQL错误:ORA-00903:无效的表名 ”)。
有人知道我做错了什么......我没有做很多PL \\ SQL所以也许我只是错过了一些明显的东西。
--works
variable numOfrecords number;
exec :numOfrecords := 10;
select * from customers2008 where rownum < :numOfrecords;
--does not work
variable tableNm CHAR;
exec :tableNm := 'customers2008';
print tableNm;
select * from :tableNm;
如果从sqlplus运行此脚本(看起来就是这种情况),则需要使用DEFINE命令,该命令允许您创建仅直接字符串替换的sqlplus子代变量,例如:
define tableNm = 'customers2008'
select * from &tableNm;
有关如何使用它们的更多信息,请参阅使用Sql * Plus 。 您可以使用预定义的位置替换变量从命令行将值传递到脚本中,如下所示:
define tableNm = &1
select * from &tableNm;
...然后像这样调用sqlplus:
sqlplus user/pwd@server @myscript.sql customers2008
如果未在命令行中传入值,则将提示脚本调用程序输入值。
有关绑定和替换变量之间的差异,请参阅下面的Dave Costa的答案。
要尝试添加一些解释:
您尝试使用的方法称为绑定变量 。 绑定变量在Oracle SQL中由冒号后跟标识符标识。 绑定变量的目的是在解析SQL语句时不需要知道它的值; 语句可以解析一次,然后执行多次,并使用绑定到变量的不同值。
为了解析SQL语句,必须知道所涉及的表名和列名。 因此,表名不能由绑定变量表示,因为在解析时不会知道该值。
如果你只是通过SQLPlus执行SQL和内联PL / SQl,那么替换变量是处理这个问题的一种简单方法,正如史蒂夫解释的那样。 当SQLPlus客户端读取命令时,替换变量将替换为其值,甚至在将其发送到Oracle进行解析之前。
你必须做这样的事情:
EXECUTE IMMEDIATE 'select * from' || tableNm;
这是因为Oracle不允许表(或任何其他对象名称)的绑定变量。
使用EXECUTE IMMEDIATE方法会产生重大的安全隐患:当tableNm值是用户提供的时,您对SQL注入攻击持开放态度。
替换变量有效:
SQL> select * from &table_name;
Enter value for table_name: dual
old 1: select * from &table_name
new 1: select * from dual
D
-
X
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.