将参数传递给假脱机文件

Sar*_*avu 1 parameters spool parameter-passing oracle11g

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

sqlplus dbusername/dbpassword@DBInstance @sqlfilename.sql
Run Code Online (Sandbox Code Playgroud)

现在我需要将一个参数传递给这个 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助如何执行此任务吗?
提前致谢!

mir*_*173 5

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

你打电话

sqlplus dbusername/dbpassword@DBInstance @sqlfilename.sql A
Run Code Online (Sandbox Code Playgroud)

调用以下文件

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;
Run Code Online (Sandbox Code Playgroud)
  • & 变量的替换是简单的文本替换。可以通过执行将其关闭SET DEFINE OFF。替换会通过 sqlplus 引发信息消息,可以通过执行将其关闭SET VERIFY OFF

  • 您应该从命令开始SPOOL,在开始假脱机到日志文件之前,您不会看到执行的命令引发的错误。这会使调试变得乏味。另外你应该先执行所有命令SPOOL OFF

  • 命令行中的参数通过其位置号来引用。我更喜欢将它们分配给命名变量并稍后使用该命名变量。这是没有必要的。您也可以稍后使用位置参数,而不是使用命名参数。但是,如果参数的位置发生变化,使用命名参数可以更轻松地更改文件。如果您选择合适的名称,它还可以记录参数的用途。我在这个例子中没有。

  • 您不能在参数替换之前禁用&字符的特殊属性。SET DEFINE OFF你必须推迟它,直到完成所有替换。否则替换将不起作用。

  • 绑定变量是用VAR ...sqlplus中的语句定义的。在 SQL 文本中,必须使用前面的冒号 (:) 来引用它。

  • EXEC statement是一个缩写BEGIN statement; END

  • 请注意,它--do something位于 PL/SQL 块中。因此必须用 PL/SQL 语句代替,而不是 SQL 语句或 SQL*Plus 语句。所以它不能被语句代替CREATE TABLE ...(这是SQL但不是PL/SQL),也不能被SPOOL OFF语句代替,这是SQL*Plus但不是PL/SQL。