2017-06-17 79 views
1

假設我有一個從命令提示符(SQL Plus)執行的SQL文件,該文件工作正常。將參數傳遞給假脫機文件

sqlplus dbusername/[email protected] @sqlfilename.sql 

現在我需要傳遞一個參數到這個sql spool文件,並根據參數的值我應該能夠確定sql文件中的功能。在下面的SQL代碼,我需要存儲我傳遞的參數和變量parameter_Value

SET SERVEROUTPUT ON 
SET DEFINE OFF 
SPOOL "Test.log" 

var parameter_Value VARCHAR2(20); 
BEGIN 
    IF(parameter_Value='A') 
    THEN 
      --do something 
    ELSE 
      --do something 
    END IF; 
END; 
/

SPOOL OFF; 
SET DEFINE ON 
SET SERVEROUTPUT OFF 

任何人都可以請幫助如何執行此任務的價值?
在此先感謝!

回答

2

您對spool文件這個詞的用法不正確。 sqlfilename.sql是sql文件或sqlplus文件。輸出文件Test.log是假脫機文件。

你叫

sqlplus dbusername/[email protected] @sqlfilename.sql A 

調用下面的文件

SPOOL "Test.log" 
DEFINE MY_VALUE=&1 

SET SERVEROUTPUT ON 


var parameter_Value VARCHAR2(20); 

EXEC :parameter_Value:='&MY_VALUE' 

SET DEFINE OFF 

BEGIN 
    IF(:parameter_Value='A') 
    THEN 
      --do something 
    ELSE 
      --do something 
    END IF; 
END; 
/

SET DEFINE ON 
SET SERVEROUTPUT OFF 
SPOOL OFF; 
  • 的&變量的替代是一個簡單的文本替換。它可以通過執行SET DEFINE OFF來關閉。該substituion提出了通過sqlplus的信息的消息,可以通過執行SET VERIFY OFF

  • 被關閉,你應該用SPOOL命令開始,你不會看到執行的命令引發的錯誤你啓動後臺到日誌文件之前。這可以使調試乏味。你也應該執行所有的命令之前SPOOL OFF

  • 命令行中的參數是由他們的位置號參考。我更喜歡將它們分配給一個已命名的變量,並稍後使用已命名的變量。這不是必需的。您也可以稍後使用位置參數,而不是使用命名參數。但是如果參數的位置發生變化,使用命名參數可以更輕鬆地更改文件。如果您選擇適當的名稱,它也可以記錄參數的用途。我沒有在這個例子中。

  • 在參數替換之前,您不能禁用&字符的特殊屬性SET DEFINE OFF。你必須推遲它,直到你完成了所有的替換。否則,替換將不起作用。

  • 綁定變量是用sqlplus中的VAR ...語句定義的。在SQL文本中,它必須用前面的冒號(:)引用。

  • EXEC statementBEGIN statement; END

  • 的縮寫注意,--do something處於PL/SQL塊。所以它必須由PL/SQL語句替代,而不是由SQL語句或SQL * Plus語句替代。 因此它不能被CREATE TABLE ...語句(這是SQL而不是PL/SQL)替代,並且它不能被SPOOL OFF語句替換,該語句是SQL * Plus而不是PL/SQL。

+0

這就是很棒的奇蹟。Wll解釋:) @ miracle173 –