【问题标题】:converting postgresql functions to oracle将 postgresql 函数转换为 oracle
【发布时间】:2018-09-26 09:11:20
【问题描述】:

我需要在我工作的产品中支持 postgresql 和 oracle。当我们在 oracle 上安装我们的数据库时,我们确实赋予“创建类型”的权限。所以我不确定如何将以下两种情况转换为 oracle:

  1. 返回数组的函数

          create or replace function get_array_of_integers(i_param int)
      returns integer[] as
      $body$
      declare array_of_integers int[];
      begin
    
         select
            case 
               when i_param = 1 then
                  array[1]
               when i_param = 2 then
                  array[1, 2, 3, 4]
               when i_param = 3 then
                  array[5, 6]
               else
                  array[]::integer[]
         end into array_of_integers;
    
         return array_of_integers;
    
      end;
      $body$
      language 'plpgsql' volatile
      cost 100;
    

第二种情况:接受整数数组的函数:

create or replace function some_function(params int[])
 ...

【问题讨论】:

    标签: postgresql oracle plsql database-migration


    【解决方案1】:

    您可以使用 Oracle 的内置集合类型sys.odcinumberlist

    你的函数相当于。

    CREATE OR REPLACE FUNCTION get_array_of_integers(i_param INT)
    RETURN sys.odcinumberlist
    AS
      array_of_integers sys.odcinumberlist := NEW sys.odcinumberlist() ; --Initialization
    BEGIN
        IF i_param = 1 THEN
          array_of_integers.EXTEND(1); 
          array_of_integers(1) := 1;
        ELSIF i_param = 2 THEN
          array_of_integers.EXTEND(4);--appends 4 null elements to a collection
          array_of_integers(1) := 1; --assign elements
          array_of_integers(2) := 2;
          array_of_integers(3) := 3;
          array_of_integers(4) := 4;
        ELSIF i_param = 3 THEN
          array_of_integers.EXTEND(2);
          array_of_integers(1) := 5;
          array_of_integers(2) := 6;
        END IF;
    
       RETURN array_of_integers;
    END;
    /  
    

    您可以在查询中使用TABLE 函数从该表中进行选择。

    SQL> select * FROM TABLE(get_array_of_integers(2));
    
    COLUMN_VALUE
    ------------
               1
               2
               3
               4
    
    SQL> select * FROM TABLE(get_array_of_integers(0));
    
    no rows selected
    

    对于Oracle 12.2及以上版本,你不需要TABLE函数,你可以直接从你的函数中选择。

    select * FROM get_array_of_integers(3);
    

    第二种情况可能是这样的。

     CREATE OR REPLACE FUNCTION some_function( params sys.odcinumberlist )
     RETURN INTEGER
     AS
     BEGIN
       RETURN 1;
     END;
     /
    

    【讨论】:

      猜你喜欢
      • 2015-09-12
      • 2022-01-17
      • 1970-01-01
      • 2023-01-17
      • 2021-01-10
      • 2015-11-11
      • 2023-02-01
      • 2011-01-17
      相关资源
      最近更新 更多