【问题标题】:Oracle Database - EXECUTE IMMEDIATE inside dbms_parallel_executeOracle 数据库 - 在 dbms_parallel_execute 中立即执行
【发布时间】:2020-03-19 12:33:27
【问题描述】:

我面临以下任务:在 Oracle 12c 数据库上并行一些进程。与往常一样,我已经开始使用dbms_parallel_execute 包来制作它。使用dbms_parallel_execute.run_task 过程创建了一个新任务,并将我的匿名块与存储过程调用作为sql_stmt 参数传递。

l_sql := 'BEGIN my_procedure(:start_id, :end_id); END;';
dbms_parallel_execute.run_task
(
    task_name => l_task_name,
    sql_stmt => l_sql,
    language_flag => dbms_sql.native,
    parallel_level => l_parallel_level
);

这个存储过程调用了几个其他的过程。

因此,我的“父”程序失败,出现以下异常:

PLS-00103: Encountered the symbol "." when expecting one of the following:

   ( begin case declare exit for goto if loop mod null pragma
   raise return select update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   continue close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe purge
The symbol "<an identifier>" was substituted for "." to continue.

我发现,这个异常是因为在过程中调用EXECUTE IMMEDIATE而引发的:

l_sql := 'BEGIN ' || some_another_pkg.schema_name || '.some_pkg.some_procedure(:1, :2); END;'

EXECUTE IMMEDIATE l_sql 
USING l_param_1, l_param_2l

其中schema_namesome_another_pkg 包内的VARCHAR2(30) 的全局变量。

当我将其更改为转发过程调用时,异常消失了。但我无法在目标环境中替换此 EXECUTE IMMEDIATE

是否有任何解决方法可以在不替换 EXECUTE IMMEDIATE 调用的情况下解决此问题?

提前致谢。

【问题讨论】:

  • 请在调用 execute immediate 之前打印出 l_sql 的确切值,并发布 minimal reproducible example 谢谢。
  • 什么是get_package变量?
  • 没有足够的信息来真正帮助解决这个问题,但是根据您提供的内容,您的 EXECUTE IMMEDIATE 语句末尾是否有分号?
  • @OldProgrammer,我的错,在我的问题中添加了一些更改。 l_sql 变量使用另一个包中的全局变量连接。
  • @TenG,是的,这是现有代码的一部分,它工作正常,但如果它在并行执行中运行,则会失败。

标签: oracle plsql oracle12c


【解决方案1】:

正如 cmets 中提到的,问题出在 some_another_pkg.schema_name 代码中。在我的例子中,这个值是NULL

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多