【发布时间】:2017-03-21 11:00:10
【问题描述】:
Hi 做了一个函数,稍微修改了 INSTR 函数(Oracle SQL): 当找不到空格字符时,我没有得到“0”,而是得到了字符串的长度。
它可以编译,但是当我尝试执行它时,我收到 ORA-06550 错误(如果我没记错的话,就是编译错误)。
我尝试了这个函数作为一个过程,它运行正常......所以我不明白为什么它不想执行。
你能帮帮我吗?
CREATE OR REPLACE FUNCTION "INSTR2" (str varchar2) RETURN NUMBER AS
pos number(4,0) := 0;
BEGIN
select INSTR(str, ' ') into pos from dual;
if (pos = 0) then
select to_number(length(str)) into pos from dual;
return pos;
else
return pos;
end if;
END INSTR2;
非常感谢,
R.L.
【问题讨论】:
-
select INSTR(str, ' ') into pos from dual;可以简化为pos := INSTR(str, ' '); -
如果性能是一个考虑因素,您可以考虑编码 'SELECT NVL(NULLIF(INSTR(str,' '),0),LENGTH(str)) FROM ...' 而不是使用 PL /SQL 函数。或者,如果您使用的是 Oracle 12c,请考虑将
PRAGMA UDF;添加到您的函数中。 -
出于好奇,为什么要使用这个功能?您是否使用它来对一个值进行子字符串化,将字母数字值直到第一个空格,使用此函数作为 SUBSTR 的长度元素?如果是这样,有一些方法可以使用 Oracle 函数或正则表达式来执行此操作,它们会比这个自定义函数更好。
-
大家好,谢谢大家!好吧,我不熟悉 Oracle 中的正则表达式语法(这与我过去使用的完全不同),所以我选择了这个“快速修复”;性能不是问题,因为我在 50 秒内执行的夜间作业中使用它(物化视图)。
标签: sql oracle function plsql ora-06550