Oracle PL/SQL:将字符串的“数组”作为参数传递给SQL
使用plsql,我想多次运行test.sql,每次都会将不同的参数传递给test.sql,并将结果假脱机到不同的文件 文件名可能与正在传递的参数没有关系 我希望我能定义两个“数组”;一个用于假脱机到的文件名,另一个用于参数值Oracle PL/SQL:将字符串的“数组”作为参数传递给SQL,oracle,plsql,sqlplus,Oracle,Plsql,Sqlplus,使用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.
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;
/
对于spool,它表示它在预期时遇到了symbol MY_文件名:=.<@%;。
另外,test.sql看起来像是从字面上接受了我输入的参数,所以是“my_typesr”而不是预期的“typeA”。如果在plsql中有一种完全不同且更简单的方法,请让我听听。谢谢。要让它工作起来笨拙、难看,您必须使用PLSQL生成sql脚本,并调用您尝试测试的esql脚本。e、 g
set serveroutput on
spool run_it.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('spool ' || my_filenames(r) );
dbms_output.put_line('@test.sql ' || my_types(r) );
dbms_out.put_line ('spool off' );
end loop;
end;
/
spool off
@run_it.sql
未测试/编译。但我希望你能明白
使用上面的run_it.sql应该如下所示:
spool fileNameForA
@test.sql typeA
spool off
spool fileNameForB
@test.sql typeB
spool off
.
.
什么是test.sql?我的文件名是什么?你在哪里运行这个?spool是一个SQL*Plus命令…@Ben test.SQL只是一个select语句,它使用where子句中的参数。my_filenames是后台处理时要创建的文件名列表。my_文件名中的第一个元素应该是为运行test.sql而创建的文件,参数是数据库服务器上运行的my_types.PL/sql中的第一个元素。SQLPlus是一个客户端应用程序,它运行位于客户端上的脚本。不能从PL/SQL中调用SQLPlus脚本,这对于体系结构来说没有意义。不能在PL/SQL中使用SQL*Plus命令,如spool。PL/SQL块可以使用utl_文件生成文件,但这些文件将存在于数据库服务器上,而不是客户端上。那么,我想这更像是一个sqlplus问题,而不是一个plsql问题。好的,我确实会使用windows命令行在sqlplus上运行这个。