2009-07-24 41 views
15

我有一個pl \ sql腳本,我想將腳本中使用的表名設置爲一個變量。所以,從我在網上找到的一些例子中,我寫下了下面的代碼。第一部分的工作原理,所以我認爲我的一般語法是正確的,但第二部分,我試圖使用一個變量爲一個表名錯誤(「SQL錯誤:ORA-00903:無效的表名」)。如何在表格名稱的oracle腳本中使用變量

任何人都知道我在做什麼錯...我沒有做很多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; 
+1

僅供參考:根據您的示例,您並未真正使用PL/SQL。我認爲你的意思是你有一個SQLPlus腳本。從技術上講,你的exec命令正在調用PL/SQL,但總體來說,你在這裏展示的是SQLPlus命令。 – 2009-07-24 19:57:36

+1

嗯,從技術上說,他使用了兩種 - 腳本中的變量命令聲明瞭一個PL/SQL綁定變量。 – 2009-07-24 20:08:06

回答

6

Substitution variables工作:

SQL> select * from &table_name; 
Enter value for table_name: dual 
old 1: select * from &table_name 
new 1: select * from dual 

D 
- 
X 
+0

哈!偉大的思想家都認爲 - 即使文檔鏈接是相同的。 – 2009-07-24 19:50:31

14

如果您正在從sqlplus的這個腳本(這看起來是如此),你要使用DEFINE命令,它允許你創建的sqlplus substition變量這只是直串替換,如:

define tableNm = 'customers2008' 
select * from &tableNm; 

Using Sql*Plus的更多信息,如何將這些被使用。您可以使用預定義的位置substition變量值傳遞到腳本的命令行,像這樣:

define tableNm = &1 
select * from &tableNm; 

...,然後調用sqlplus中,像這樣:

sqlplus user/[email protected] @myscript.sql customers2008 

如果你不這樣做在命令行傳遞一個值,腳本調用者將被提示輸入值。

有關綁定和替換變量之間的差異,請參閱Dave Costa的回答。

8

要嘗試添加一些說明:

您試圖使用的方法被稱爲綁定變量。一個綁定變量在Oracle SQL中通過冒號後跟一個標識符來標識。綁定變量的目的是在解析SQL語句時不需要知道它的值;該語句可以被解析一次,然後使用綁定到變量的不同值執行多次。

爲了解析SQL語句,必須知道涉及的表名和列名。所以表名不能用綁定變量來表示,因爲在解析時這個值是不知道的。正如Steve解釋的那樣,如果您只是簡單地通過SQLPlus執行SQL和內聯PL/SQl,那麼替換變量是解決此問題的簡單方法。當SQLPlus客戶端讀取命令時,替換變量會替換爲其值,然後它甚至會將其發送到Oracle進行分析。

7

你必須做這樣的事情:

EXECUTE IMMEDIATE 'select * from' || tableNm; 

這是因爲Oracle不允許表綁定變量(或任何其它對象名稱)。

使用EXECUTE IMMEDIATE方法會產生重大的安全隱患:當tableNm值是用戶提供的時,您可以全面打開SQL injection攻擊。

相關問題