因为项目需要,我主要是把 mysql 的自定义函数 迁移到 oracle上, 所以,这里重点实在oracle。
#而他俩的区别,主要在几个部分:整体格式; 基础操作 和 内建函数,还有其他需要注意的。
create function functionName(param) returns datatType
begin
// more work to do
return 【result】;
end;
create [or replace ] function functionName([param]) return resultType
as|is
begin
// more work to do
return result;
end;
其实大体格式差不多的,网络也一堆,这里只是稍微说一下!
都是: if 条件 then … end if;
这里约定一下,先说mysql 的 函数, 然后 说明 oracle 用什么函数对应。
listagg(字段, char) within group( order by 字段) -- 改剧中2个字段为同一个字段,是一样的`,char 代表 分割符,是自己可定义的
# 要求 用 ‘’代替指定位数的字符串,我用的oracle 中的字符串截取
#原 需求 set c1 = INSERT(c1,1,instr(c1,split1),'');
SELECT substr(temp, instr(temp, split1) + length(split1)) into temp from dual;
CREATE OR REPLACE
FUNCTION "getParentIds"(pid IN VARCHAR2)
RETURN VARCHAR2
IS
sTemp VARCHAR(4000);
BEGIN
sTemp:='$';
pid := sTemp; -- 这种事不正确的
RETURN sTemp;
END;
在oracle 中,空(’’)就是 null
测试方法,生命局部变量之后,赋值为空(’’), 然后,查看改局部变量显示的值,或者 用 if … then 判断均可。
oracle 的函数名称
函数名称可以分为是否用双引号括住,如果用双引号括住,说明oracle 数据严格按照字符串来匹配,区分大小写,如果不用双引号或者是单引号,就是让oracle 自己识别,oracle会同意处理为大写名称。
设计insert 关键字
在oracle 函数中,设计insert 关键字插入数据,最好用事务,结构:
PRAGMA AUTONOMOUS_TRANSACTION; ... commit;
例子:
CREATE OR REPLACE
FUNCTION "fn_split" (c1 VARCHAR, split1 VARCHAR)
RETURN VARCHAR
AS
PRAGMA AUTONOMOUS_TRANSACTION; #### 事务开始
uuid varchar(36);
temp VARCHAR2(36);
BEGIN
temp := c1;
select rawtohex(SYS_guid()) into uuid from dual;
while(instr(temp,split1)<>0) loop
insert into split_tab (id,col,dataTime) values (uuid,substr(temp,1,instr(temp,split1)-1),SYSDATE());
SELECT substr(temp, instr(temp, split1) + length(split1)) into temp from dual;
END loop;
insert INTO split_tab (id,col,dataTime) values (uuid,c1,SYSDATE());
commit; ### 事务提交
return uuid;
END;