oracle - 如果它们为空,如何在过程中设置日期输入参数的默认值?
问题描述
我有一个 Procedure ,它接受 fromDate 和 toDate 输入参数,我需要将默认值分别设置为上个月的第一个日期和上个月的最后一个日期。我正在尝试使用下面的代码,但仍未设置正确的默认日期。请让我知道以下代码是否有效,或者我可以采取一些措施来纠正它:
create or replace PROCEDURE "TEST"
(
fromdate_in IN varchar2,
todate_in IN varchar2,
type_in IN number DEFAULT 01
)
is
V_date varchar2(3000);
begin
select to_date(fromdate_in) into V_date from dual; -- Correct date entered
Exception WHEN Others THEN
select to_char(trunc(trunc(sysdate, 'MM') - 1, 'MM'),'DD/MM/RRRR') into V_date from dual; -- if fromdate_in --is null then set V_date to first date of Previous month
-- calculations using V_date
end TEST;
请注意,为简单起见,我仅展示了如何将上个月的第一个日期设置为起始日期。
解决方案
如果要为参数设置默认值,请按照以下示例进行操作:
SQL> create or replace procedure p_test
2 (fromdate_in in varchar2
3 default to_char(trunc(add_months(sysdate, -1), 'mm'), 'dd/mm/rrrr'))
4 is
5 begin
6 dbms_output.put_Line('fromdate_in = ' || fromdate_in);
7 end;
8 /
Procedure created.
如您所愿,其默认值为上个月的第一天。像这样工作:
SQL> set serveroutput on;
SQL> exec p_test;
fromdate_in = 01/08/2018
PL/SQL procedure successfully completed.
SQL> exec p_test('24/09/2018');
fromdate_in = 24/09/2018
PL/SQL procedure successfully completed.
SQL>
请注意,您应该真正考虑切换到DATE
数据类型参数,而不是VARCHAR2
- 无论如何您都在处理日期,所以 - 为什么要为传递给过程的无效值烦恼?如果它是一个字符串,什么会阻止某人将例如'99/66/x-FZ'传递给程序?现在您必须担心它,编写异常处理程序...一切,因为您没有将参数的数据类型设置为DATE
.
推荐阅读
- xamarin - Webview 网页 + 视频或 Youtube
- wcf - 如何将 basicHttpBinding 添加到自定义绑定代码
- go - 测试用例在 gin 框架中不起作用
- php - 如何在 PHP 中显示多维数组(2D、3D、4D 等),如 var_dump 和循环和回显?
- c++ - 获取 CRTP 继承链中最深的类
- arrays - 如何在 MQL5 中打印多维数组中的值?
- php - 我的 PHP 脚本不想创建 ZIP 文件
- python - 遍历目录中的文件并使用 pandas 将结果写入数据帧的新行
- javascript - 如何将页面上的所有 cookie 保存到 txt 文件(并记录页面 URL)
- html - 如何从我的组织外部删除传入邮件正文中的警告集