Ger*_*ton 15 sql oracle scripting plsql
我有一个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;
Run Code Online (Sandbox Code Playgroud)
Ste*_*erg 15
如果从sqlplus运行此脚本(看起来就是这种情况),则需要使用DEFINE命令,该命令允许您创建仅直接字符串替换的sqlplus子代变量,例如:
define tableNm = 'customers2008'
select * from &tableNm;
Run Code Online (Sandbox Code Playgroud)
有关如何使用它们的更多信息,请参阅使用Sql*Plus.您可以使用预定义的位置替换变量从命令行将值传递到脚本中,如下所示:
define tableNm = &1
select * from &tableNm;
Run Code Online (Sandbox Code Playgroud)
...然后像这样调用sqlplus:
sqlplus user/pwd@server @myscript.sql customers2008
Run Code Online (Sandbox Code Playgroud)
如果未在命令行中传入值,则将提示脚本调用程序输入值.
有关绑定和替换变量之间的差异,请参阅下面的Dave Costa的答案.
要尝试添加一些解释:
您尝试使用的方法称为绑定变量.绑定变量在Oracle SQL中由冒号后跟标识符标识.绑定变量的目的是在解析SQL语句时不需要知道它的值.语句可以解析一次,然后执行多次,并使用绑定到变量的不同值.
为了解析SQL语句,必须知道所涉及的表名和列名.因此,表名不能由绑定变量表示,因为在解析时不会知道该值.
如果你只是通过SQLPlus执行SQL和内联PL/SQl,那么替换变量是处理这个问题的一种简单方法,正如史蒂夫解释的那样.当SQLPlus客户端读取命令时,替换变量将替换为其值,然后甚至将其发送到Oracle进行解析.
你必须做这样的事情:
EXECUTE IMMEDIATE 'select * from' || tableNm;
Run Code Online (Sandbox Code Playgroud)
这是因为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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78271 次 |
| 最近记录: |