PLSQL 将变量传递给外部 .SQL 脚本
PLSQL Passing Variables to External .SQL Scripts
我有 2 个脚本,Script1.sql 和 Script2.sql。 Script1.sql 从数据库中的 table 检索一些数据,然后我想将这些数据传递给 Script2.sql 以供使用。
Script1.sql如下:
SET SERVEROUTPUT ON;
DECLARE
FundRecord Test_Table%ROWTYPE;
CURSOR Fund_Cursor IS SELECT Code, YOURNAME FROM Test_Table;
BEGIN
OPEN Fund_Cursor;
LOOP
FETCH Fund_Cursor INTO FundRecord;
EXIT WHEN Fund_Cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Script1: ' || FundRecord.Code);
END LOOP;
CLOSE Fund_Cursor;
END;
/
@C:\Temp\Script2.sql FundRecord.Code;
而Script2.sql如下:
BEGIN
DBMS_OUTPUT.PUT_LINE('Script 2:' || ' ' || '&1');
END;
/
Script1.sql和Script2.sql的输出如下:
Script1: ABDCE
Script2: FundRecord.Code
为什么 Script2 的输出是 FundRecord.Code 而不是我期望的 'ABCDE'?
我如何传递它以确保 Script2 获得 'ABCDE' 作为参数?
谢谢
你可以试试
@Script2.sql param1
并且在 Script2 SQL 文件中,将参数引用为
&1
更新 1
这是我的测试用例,运行良好。
SELECT SYSDATE FROM &1;
此 SQL 语句保存为 Test.sql 并从 SQLPLUS 调用为
@D:\Test.sql dual
其中 dual 是传递给 Test.sql 文件的参数
结果显示在下面的屏幕截图中
记录FundRrecord
只存在于PL/SQL块中。您需要声明一个可以在块外使用的单独变量:
set autoprint on serverout on
var somevalue varchar2(20)
col somevalue new_value somevalue
begin
for r in (
select dummy from dual
)
loop
dbms_output.put_line('Script 1: ' || r.dummy);
:somevalue := r.dummy;
end loop;
end;
/
@C:\Temp\Script2.sql &somevalue
SQL*Plus 中提供了 column ... new_value ...
语法,用于报告中的页眉和页脚,但它在脚本中也非常有用,因为它设置了一个 define
变量(最后)查询结果。 set autoprint on
告诉 SQL*Plus 在每个 PL/SQL 块之后打印任何绑定变量(带有前导 :
的变量)的值,它通过生成一个查询,允许我们设置 column ... new_value
并在替换变量中捕获结果。
编辑:关于 SQL 开发人员兼容性,我会在有机会时尝试一些东西,但您可以尝试添加一些与
类似的东西
select :somevalue as somevalue from dual;
在 PL/SQL 块之后,如果 column ... new_value
构造与 SQL*Plus 相同,但 autoprint
不相同。
我有 2 个脚本,Script1.sql 和 Script2.sql。 Script1.sql 从数据库中的 table 检索一些数据,然后我想将这些数据传递给 Script2.sql 以供使用。
Script1.sql如下:
SET SERVEROUTPUT ON;
DECLARE
FundRecord Test_Table%ROWTYPE;
CURSOR Fund_Cursor IS SELECT Code, YOURNAME FROM Test_Table;
BEGIN
OPEN Fund_Cursor;
LOOP
FETCH Fund_Cursor INTO FundRecord;
EXIT WHEN Fund_Cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Script1: ' || FundRecord.Code);
END LOOP;
CLOSE Fund_Cursor;
END;
/
@C:\Temp\Script2.sql FundRecord.Code;
而Script2.sql如下:
BEGIN
DBMS_OUTPUT.PUT_LINE('Script 2:' || ' ' || '&1');
END;
/
Script1.sql和Script2.sql的输出如下:
Script1: ABDCE
Script2: FundRecord.Code
为什么 Script2 的输出是 FundRecord.Code 而不是我期望的 'ABCDE'?
我如何传递它以确保 Script2 获得 'ABCDE' 作为参数?
谢谢
你可以试试
@Script2.sql param1
并且在 Script2 SQL 文件中,将参数引用为
&1
更新 1
这是我的测试用例,运行良好。
SELECT SYSDATE FROM &1;
此 SQL 语句保存为 Test.sql 并从 SQLPLUS 调用为
@D:\Test.sql dual
其中 dual 是传递给 Test.sql 文件的参数
结果显示在下面的屏幕截图中
记录FundRrecord
只存在于PL/SQL块中。您需要声明一个可以在块外使用的单独变量:
set autoprint on serverout on
var somevalue varchar2(20)
col somevalue new_value somevalue
begin
for r in (
select dummy from dual
)
loop
dbms_output.put_line('Script 1: ' || r.dummy);
:somevalue := r.dummy;
end loop;
end;
/
@C:\Temp\Script2.sql &somevalue
SQL*Plus 中提供了 column ... new_value ...
语法,用于报告中的页眉和页脚,但它在脚本中也非常有用,因为它设置了一个 define
变量(最后)查询结果。 set autoprint on
告诉 SQL*Plus 在每个 PL/SQL 块之后打印任何绑定变量(带有前导 :
的变量)的值,它通过生成一个查询,允许我们设置 column ... new_value
并在替换变量中捕获结果。
编辑:关于 SQL 开发人员兼容性,我会在有机会时尝试一些东西,但您可以尝试添加一些与
类似的东西select :somevalue as somevalue from dual;
在 PL/SQL 块之后,如果 column ... new_value
构造与 SQL*Plus 相同,但 autoprint
不相同。