Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL:将字符串的“数组”作为参数传递给SQL_Oracle_Plsql_Sqlplus - Fatal编程技术网

Oracle PL/SQL:将字符串的“数组”作为参数传递给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.

使用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;
/
对于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上运行这个。