【问题标题】:Custom SQL function - PL/SQL: Statement ignored自定义 SQL 函数 - PL/SQL:语句被忽略
【发布时间】: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


【解决方案1】:

嗯,Oracle 中已经有一个名为 INSTR2 的内置函数 (look, here it is)。

我刚刚用另一个名字编译了你的函数并且它工作了。所以代码是有效的,你只需要选择它的名字。

显然,Oracle 将 INSTR2 解析为内置函数,尽管事实上您现在在自己的架构中拥有具有此类名称的函数(我在文档中找不到它的原因,但这种行为并不令人惊讶)。而INSTR2 期望的参数比您的实现更多。这会导致运行时错误。

【讨论】:

    【解决方案2】:
    1. 将 excample 的函数名称更改为 INSTR_SPACE,一切都会好起来的,因为在 oracle 中有一个 instr2 函数,在调用过程中会出现问题
    2. 将函数体更改为

    创建或替换

    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操作即可,速度会更快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多