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
相关产品推荐
相关产品推荐

