PLSQL将变量传递给外部.SQL脚本

时间:2017-05-03 04:19:28

标签: oracle plsql oracle-sqldeveloper

我有2个脚本,Script1.sql& Script2.sql。 Script1.sql从数据库中的表中检索一些数据,然后我将这些数据传递给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'作为参数?

由于

2 个答案:

答案 0 :(得分:1)

您可以尝试

@Script2.sql param1

并在Script2 SQL文件中,将参数称为

&1

更新1

这是我的测试用例,工作正常。

SELECT SYSDATE FROM &1;

此SQL语句保存为Test.sql,并从SQLPLUS调用

@D:\Test.sql dual

其中dual是传递给Test.sql文件的参数

结果显示在以下屏幕截图

enter image description here

答案 1 :(得分:1)

记录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 Developer的兼容性,当我有机会时我会尝试一些事情,但你可能会尝试添加一些东西

select :somevalue as somevalue from dual;

在PL / SQL块之后,如果column ... new_value构造与SQL * Plus中的构造相同,但autoprint不构成。