自定义 SQL 函数 - PL/SQL:语句被忽略
Posted
技术标签:
【中文标题】自定义 SQL 函数 - PL/SQL:语句被忽略【英文标题】:Custom SQL function - PL/SQL: Statement ignored 【发布时间】: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 秒内执行的夜间作业中使用它(物化视图)。
【参考方案1】:
嗯,Oracle 中已经有一个名为 INSTR2
的内置函数 (look, here it is)。
我刚刚用另一个名字编译了你的函数并且它工作了。所以代码是有效的,你只需要选择它的名字。
显然,Oracle 将 INSTR2
解析为内置函数,尽管事实上您现在在自己的架构中拥有具有此类名称的函数(我在文档中找不到它的原因,但这种行为并不令人惊讶)。而INSTR2
期望的参数比您的实现更多。这会导致运行时错误。
【讨论】:
【参考方案2】:-
将 excample 的函数名称更改为 INSTR_SPACE,一切都会好起来的,因为在 oracle 中有一个 instr2 函数,在调用过程中会出现问题
将函数体更改为
创建或替换
function INSTR_SPACE(str varchar2) return number as
pos number(4, 0) := 0;
begin
pos := INSTR(str, ' ');
if (pos = 0) then
return to_number(length(str));
else
return pos;
end if;
end INSTR_SPACE;
不需要sql操作,通过简单的pl/sql操作即可,速度会更快
【讨论】:
以上是关于自定义 SQL 函数 - PL/SQL:语句被忽略的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 PL/SQL 触发器会引发“错误(2,2):PL/SQL:语句被忽略”和“错误(2,5):PLS-00204:函数或伪列'EXISTS'”错误?