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 不相同。