Oracle PL/SQL 中的动态类型或泛型

2023-12-20

由于某种原因,我在表中有某些字段,它们是字符的集合。不同长度的字符。例子:

create or replace type t_charray_1 as varray(5) of char(1);
create or replace type t_charray_2 as varray(5) of char(2);
create or replace type t_charray_3 as varray(5) of char(3);
create or replace type t_charray_4 as varray(5) of char(4);

create table mytable (
field1 number,
field2 t_charray_1,
field3 t_charray_3,

另外,我有一个函数返回一个(固定长度)字符串表示形式mytable记录。此函数调用返回给定集合类型字段的字符串表示形式的其他函数。例子:

  function to_chr(
    p_array in t_charray_1, 
    pad_length in number, 
    p_list_length in number
  ) return char as
    v_res varchar2(255) := '';
  begin
    for i in 1 .. p_list_length loop
      if p_array is not null and p_array.exists(i) and p_array(i) is not null then
        v_res := v_res || rpad(p_array(i), pad_length, ' ');
      else
        v_res := v_res || rpad(' ', pad_length, ' ');
      end if;
    end loop;
    return v_res;
  end to_chr;
  ------------------------------------------------------------------------------
  function to_chr(
    p_array in t_charray_2, 
    pad_length in number, 
    p_list_length in number
  ) return char as
    v_res varchar2(255) := '';
  begin
    for i in 1 .. p_list_length loop
      if p_array is not null and p_array.exists(i) and p_array(i) is not null then
        v_res := v_res || rpad(p_array(i), pad_length, ' ');
      else
        v_res := v_res || rpad(' ', pad_length, ' ');
      end if;
    end loop;
    return v_res;
  end to_chr;

请注意,这些函数是超载彼此的版本。他们签名的唯一区别是签名的类型p_array争论。

另请注意这些函数的主体是相同的.

动机

我想消除重复的代码。我的选择是什么?

EDIT我听说过 sys.anydata 但从未使用过它。能有解决办法吗?


您可以编写一个采用最大类型的过程,并在传递较小类型之前显式地将较小类型转换为较大类型。注意CAST只能在SQL中使用

DECLARE

  x t_charray_1 := t_charray_1();
  y t_charray_2 := t_charray_2();

  PROCEDURE foo( p_foo t_charray_2 )
  AS
  BEGIN
    FOR i IN p_foo.FIRST..p_foo.LAST loop
      dbms_output.put_line( p_foo(i) );
    END LOOP;
  END;

BEGIN
  x.EXTEND;
  x.EXTEND;
  x(1) := 'A';
  x(2) := 'B';

  y.EXTEND;
  y.EXTEND;
  y(1) := 'AA';
  y(2) := 'BB';

  foo(y);

  SELECT CAST(x AS t_charray_2) INTO y FROM dual;
  foo(y);
END;
/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle PL/SQL 中的动态类型或泛型 的相关文章

随机推荐