【问题标题】:Oracle 7 EXECUTE IMMEDIATE alternativeOracle 7 EXECUTE IMMEDIATE 替代方案
【发布时间】:2019-12-15 17:09:35
【问题描述】:

我正在开发一个 Oracle 7遗留数据库,我想使用 EXECUTE IMMEDIATE 将转换后的字节执行为 varchar但我发现上述功能已发布 Oracle 10g.

这是我的例子:

存储过程:

create or replace procedure QUERY_EXECUTOR
(
    IN_QUERY_STATEMENT IN LONG RAW
)
AS
BEGIN

    declare CONVERTED_QUERY varchar2(32767); 
    cursor c1 is select IN_QUERY_STATEMENT from dual;
    BEGIN  
        for r2 in c1 loop
        converted_query:=UTL_RAW.CAST_TO_VARCHAR2(substr(r2.IN_QUERY_STATEMENT,0)); 
        dbms_output.put_line(converted_query);
        end loop;
        execute immediate converted_query; --THIS LINE
    END;

END;

查看立即执行命令。当我评论它。 SP 在 Oracle 7 中编译成功。

但在 Oracle 12g(我们目前正在使用)上,示例代码执行得很好。

EXEC QUERY_EXECUTOR('53454c45435420312046524f4d204455414c3b');

转换时为“SELECT 1 FROM DUAL;”;

这种转换和执行对我们来说是处理当前问题的最佳方式,因此我们将非常感谢您的回答。

问题

如果我们不能在 Oracle 7 中使用上述命令,有没有办法或替代解决方案?

编辑:

找到了这个topic,它是执行文字字符串命令的另一个实用程序,但它仅适用于 DDL 命令。

编辑 2:解决方案

@Wernfried Domscheit 爵士的回答为我完成了这项工作。我将答案与我的逻辑结合起来。虽然它并不完美,但我认为我需要阅读更多文档。

首先,DBMS_SQL.VARCHAR2A 似乎在 Oracle7 中不起作用。

然后我发现this 具有不同的DBMS_SQL.PARSE 方法签名。我使用它是因为它说 DBMS_SQL.V7 所以它可能是 Oracle 7 但我真的不知道。我需要阅读文档。

create or replace procedure QUERY_EXECUTOR
(
    IN_QUERY_STATEMENT IN LONG RAW
)
AS
BEGIN
DECLARE
    res INTEGER;
    cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
    CONVERTED_QUERY varchar2(32767);
    cursor c1 is select IN_QUERY_STATEMENT from dual;
    BEGIN
        for r2 in c1 loop
            converted_query:=UTL_RAW.CAST_TO_VARCHAR2(substr(r2.IN_QUERY_STATEMENT,0)); 
        end loop;
        DBMS_SQL.PARSE(cur, converted_query, DBMS_SQL.V7);
        dbms_output.put_line(cur);
        res := DBMS_SQL.EXECUTE(cur);
        DBMS_SQL.CLOSE_CURSOR(cur);
    END;
END;

PS:

我不是 DBA,所以如果我在解决方案部分做错了什么,您能否就更好的解决方案发表意见?非常感谢您的回答。

【问题讨论】:

  • @ArifSherKhan,我已经在帖子的“编辑”部分添加了该链接。
  • 微不足道,但它是 Oracle 7 而不是 7i。 Oracle 8i 是第一个具有字母后缀的 Oracle 版本。 Oracle 8i 也是将 EXECUTE IMMEDIATE 引入感恩世界的版本。

标签: sql oracle plsql dynamic-sql oracle7


【解决方案1】:

对于以前的动态 Oracle 8i,您必须使用 DBMS_SQL 包。会是这样的:

DECLARE
   sqlcmd DBMS_SQL.VARCHAR2A;
   res INTEGER;
   cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;

BEGIN

    sqlcmd(1) := 'SELECT 1';
    sqlcmd(sqlcmd.LAST+1) := 'FROM dual';

    DBMS_SQL.PARSE(cur, sqlcmd, sqlcmd.FIRST, sqlcmd.LAST, TRUE, DBMS_SQL.NATIVE); 
    res := DBMS_SQL.EXECUTE(cur);
    DBMS_SQL.CLOSE_CURSOR(cur);

END;

据我所知DBMS_SQL.VARCHAR2A 是最近推出的,也许你必须使用DBMS_SQL.VARCHAR2_TABLEDBMS_SQL.VARCHAR2S

为了从 SELECT 获得结果,您必须使用 FETCH_ROWSEXECUTE_AND_FETCH 函数,文档应该可以帮助您。

【讨论】:

  • 这实际上对我有用。我将编辑我的帖子并包含解决方案。谢谢!
【解决方案2】:

如果我理解正确,您的问题是:如何在 Oracle 7 中执行动态 SQL。

Oracle 7 中不存在 pl/sql 'execute' 命令,但存在并描述了包 'dbms_sql' PL/SQL User’s Guide and Reference, Release 2.3, Part No. A32542-1 在“第 5 章:与 Oracle 的交互”的第 5-7 页上 在Oracle 7 Server Application Developer's Guide, Release 7.3, Part No. A32536-1'第 10 章:使用动态 SQL',第 10-1 页

【讨论】:

  • 您的参考资料很有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2011-02-16
  • 2021-11-27
相关资源
最近更新 更多