我尝试在 Oracle 表单 .pll 文件以及 sql Developer 中调用具有 3 个输入参数和 3 个输出参数的过程。即使我期望两种情况具有相同的输出参数值,它也会给出不同的结果。我确认在 .pll 上打印一条消息,它们与我在 sql Developer 中使用的完全相同。谁能解释一下造成这种差异的原因是什么。谢谢。
在.pll中
p_enquiry_date pp_acc.end_date%type := to_date((nvl(name_in('PPUN.DSP_RUN_END_DATE'),
to_char(sysdate, 'DD-MON-YYYY'))),'DD-MON-YYYY');
message('enq: '||p_enquiry_date);pause;
它打印“enq:11-JAN-23”
在 Sql Developer 中,
p_enquiry_date pp_acc.end_date%type := to_date('11-JAN-2023','DD-MON-YYYY');
从我的角度来看,一切都很好。这与日期值本身无关,而是它呈现给您的方式。
Forms 和 SQL Developer使用当时有效的格式掩码显示这些日期值。
在SQL*Plus(更容易演示)中,我们通过设置它
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL> select sysdate from dual;
SYSDATE
----------
17.10.2023
如果我改变主意,我可以
SQL> alter session set nls_date_format = 'dd-MON-yyyy';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-----------
17-OCT-2023
或者,也显示时间部分:
SQL> alter session set nls_date_format = 'mm/dd/yyyy hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
10/17/2023 07:02:13
SQL>
sysdate
在所有情况下都是一样的,这只是你看到它的方式。 表格也是如此;它的日期格式设置为
dd-MON-yy
或
dd-MON-rr
,因此您将其视为
11-OCT-23
,但它与任何其他格式一样有效。如果您必须对该变量进行一些
日期算术,没问题 - 您可以,并且当您处理date
数据类型时,所有值都可以。您
可以修改您查看该值的方式 - 最简单的方法是使用所需的格式掩码应用to_char
,例如
SQL> select to_char(sysdate, 'yyyy-MON-dd') from dual;
TO_CHAR(SYSDATE,'YYY
--------------------
2023-OCT-17
但现在这是一个字符串(例如“ABC”或“Littlefoot”等),因此-对于日期算术运算-您现在必须将其转换回日期(再次使用to_date
)使用与该字符串匹配的适当格式掩码)或者 - 更糟糕 - 依赖 Oracle 的隐式数据类型转换功能,这很简单“错误”。想象一下您看到这个值:
02/04/08
。它是什么?
2008年4月2日
再次强调:只要您使用 date