暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 需要在DBMS_SCHEDULER中传递数组作为参数值

askTom 2017-09-20
346

问题描述

嗨,

所以我最近创建了一个存储过程,其中两个参数采用自定义类型的数组,这是这样的:

创建或替换类型QUERY_LST
作为VARCHAR2(30 CHAR) 的VARRAY(10);

当我直接执行时,存储过程按预期工作。我想为运行此存储过程设置一个自定义作业。但是,当我尝试创建作业时,它会在我去设置存储过程的参数值的确切位置引发错误 (PLS-00306):

DBMS_SCHEDULER.SET_JOB_ANYDATA_VALUE (
作业名称 => '[作业]',
参数 _ 位置 => 5,
argument_value => QUERY_LST ('query1','query2','query3'));

我不确定我在这里做错了什么。我将感谢你的帮助。

专家解答

顾名思义,您必须传递类型为ANYDATA的参数。所以快速转换,你就可以走了

SQL> create or replace type my_varray as varray(5) of number;
  2  /

Type created.

SQL>
SQL> drop table t purge;

Table dropped.

SQL>
SQL> create table t ( x int );

Table created.

SQL>
SQL> create or replace
  2  procedure load_t(v my_varray) is
  3  begin
  4    for i in 1 .. v.count loop
  5       insert into t values (v(i));
  6    end loop;
  7    commit;
  8  end;
  9  /

Procedure created.

SQL>
SQL> begin
  2    dbms_scheduler.create_program (
  3      program_name        => 'pgm_load_t',
  4      program_type        => 'stored_procedure',
  5      program_action      => 'load_t',
  6      number_of_arguments => 1,
  7      enabled             => false,
  8      comments            => 'program to run a stored procedure.');
  9
 10    dbms_scheduler.define_program_argument (
 11      program_name      => 'pgm_load_t',
 12      argument_name     => 'v',
 13      argument_position => 1,
 14      argument_type     => 'my_varray');
 15
 16    dbms_scheduler.enable (name => 'pgm_load_t');
 17  END;
 18  /

PL/SQL procedure successfully completed.

SQL> declare
  2    v my_varray := my_varray(1,2,3,4);
  3    a sys.anydata := SYS.ANYDATA.ConvertCollection(v);
  4  begin
  5    dbms_scheduler.create_job (
  6      job_name      => 'job_load_t',
  7      program_name  => 'pgm_load_t',
  8      start_date      => SYSTIMESTAMP,
  9      enabled         => false,
 10      comments        => 'Job to run pgm');
 11
 12  dbms_scheduler.set_job_anydata_value (
 13     job_name           => 'job_load_t',
 14     argument_position  => 1,
 15     argument_value     => a
 16     );
 17
 18   dbms_scheduler.enable ('job_load_t');
 19
 20  end;
 21  /

PL/SQL procedure successfully completed.

SQL>
SQL> select * from t;

         X
----------
         1
         2
         3
         4
复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论