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

标签 oracle function plsql user-defined-functions pls-00103

我正在尝试在 Oracle 中创建一个用户定义的函数,当给定包含日期子字符串的文本参数时,该函数将返回 DATE。我尝试了几种写法,但似乎都抛出相同的错误:

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;

错误:

FUNCTION lm_date_convert Compiled. 1/46
PLS-00103: Encountered the symbol "(" when expecting one of the following:

:= . ) , @ % default character The symbol ":=" was substituted for "(" to continue.

欢迎对此有任何想法以及一般 UDF 写作技巧(和好的引用资料)!谢谢。

最佳答案

在存储过程中指定参数时,我们无法限制数据类型。也就是说,只需使用 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> 
<小时/>

"If you really do want a VARCHAR2(50) then declare a type of VARCHAR2(50) and use the type."

声明 SQL TYPE 来强制调整大小有点过分了。我们可以在 PL/SQL 中声明 SUBTYPE,但它们的大小实际上并未在存储过程签名中强制执行。不过,也有解决方法:I discuss in this other thread

<小时/>

顺便说一句,你为什么使用正则表达式来解决这个问题?或者更确切地说,您想要解决哪些问题无法用 TO_CHAR 和 TO_DATE 解决? Oracle 对格式掩码相当宽容。

关于oracle - 在 Oracle 中编译用户定义函数时出现错误 PLS-00103,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3398610/

相关文章:

Java、时间相关对象和oracle to_date函数

javascript - 使用 JavaScript 保存 var 并重定向到 URL

r - 返回R中行中三个最高值的函数

c++ - 试图引用已删除的函数(未引用已创建的函数)

sql - 在 Oracle 中用逗号格式化一个冗长的数字

oracle - 页面项目值内不允许逗号?顶尖

sql - Oracle SQL Developer - 错误 : "FROM keyword not found where expected"

sql - 无法从函数 PLSQL 返回表类型

oracle - 更改生产数据库中的列数据类型

java - 从java到plsql varchar2(1)的单字符串导致 'character string buffer too small'