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的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:将词法参数传递给存储过程

将值列表作为输入参数传递给 PL/SQL 过程

odp.net 可以将参数传递给布尔 pl/sql 参数吗?

如何将数组作为参数传递给另一个脚本?

为啥我们将字符串数组作为参数传递给 main() 方法,为啥不传递任何集合类型或包装类型或原始类型?

java spring boot将字符串数组作为json中的参数传递给ajax调用