将参数传递给假脱机文件

时间:2017-06-17 02:25:18

标签: oracle11g parameters parameter-passing spool

假设我有一个从命令提示符(SQL Plus)执行的sql文件,它运行正常。

sqlplus dbusername/dbpassword@DBInstance @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

有人可以帮忙解释如何执行此任务吗?
提前谢谢!

1 个答案:

答案 0 :(得分:3)

您对spoolfile一词的使用不正确。 sqlfilename.sql是sql文件或sqlplus文件。输出文件Test.log是假脱机文件。

你打电话

sqlplus dbusername/dbpassword@DBInstance @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来关闭它。替代品通过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。