注册

自定义了两个type,cast无法强制转换,可以自定义cast么

小灰灰_oO 2024/02/23 619 0

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,也没办法让编译通过么?

回答 0
暂无回答
扫一扫
联系客服