在存储过程中指定参数时,我们不能限制数据类型.也就是说,只使用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,'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,'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,'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对格式掩码非常宽容.

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐