我不得不問的第一個問題是:這個約3000個值的列表在哪裏?如果它從另一個表的到來,那麼你可以寫類似以下內容:
SELECT JOB
FROM EMP
WHERE JOB IN (SELECT something FROM some_other_table WHERE ...)
對於這個答案的其餘部分,我會認爲這不是在數據庫中的任何地方。
理論上可以做你想做的事。有很多種方法可以用很多綁定變量來設計查詢。作爲例子,我將編寫一個腳本來使用3000個綁定變量來查詢all_objects
數據字典視圖。我不打算寫一個帶有3000個綁定變量的SQL * Plus腳本,所以我寫了一個Python腳本來生成這個SQL * Plus腳本。那就是:
ns = range(1, 9001, 3) # = 1, 4, 7, ..., 8998
# This gets rid of a lot of lines saying 'PL/SQL procedure successfully completed'.
print "SET FEEDBACK OFF;"
print
# Declare the bind variables and give them values.
for i, n in enumerate(ns):
print "VARIABLE X%04d NUMBER;" % i
print "EXEC :X%04d := %d;" % (i, n)
print
query = "SELECT object_name FROM all_objects WHERE"
# Break up the query into lines to avoid SQL*Plus' limit of 2500 characters per line.
chunk_size = 100
for i in range(0, len(ns), chunk_size):
query += "OR object_id IN (" + ",".join(":X%04d" % j for j in range(i, i + chunk_size)) + ")\n"
query = query.replace("WHEREOR", "WHERE") + ";\n"
print query
當時我能夠運行此腳本,它的輸出重定向到一個.sql
文件,然後運行該文件.sql
在SQL * Plus。
您可能注意到上面我寫'理論上這是可能的......'。理論上我把理論條款放在那裏是有原因的。該查詢似乎是有效的,我不知道它不應該執行的原因。然而,當我跑在我的Oracle實例(XE11克測試版),我得到了以下的輸出:
SQL> @genquery.sql
SELECT object_name FROM all_objects WHERE object_id IN (:X0000,:X0001,:X0002,:X0
003,:X0004,:X0005,:X0006,:X0007,:X0008,:X0009,:X0010,:X0011,:X0012,:X0013,:X0014
,:X0015,:X0016,:X0017,:X0018,:X0019,:X0020,:X0021,:X0022,:X0023,:X0024,:X0025,:X
0026,:X0027,:X0028,:X0029,:X0030,:X0031,:X0032,:X0033,:X0034,:X0035,:X0036,:X003
7,:X0038,:X0039,:X0040,:X0041,:X0042,:X0043,:X0044,:X0045,:X0046,:X0047,:X0048,:
X0049,:X0050,:X0051,:X0052,:X0053,:X0054,:X0055,:X0056,:X0057,:X0058,:X0059,:X00
60,:X0061,:X0062,:X0063,:X0064,:X0065,:X0066,:X0067,:X0068,:X0069,:X0070,:X0071,
:X0072,:X0073,:X0074,:X0075,:X0076,:X0077,:X0078,:X0079,:X0080,:X0081,:X0082,:X0
083,:X0084,:X0085,:X0086,:X0087,:X0088,:X0089,:X0090,:X0091,:X0092,:X0093,:X0094
,:X0095,:X0096,:X0097,:X0098,:X0099)
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 556
Session ID: 137 Serial number: 29
的ORA-03113
錯誤表示服務器進程崩潰。
我想在這幾個變化:
- 沒有使用在所有綁定變量
- 沒有使用
IN
名單,即寫SELECT ... FROM all_objects WHERE object_id=:X0000 OR object_id=:X0001 OR ...
(即把直接值),
- 使用OMG小馬方法,
- 使用OMG Ponies的方法而不使用綁定變量,
- 將數據從
all_objects
複製到表中,queryin相反。
以上所有方法都導致ORA-03113
錯誤。
當然,我不知道Oracle的其他版本是否會遭受這些崩潰(我無法訪問任何其他版本),但它並不是好兆頭。
編輯:你問你是否可以實現類似SELECT JOB FROM EMP WHERE JOB IN (:JOB)
。簡短的回答是否定的。爲VARIABLE
命令SQL * Plus中的使用信息如下:
Usage: VAR[IABLE] [ [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ]
所有上述類型都是單一數據值,與REFCURSOR
的例外,但在SQL * Plus似乎仍然可以把它看成一個單一的價值。我找不到以這種方式查詢以REFCURSOR
返回的數據的方法。
因此,總而言之,你試圖實現的幾乎是不可能的。我不知道你的最終目標是什麼,但我不認爲你可以在SQL * Plus中使用單個查詢。
作爲其生產環境我不能創建表只有我對SELECT子句授予。 當我從UNIX-SQL PLUS環境運行相同的查詢時,需要了解如何執行它的更多信息。 它會提示要求輸入BIND變量值,還是我可以引用一個文件,其值爲...:JOB1:='MANAGER':JOB2:='CLERK':JOB3:='ACCOUNTANT' – dilipece2001
@ dilipece2001 :如果您的帳戶僅具有SELECT特權,派生表示例應該可以工作。同樣,是的 - 因爲BIND變量是1:1關係,您需要爲每個變量定義值。 –