PL/SQL:将字符串的“数组”作为参数传递给 sql
Posted
技术标签:
【中文标题】PL/SQL:将字符串的“数组”作为参数传递给 sql【英文标题】:PL/SQL: Passing an 'array' of strings as argument to sql 【发布时间】: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 上运行它。
【参考方案1】:
要让它工作(笨拙、丑陋),您必须使用 PLSQL 生成一个 sql 脚本,并调用您尝试测试的 esql 脚本。例如
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
.
.
【讨论】:
以上是关于PL/SQL:将字符串的“数组”作为参数传递给 sql的主要内容,如果未能解决你的问题,请参考以下文章
odp.net 可以将参数传递给布尔 pl/sql 参数吗?