我有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'作为参数?
由于
答案 0 :(得分:1)
您可以尝试
@Script2.sql param1
并在Script2 SQL文件中,将参数称为
&1
更新1
这是我的测试用例,工作正常。
SELECT SYSDATE FROM &1;
此SQL语句保存为Test.sql,并从SQLPLUS调用
@D:\Test.sql dual
其中dual是传递给Test.sql文件的参数
结果显示在以下屏幕截图
中答案 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
不构成。