【问题标题】:Convert Db2 Procedure to Oracle Procedure将 Db2 过程转换为 Oracle 过程
【发布时间】:2021-03-05 14:21:02
【问题描述】:

我正在尝试将程序从 db2 数据库迁移到 oracle 我有 30 多个程序有什么转换工具可以帮助这个过程吗?

例如,我在db2中有这个程序返回DYNAMIC RESULT SETS如何在oracle中重写等效程序

CREATE PROCEDURE GET_Data (
    IN P_DATA_1 VARCHAR(4),
    IN P_DATA_2 VARCHAR(4) )
  SPECIFIC SQL4234234343442343
  DYNAMIC RESULT SETS 1
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  CALLED ON NULL INPUT
  INHERIT SPECIAL REGISTERS
  OLD SAVEPOINT LEVEL
P1: BEGIN
    -- Declare cursorf
    DECLARE RESULT_SET1 CURSOR WITH RETURN TO CLIENT FOR 
        SELECT DATA_NAME, DATA_VALUE1,DATA_VALUE2
        FROM Data
        WHERE DATA_VALUE1 = P_DATA_1 AND DATA_VALUE2 = P_DATA_2;


    IF EXISTS (SELECT 1 FROM Data WHERE DATA_VALUE1 = P_DATA_1 AND DATA_VALUE2 = P_DATA_2) 
        THEN                  
           OPEN RESULT_SET1;
        ELSE 
            RETURN;
    END IF;
END P1;

此示例转换:

-- SQLINES LICENSE FOR EVALUATION USE ONLY
CREATE OR REPLACE PROCEDURE GET_Data (
    P_DATA_1 IN VARCHAR2,
    P_DATA_2 IN VARCHAR2 )
  IS 
BEGIN
  OLD
/ SAVEPOINT LEVEL
<<P1>> BEGIN
    -- Declare cursorf


    IF EXISTS (SELECT 1 FROM Data WHERE DATA_VALUE1 = P_DATA_1 AND DATA_VALUE2 = P_DATA_2) 
        THEN                  
           OPEN RESULT_SET1 FOR 
        SELECT DATA_NAME, DATA_VALUE1,DATA_VALUE2
        FROM Data
        WHERE DATA_VALUE1 = P_DATA_1 AND DATA_VALUE2 = P_DATA_2;
        ELSE 
            RETURN;
    END IF;
END P1;

【问题讨论】:

  • 您能否发布您的尝试,解释您的代码有什么问题。
  • @Aleksej 我更新了问题,在 db2 中返回类型结果集但这种类型在 oracle 中不存在我想保留返回类型结果集是否可能?

标签: oracle stored-procedures db2


【解决方案1】:

您可能正在寻找 SYS_REFCURSOR。如果您使用的是 Oracle 版本 11g 或更早版本,您可以尝试以下代码 -

CREATE OR REPLACE PROCEDURE GET_Data (
    P_DATA_1 IN VARCHAR2,
    P_DATA_2 IN VARCHAR2,
    RESULT_SET1 OUT SYS_REFCURSOR)
  IS 
BEGIN
    -- Declare cursorf

    OPEN RESULT_SET1 FOR 
         SELECT DATA_NAME, DATA_VALUE1,DATA_VALUE2
           FROM Data
          WHERE DATA_VALUE1 = P_DATA_1
            AND DATA_VALUE2 = P_DATA_2;
END GET_Data;

从 12c 开始,您可以使用 DBMS_SQL.RETURN_RESULT 进行隐式游标返回,如下所示 -

CREATE OR REPLACE PROCEDURE GET_Data (
    P_DATA_1 IN VARCHAR2,
    P_DATA_2 IN VARCHAR2)
  IS 
BEGIN
    -- Declare cursorf

    OPEN RESULT_SET1 FOR 
         SELECT DATA_NAME, DATA_VALUE1,DATA_VALUE2
           FROM Data
          WHERE DATA_VALUE1 = P_DATA_1
            AND DATA_VALUE2 = P_DATA_2;

    DBMS_SQL.RETURN_RESULT(RESULT_SET1);

END GET_Data;

然后你可以执行这个过程得到结果。

【讨论】:

  • 感谢您的回复,我们的 Oracle 版本是 9,可以在没有 out 参数的情况下返回 SYS_REFCURSOR,因为如果我更改签名过程还需要更改调用此过程的代码,有什么建议吗?跨度>
  • 首先,你必须升级你的版本,其次,没有这种方法可以在不改变定义的情况下返回SYS_REFCURSOR。
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 2021-08-17
  • 1970-01-01
  • 2022-07-06
  • 2013-10-10
  • 1970-01-01
  • 2018-03-25
  • 2020-09-28
相关资源
最近更新 更多