oracle定义了两个自定义类型,一个split函数,array只能自定义,几百个包依赖这个自定义array,所以屏蔽了达梦的array关键字。
自定义类型:
CREATE OR REPLACE TYPE "TY_STR_SPLIT" is table of varchar2 (4000);
CREATE OR REPLACE TYPE "ARRAY" is VARRAY(4000) OF VARCHAR2(8000);
-- 跟ARRAY结构一样,就是名称不同
CREATE OR REPLACE TYPE "ARR" is VARRAY(4000) OF VARCHAR2(8000);
分词函数
Create or Replace
function "SPLIT" (p_str in varchar2,
p_delimiter in varchar2)
return ty_str_split
is
j int := 0;
i int := 0;
getLen int :=0;
len int := 0;
len1 int := 0;
str varchar2 (4000);
str_split ty_str_split := ty_str_split ();
v_isFound number :=0;
begin
if p_delimiter is not null then
select instr(p_str,p_delimiter) into v_isFound from dual;
if v_isFound=0 then--没找到
str_split.extend;
str_split (str_split.count) := p_str;
else
len := length (p_str);
len1 := length (p_delimiter);
while j <= len
loop
i :=i+1;
j := instr (p_str, p_delimiter,i);
getLen:=j-i;
if j = 0 then
str := substr (p_str, i);
str_split.extend;
str_split (str_split.count) := str;
exit;
else
str := substr (p_str, i, getLen);
str_split.extend;
str_split (str_split.count) := str;
i := j-1 + len1;
end if;
end loop;
end if ;
else
str_split.extend;
str_split (str_split.count) := p_str;
end if ;
return str_split;
end split;
TY_STR_SPLIT转arr函数
CREATE OR REPLACE FUNCTION "TY_STR_SPLIT_TO_ARR" (srcType TY_STR_SPLIT)
RETURN ARR
AS
/*变量说明部分*/
newType ARR;
BEGIN
newType:= NEW ARR();
/*执行体*/
for i in 1..srcType.count LOOP
newType.EXTEND;
newType(i) := srcType(i);
end loop;
return newType;
END;
测试:
SELECT TY_STR_SPLIT_TO_ARR(SPLIT('a,b,c',','))
能够让达梦支持说cast(TY_STR_SPLIT as ARR),底层逻辑自动调用的是上面的TY_STR_SPLIT_TO_ARR函数么?
上面的TY_STR_SPLIT_TO_ARR函数,返回值是ARR,编译成功。但是一旦类型改成ARRAY就编译失败了,这个即使屏蔽了关键词ARRAY,也没办法让编译通过么?