代码之家  ›  专栏  ›  技术社区  ›  Stew

错误PLS-00103在Oracle中编译用户定义函数

  •  3
  • Stew  · 技术社区  · 15 年前

    我试图在Oracle中创建一个用户定义的函数,当给定一个包含日期子字符串的文本参数时,该函数将返回一个日期。我试过几种方法来写这个,但似乎都犯了同样的错误:

    CREATE OR REPLACE FUNCTION lm_date_convert (lm_date_in IN VARCHAR2(50))
      RETURN DATE DETERMINISTIC IS
    BEGIN
      RETURN(TO_DATE(REGEXP_REPLACE(lm_date_in, '([[:digit:]]{2})[-/.]*([[:digit:]]{2})[-/.]*([[:digit:]]{4})','\3-\1-\2'), 'YYYY-MM-DD'));
    END;
    

    错误:

    函数lm_date_convert compiled.1/46
    PLS-00103:遇到 符号“”(当需要 下列内容:

    =,@%默认字符 symbol“:=”替换了“(”to 继续。

    对此有任何想法,以及通用的UDF写作技巧(和良好的参考资料)都是受欢迎的!谢谢。

    1 回复  |  直到 15 年前
        1
  •  13
  •   Community Mohan Dere    8 年前

    在存储过程中指定参数时,不能限制数据类型。也就是说,只使用varchar2而不是varchar2(50)。

    只是为了证明我在复制你的问题…

    SQL> CREATE OR REPLACE FUNCTION lm_date_convert (lm_date_in IN VARCHAR2(50))
      2    RETURN DATE DETERMINISTIC IS
      3  BEGIN
      4    RETURN(TO_DATE(REGEXP_REPLACE(lm_date_in, '([[:digit:]]{2})[-/.]*([[:digit:]]{2})[-/.]*([[:digit:]]{4})','\3-\1-\2'), 'YYYY-MM-DD'));
      5  END;
      6  /
    
    Warning: Function created with compilation errors.
    
    SQL> sho err
    Errors for FUNCTION LM_DATE_CONVERT:
    
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    1/49     PLS-00103: Encountered the symbol "(" when expecting one of the
             following:
             := . ) , @ % default character
             The symbol ":=" was substituted for "(" to continue.
    
    SQL>
    

    现在修复它:

    SQL> ed
    Wrote file afiedt.buf
    
      1  CREATE OR REPLACE FUNCTION lm_date_convert (lm_date_in IN VARCHAR2)
      2    RETURN DATE DETERMINISTIC IS
      3  BEGIN
      4    RETURN(TO_DATE(REGEXP_REPLACE(lm_date_in, '([[:digit:]]{2})[-/.]*([[:digit:]]{2})[-/.]*([[:digit:]]{4})','\3-\1-\2'), 'YYYY-MM-DD'));
      5* END;
    SQL> r
      1  CREATE OR REPLACE FUNCTION lm_date_convert (lm_date_in IN VARCHAR2)
      2    RETURN DATE DETERMINISTIC IS
      3  BEGIN
      4    RETURN(TO_DATE(REGEXP_REPLACE(lm_date_in, '([[:digit:]]{2})[-/.]*([[:digit:]]{2})[-/.]*([[:digit:]]{4})','\3-\1-\2'), 'YYYY-MM-DD'));
      5* END;
    
    Function created.
    
    SQL> 
    

    “如果你真的想要一个varchar2(50) 然后声明varchar2(50)类型 并使用类型。”

    声明一个SQL类型来强制调整大小有点过分了。我们可以用pl/sql声明子类型,但它们的大小实际上并没有在存储过程签名中强制执行。不过,还有一些解决方法 I discuss in this other thread .


    另外,为什么要使用regex来解决这个问题?或者更确切地说,您试图解决的是什么问题,而这些问题无法用“到”字符和“到”日期来解决?甲骨文对格式屏蔽相当宽容。

    推荐文章