由于日期格式,从 Apex 表单调用 Oracle SP 失败
Posted
技术标签:
【中文标题】由于日期格式,从 Apex 表单调用 Oracle SP 失败【英文标题】:Oracle SP Fails when called from Apex form due to date format 【发布时间】:2018-01-28 12:59:36 【问题描述】:我有一个表,我在其中使用基于输入参数的过程插入和更新数据。该过程是从 Oracle APEX 表单中调用的。 该过程在 Oracle 中运行良好。但是当我从 Apex 表单中调用它时,我会收到程序失败错误。经过分析,我发现这是由于 Apex 表单和 Oracle 中传递的值的日期格式不匹配造成的。
Date format in APEX FORM-->16-AUG-2017
Date format in ORACLE DB-->2017-08-17
在调用 Oracle 过程之前,我是否需要在 Apex 表单中格式化输入参数,或者我是否需要在过程中更改其格式。 请帮忙。
【问题讨论】:
您是否将日期作为数据类型date
或varchar2
的参数传递?最好使用第一个,这样您就可以独立于任何日期格式。
嗨,我从顶点表单到调用数据库过程的参数是..#OWNER#.PROC_REF_ARTICLE_NBR_UPDINSERT(V_VALID_FROM_DT=>TO_CHAR(TO_DATE(:P293_VALID_FROM_DT,'DD-MON-YYYY'),'YYYY- MM-DD');
首先,Oracle DB 中没有所谓的日期格式。日期就是日期。您可能会觉得它们不同,因为您使用的客户端以这种方式格式化。您的过程中的“V_VALID_FROM_DT”参数是字符还是日期?您正在将其转换为 YYYY-MM-DD 格式的字符日期。如果参数是日期,那么 Oracle 可能不会将其隐式转换回日期,从而导致错误。
【参考方案1】:
APEX 将所有项目值视为字符串,例如'2017 年 8 月 16 日'。如果您正在调用的过程需要一个 DATE 参数,那么您需要在调用它之前转换该值。这对很多人来说是不合时宜的,但在 APEX 应用程序中,我很乐意使用 implicit 转换:
myproc (p_date => to_date(:P1_DATE));
无论 APEX 中的日期格式设置如何,这都会起作用。另一种方法是使用流行的 APEX 日期格式执行显式转换,如下所示:
myproc (p_date => to_date(:P1_DATE, :APP_NLS_DATE_FORMAT));
但这对我来说似乎是多余的。
当然,如果 P1_DATE 中的值不是现行 APEX 日期格式中的有效日期,您的过程调用将会失败,因此您应该在调用过程之前对其进行验证。例如,您可以使用 APEX 验证来做到这一点。另一种方法是有一个 APEX 过程层,它接受所有值作为字符串,使用一些常用实用程序验证和转换它们,然后调用主过程。
【讨论】:
嗨托尼,我已经尝试了这两个选项-'myproc (p_date => to_date(:P1_DATE));和 myproc (p_date => to_date(:P1_DATE));'和'myproc(p_date => to_date(:P1_DATE,:APP_NLS_DATE_FORMAT));'但两者都不是工作程序仍然失败,会话级别值仍然'20-AUG-2017' 程序参数是DATE类型的吗?如果是这样,这将起作用。听起来您的程序需要一个格式化的字符串,在这种情况下,您唯一的选择是根据需要重新格式化日期,例如to_char(to_date(:P1_DATE),'YYYY-MM-DD')
以上是关于由于日期格式,从 Apex 表单调用 Oracle SP 失败的主要内容,如果未能解决你的问题,请参考以下文章
对 apex oracle 数据库应用程序表单进行 pl sql 验证