gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:50:04 24 4
gpt4 key购买 nike

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

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 的类型。争论。

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

动机

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

编辑 我听说过 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;
/

关于oracle - Oracle PL/SQL 中的动态类型或泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com