【发布时间】:2014-06-02 20:18:53
【问题描述】:
使用 plsql,我想多次运行我的 test.sql,每次都会将不同的参数传递给 test.sql,并将结果假脱机到不同的文件。
文件名可能与传递的参数无关。
我希望我可以定义两个“数组”;一个用于假脱机的文件名,另一个用于参数值。
declare
my_types sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll('typeA', 'typeB', 'typeC');
my_filenames sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll('fileNameForA', 'fileNameForB', 'fileNameForC');
begin
for r in my_types.first..my_types.last
loop
--dbms_output.put_line(my_types(r));
--dbms_output.put_line(my_filenames(r));
spool my_filenames(r)
@test.sql my_types(r);
spool off
end loop;
end;
/
对于假脱机,它说它遇到符号 "MY_FILENAMES" 而它期望 := . < @ % ;。
此外,看起来test.sql 正在接受我按字面意思输入的参数,所以'my_types(r)' 而不是预期的'typeA'。如果在 plsql 中有一种完全不同且更简单的方法,那么让我听听。谢谢。
【问题讨论】:
-
你的
test.sql是什么?my_filenames是什么?你在哪里运行这个?spool是一个 SQL*Plus 命令... -
@Ben
test.sql只是一个select语句,它使用where子句中的参数。my_filenames是假脱机时要创建的文件名列表。my_filenames中的第一个元素应该是为运行test.sql而创建的文件,参数是my_types中的第一个元素。 -
PL/SQL 在数据库服务器上运行。 SQLPlus 是运行位于客户端上的脚本的客户端应用程序。您不能从 PL/SQL 中调用 SQLPlus 脚本,这作为一种架构没有意义。您不能在 PL/SQL 中放置像
spool这样的 SQL*Plus 命令。 PL/SQL 块可以使用utl_file生成文件,但这些文件将存在于数据库服务器上而不是客户端上。 -
我明白了。然后我想这更像是一个 sqlplus 问题而不是一个 plsql 问题。对,我确实会使用 Windows 命令行在 sqlplus 上运行它。