You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PL/SQL存储过程null日期参数默认值设置及测试方法咨询

1 存储过程逻辑修改方案

你当前的写法不生效的核心原因是:Oracle 存储过程的参数默认值仅在调用时未传入该参数时才会触发,如果主动传入NULL,默认值不会生效,此时pid_billdate的值就是NULL,SQL 中ab.bill_date = NULL的判断结果永远为假,自然查不到数据。

只需要在存储过程BEGIN的第一行增加非空判断逻辑即可,修改后的存储过程开头部分如下:

create or replace procedure GPU_DATA_EXTRACTOR_TEST(pid_billdate DATE DEFAULT LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), -1))) is
c_limit   CONSTANT PLS_INTEGER DEFAULT 10000;

CURSOR c1 IS
SELECT DISTINCT intl_prod_id
      FROM apld_bill_rt abr,
           acct_bill ab
      WHERE abr.CHRG_TP = 'INSTALLMENT'
          AND abr.TAX_CATG_ID = 'NOTAX'
          AND abr.acct_bill_id = ab.acct_bill_id
          AND ab.bill_date = pid_billdate;

TYPE prod_ids_t IS TABLE OF apld_bill_rt.intl_prod_id%TYPE INDEX BY PLS_INTEGER;
l_prod_ids   prod_ids_t;
begin
  -- 新增的NULL值处理逻辑
  IF pid_billdate IS NULL THEN
    pid_billdate := LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), -1));
  END IF;

  execute immediate 'truncate table GPU_INV_TEST';
  -- 后续原有逻辑保持不变

这样不管你调用时不传入参数、还是主动传入NULL,都会自动把pid_billdate赋值为上月最后一天,符合你的需求。

2 测试方法

两种场景的测试调用方式如下:

  • 测试不传参数的场景:直接用无参调用写法即可
    BEGIN
       GPU_DATA_EXTRACTOR_TEST();
    END;
    
  • 测试主动传入NULL的场景:显式传入null调用
    BEGIN
       GPU_DATA_EXTRACTOR_TEST(null);
    END;
    

现有测试数据调试技巧

你库中只有2021年8月31日的记录,可以临时把上面的赋值逻辑改成固定值验证逻辑正确性:

IF pid_billdate IS NULL THEN
  pid_billdate := DATE'2021-08-31'; -- 临时替换为有数据的日期
END IF;

验证插入逻辑正常后,再改回动态计算上月最后一天的写法即可。你之前修改默认值的-1为-2没有生效,是因为传NULL时默认值不会触发,且动态计算出来的日期不是2021-08-31,自然匹配不到数据。

内容的提问来源于stack exchange,提问作者vitaminJava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:39:00