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

Oracle PLSQL将变量传递给外部.SQL脚本,oracle,plsql,oracle-sqldeveloper,Oracle,Plsql,Oracle Sqldeveloper,我有两个脚本,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;

我有两个脚本,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;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Script 2:' || ' ' || '&1');
END;
/
和Script2.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;
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
在Script2SQL文件中,将参数引用为

&1
更新1

这是我的测试用例,运行良好

SELECT SYSDATE FROM &1;
此SQL语句另存为Test.SQL,并作为

@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为报表中的页眉和页脚提供了新的\u值…
语法,但它在脚本中也非常有用,因为它根据查询的(最后一个)结果设置了
define
变量
set autoprint on
告诉SQL*Plus在每个PL/SQL块之后打印任何绑定变量的值(带前导的
),它通过生成一个查询来实现这一点,允许我们设置
列。。。新建_值
,并将结果捕获到替换变量中

编辑:关于SQL开发人员兼容性,我会在有机会的时候尝试一些东西,但是您可以尝试添加一些类似的东西

select :somevalue as somevalue from dual;

在PL/SQL块之后,如果
列。。。新的_值
构造的工作原理与SQL*Plus中的工作原理相同,但自动打印不起作用。

我尝试使用上面发布的代码,但同样的情况发生了,在Script2中只提取变量的文字名称,而不是指定给参数的实际值。我刚刚将“Script 1:X”“Script 2::somevalue”打印到DMBS_输出窗口。编辑的代码现在似乎在SQL Plus中工作,但在使用SQL Developer时不工作。我想我可以改用SQL Plus。谢谢你的帮助我添加了一个建议,虽然未经测试,但我必须抽出一些时间来挖掘我的SQl Dev副本。我也尝试过,而且在Script2中只提取变量的文字名称,而不是分配给参数的实际值。不过,这里的挑战是顶级脚本捕获要传递的值。OP最初尝试传递
FundRecord.code
,它是PL/SQL块中记录的一部分。