[英]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.