【发布时间】: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