将参数传递到假脱机文件
Pass parameter to spool file
假设我有一个从命令提示符 (SQL Plus) 执行的 sql 文件,它工作正常。
sqlplus dbusername/dbpassword@DBInstance @sqlfilename.sql
现在我需要给这个sql假脱机文件传递一个参数,根据参数值我应该能够确定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
任何人都可以帮助如何执行此任务?
提前致谢!
您对假脱机文件一词的用法不正确。 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 statement
是BEGIN statement; END
的缩写
请注意 --do something
在 PL/SQL 块中。因此,它必须由 PL/SQL 语句代替,而不是由 SQL 语句或 SQL*Plus 语句代替。
所以它不能被 CREATE TABLE ...
语句替换(这是 SQL 而不是 PL/SQL)并且它不能被 SPOOL OFF
语句替换,即 SQL *加号但不是 PL/SQL.
假设我有一个从命令提示符 (SQL Plus) 执行的 sql 文件,它工作正常。
sqlplus dbusername/dbpassword@DBInstance @sqlfilename.sql
现在我需要给这个sql假脱机文件传递一个参数,根据参数值我应该能够确定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
任何人都可以帮助如何执行此任务?
提前致谢!
您对假脱机文件一词的用法不正确。 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 statement
是BEGIN statement; END
的缩写
请注意
--do something
在 PL/SQL 块中。因此,它必须由 PL/SQL 语句代替,而不是由 SQL 语句或 SQL*Plus 语句代替。 所以它不能被CREATE TABLE ...
语句替换(这是 SQL 而不是 PL/SQL)并且它不能被SPOOL OFF
语句替换,即 SQL *加号但不是 PL/SQL.