Oracle 过程在 Oracle 形式中调用时传递不同的结果,而在 sql Developer 中调用时传递相同的结果

问题描述 投票:0回答:1

我尝试在 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');
plsql oracle-sqldeveloper oracleforms
1个回答
0
投票

从我的角度来看,一切都很好。这与日期值本身无关,而是它呈现给您的方式。

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日

    2002 年 8 月 4 日
  • 2004 年 2 月 8 日
  • 可能是这些值中的
  • 任何
- 这就是格式模型很重要的原因。

再次强调:只要您使用 date

数据类型,就可以了。不要走向黑暗面并使用字符(代表日期值)。

© www.soinside.com 2019 - 2024. All rights reserved.