支持存储过程,包中关联数组索引列使用varchar2类型
背景
在业务产品中,存在 oracle 移植过来的 sql 语句。它们在创建存储过程,函数,包时使用联合数组。联合数组的索引列存在使用 varchar2 类型的情况。在 lightdb 24.1 版本之前 lightdb 联合数组索引列只支持使用 varchar,int 两种类型。lightdb 24.1 对联合数组索引列使用 varchar2 类型进行了支持。
联合数组语法
TYPE type_name IS TABLE OF element_type
INDEX BY key_type;
key_type 支持使用 varchar,varchar2 ,int 类型。
使用示例
匿名块中使用
DECLARE
-- Associative array indexed by string:
TYPE population IS TABLE OF NUMERIC -- Associative array type
INDEX BY VARCHAR2(10111111); -- indexed by string
city_population population; -- Associative array variable
BEGIN
-- Add elements (key-value pairs) to associative array:
city_population('Smallville') := 2000;
city_population('Midland') := 750000;
city_population('Megalopolis') := 1000000;
raise info 'Midland is %', city_population('Midland');
raise info 'Smallville is %', city_population('Smallville');
raise info 'Megalopolis is %', city_population('Megalopolis');
END;
/
在存储过程中使用
CREATE OR REPLACE PROCEDURE print_gender(s_name VARCHAR(20)) AS
DECLARE
TYPE population IS TABLE OF NUMERIC -- Associative array type
INDEX BY VARCHAR2(64); -- indexed by string
p population;
BEGIN
p('1') := 1;
p('2') := 2;
p('3') := 3;
RAISE NOTICE '%:%',s_name, p('1') ;
END;
/
CALL print_gender('huaicheng');
在函数中使用
CREATE or REPLACE FUNCTION myfunc(v VARCHAR(20)) return int
is
DECLARE
TYPE population IS TABLE OF NUMERIC -- Associative array type
INDEX BY VARCHAR2(64); -- indexed by string
p population;
begin
p('1') := 1;
p('2') := 2;
p('3') := 3;
return p(v);
end;
/
select myfunc('1');
select myfunc('2');
在包中使用
create or replace package typkg
as
TYPE population IS TABLE OF text -- Associative array type
INDEX BY oracle.VARCHAR2(64); -- indexed by string
p population;
PROCEDURE print_gender(s_name VARCHAR(20));
function myfunc(v VARCHAR(20)) return int;
end;
/
create or replace package body typkg
as
PROCEDURE print_gender(s_name VARCHAR(20))
is
begin
p('1') := '1';
p('2') := '2';
p('3') := '3';
raise info '% is %', s_name, p('1');
end;
function myfunc(v VARCHAR(20)) return int
is
begin
p('1') := 1;
p('2') := 2;
p('3') := 3;
raise info 'Midland is %', p('1');
return p(v);
end;
end;
/
select typkg.myfunc('1');
call typkg.print_gender('huaicheng');