当前位置: 首页 > 面试题库 >

如何使用execute immedate执行本地过程?

江光明
2023-03-14
问题内容

我有以下PL SQL块:

WHENEVER SQLERROR EXIT 1
SET SERVEROUTPUT ON

DECLARE
v_sql VARCHAR2(500);
f1 VARCHAR2(20) := 'abc';
p_procname VARCHAR2 (30) := 'OPENLOG';

   PROCEDURE OPENLOG (file_name IN VARCHAR2)
   IS
   BEGIN
      NULL;
   END;

BEGIN
DBMS_OUTPUT.PUT_LINE('Begin');
v_sql := 'BEGIN ' || p_procname || '(:a); END;';
EXECUTE IMMEDIATE v_sql USING IN f1;
END;
/

当我执行以上代码块时,出现错误:

DECLARE
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'OPENLOG' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ORA-06512: at line 19

但是,如果OPENLOG过程是html" target="_blank">程序包的一部分,则可以正常工作。

请告知如何使用动态SQL执行本地过程。


问题答案:

正如Amarillo所说,您不能动态执行本地定义的过程,因为动态部分将使用的SQL范围中不存在该过程。

您所描述的情况是,所有过程都在匿名块的DECLARE部分中定义,并且您正在运行一个查询,该查询告诉您要执行的过程-
大概还为您提供了要传递的参数。您可以只使用if/else构造或case语句来执行适当的过程,例如:

DECLARE
  ...
BEGIN
  FOR data IN (SELECT procname, arg1, arg2, ... from <your_query>) LOOP
    CASE data.procname
      WHEN 'OPENLOG' THEN
        openlog(data.arg1);
      WHEN 'WRITELOG' THEN
        writelog(data.arg1, data.arg2);
      WHEN ...
        ...
      ELSE
         -- handle/report an invalid procedure name
         -- or skip the `ELSE` and let CASE_NOT_FOUND be thrown
    END CASE;
  END LOOP;
END;
/

您只需要一个WHEN条件和每个过程的适当过程调用。您也可以ELSE捕获任何意外的过程名称,或者CASE_NOT_FOUND抛出异常(ORA-06592),这取决于发生这种情况时需要发生的情况。



 类似资料:
  • 问题内容: 我已经写了一个bash脚本foo.sh 我想在我的远程服务器上执行它。我尝试了,它起作用了。 之后,我像这样更改了test.sh文件 现在,我想传递一个本地参数以与我的脚本一起执行,但是当我键入它时会返回一个错误。 如何通过脚本传递参数? 问题答案: 使用该选项,该选项强制(或任何POSIX兼容外壳程序)从标准输入而不是从第一个位置参数命名的文件中读取其命令。而是将所有参数都视为脚本的

  • 问题内容: 鉴于Java 9已经来临,我们终于可以拥有Java REPL了,我希望有一种方法可以在脚本中添加shebang并对其进行解释。 我尝试创建: 然而,这给出了: 事实证明,OpenJDK https://bugs.openjdk.java.net/browse/JDK-8167440中对此有增强要求。 还有其他方法吗? 问题答案: 用 作为的第一行。该脚本可能如下所示: 当然,命令行选项

  • 问题内容: 我的包体内有一个proc: 我在包装规格中公开了这一点。 如何在PL SQL Developer(或类似版本)的新SQL窗口中执行此过程? 问题答案: 您可以相对轻松地执行该过程 当然,这只是将游标返回到调用应用程序。它不执行任何操作来从游标中获取数据,对该数据执行任何操作或关闭游标。假设您的目标是向其中写入一些数据(有时对于原型设计很有用,但生产代码不应该依赖该数据),则可以执行以下

  • 问题内容: 我的package.json文件中有一个npm任务,如下所示执行笑话测试: 我想使用grunt 执行此任务。我为此安装了grunt-run并添加了run任务,但是如何在其中调用此npm任务呢? 问题答案: 配置与文档中显示的示例类似的示例。 将的值设置为。 设置和在数组中。 Gruntfile.js 跑步 使用上面显示的配置通过CLI 运行将调用该命令。 注意:向Array 添加(或等

  • 使用在python中,我试图运行一个perl脚本,它在远程机器上运行一个代码来获取一些信息。 我在机器A上有两个脚本—python和perl。python脚本使用方法。两个脚本都运行得很好。 但是,perl脚本是按串行顺序执行的(一个接一个的IP)。 实际行为- python脚本通过传递'198.168来运行perl脚本。1.2' perl脚本执行代码并Hibernate15秒 python脚本然

  • 我想使用Spring Data JPA和Hibernate执行一个简单的H2数据库存储过程。 存储过程类: 存储过程别名: 在H2控制台中执行,工作正常: Spring数据JPA存储库类: 储存库测试: 产生以下输出: 具有以下存储过程的MS SQL Server数据库的相同代码按预期工作: 似乎在org . spring framework . data . JPA . repository .