2012-07-18 34 views
1

我正在嘗試編寫一個運行單個任意過程的sql * plus腳本。棘手的部分是我希望能夠運行該過程,而不管該過程需要多少個參數。是否可以通過編程在Oracle SQL * plus腳本中構造替換變量的名稱?

爲了找出正確的參數號的程序,我做了以下內容:

SELECT COUNT(*) INTO v_in 
    FROM all_arguments 
    WHERE LOWER(owner) = LOWER(v_schema) 
    AND LOWER(package_name) = LOWER(v_package) 
    AND LOWER(object_name) = LOWER(v_proc) 
    AND in_out = 'IN'; 

當談到時間來建立執行,立即串,我想用一些循環要做到這一點。參數全部正在通過編號,& 1到& n。

FOR i IN 1..v_in 
    LOOP 
    v_block := v_block || '''' || &i || ''''; 
    IF i != v_in THEN 
    v_block := v_block || ','; 
    END IF; 
    END LOOP; 

但這不起作用。它看到&我當然認爲它是一個名爲i的參數,並且由於調度應用程序(Appworx ...呃)沒有運行定義i =某事,所以這個失敗慘不忍睹。

有沒有什麼辦法可以做到這一點間接,這樣我可以迭代通過,但是很多對於給定的過程恰好是正確的?

+0

下降的*&*從*我*?這只是一個變量,對吧? – 2012-07-18 20:23:52

+0

是的,但我需要(在循環中)添加第四個參數,然後是第五個參數,然後是第六個參數,依此類推,直到我已經抓取了此腳本文件的所有參數。我需要一些擴展到&4,然後到&5等的東西。 – 2012-07-18 20:30:57

回答

1

你可以用new_value和默認的SQL * Plus參數來欺騙它。

創建這樣一個腳本,例如說TEST.SQL:

-- hide output 
set termout off 

-- define parameter variables to be set with new_value 
col par1 new_value 1 noprint 
col par2 new_value 2 noprint 
col par3 new_value 3 noprint 

-- initialize parameter variables 
select 1 par1, 2 par2, 3 par3 from dual where 1=2; 

-- append comma to parameter variables, not needed for first parameter 
select nullif(','||'&2',',') par2, nullif(','||'&3',',') par3 from dual; 

-- show output 
set termout on 

-- you actual script starts here 
prompt calling procedure my_proc(&1 &2 &3) 

-- for next run 
undef 1 
undef 2 
undef 3 

現在打電話與@test 3 4

輸出:

calling procedure my_proc(3 ,4) 

或致電與@test 1 2 3

輸出:

calling procedure my_proc(1 ,2 ,3) 

現在您需要將其擴展到您的參數的最大預期數量。

(請注意,您必須登錄,使這項工作,否則將select from dual默默地失敗。)

1

你想製作動態sql,不知道將涉及多少個參數。 Asktom has the authoritative answer for this。不要打擾「新」的方法。它不適合你,因爲你不知道有多少參數。

基本上,您將通過串聯創建動態sql,但參數將存儲在sys_context中,以便查詢將具有綁定。這有助於像SQL注入這樣的事情。

+0

Tom Kyte自己提出了一種不同的方法,您總是使用所有綁定變量(它與上述文章鏈接),請參閱http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:1669972300346534908 – 2012-07-19 06:25:52

+1

如果你不知道有多少個綁定變量,那很難做到。 – 2012-07-19 12:44:52

+0

你是對的,當然 - 我正在考慮一個程序有一個固定數量的參數,你只想使用非空參數來限制結果集。抱歉。 – 2012-07-19 19:19:36

相關問題