簡體   English   中英

如何在oracle腳本中使用變量來表名

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM