【问题标题】:PL/SQL: Passing an 'array' of strings as argument to sqlPL/SQL:将字符串的“数组”作为参数传递给 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 上运行它。

标签: oracle plsql 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
.
.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2023-04-08
    相关资源
    最近更新 更多