【问题标题】:Taking Previous Months' Date Automatically in PLSQL在 PLSQL 中自动获取上个月的日期
【发布时间】:2021-11-25 18:26:18
【问题描述】:

您好,我有一个程序和问题。此过程用于提取数据,然后将它们插入到一个表中。当我测试我的代码时,我必须输入一些参数来执行程序。

`--this is how I execute the procedure
begin
    GPU_DATA_EXTRACTOR(to_date('31/08/2021','DD/MM/YYYY'));
end;`

但是我想做的是,当 billdate 参数为 NULL 时,程序应该自动执行上个月的最后一天作为参数。我怎样才能做出这种改变?从现在开始,我愿意接受任何更新建议,谢谢。 更新了下面的脚本。

        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

   execute immediate 'truncate table GPU_INV_TEST';

  OPEN c1;

  LOOP
     FETCH c1 BULK COLLECT INTO l_prod_ids LIMIT c_limit;
     
     EXIT WHEN l_prod_ids.COUNT = 0;

    FORALL indx IN 1 .. l_prod_ids.COUNT
    
      INSERT INTO GPU_INV_TEST
         SELECT AB.ACCT_BILL_ID,
                AB.BILL_NO,
                AB.INV_ID,
                AB.BILL_DATE,
                ba2.bill_acct_id,
                ba1.bill_acct_id parent_bill_acct_id,
                AB.DUE_DATE,
                PG.CMPG_ID,
                ABR.NET_AMT,
                AB.DUE_AMT,
                P.PROD_NUM,
                pds.DST_ID,
                ABR.DESCR,
                p.intl_prod_id
           FROM apld_bill_rt abr,
                acct_bill ab,
                prod p,
                FCBSADM.PROD_DST pds,
                bill_acct_prod bap,
                bill_acct ba1,
                bill_acct ba2,
                prod_cmpg pg
          WHERE ab.intl_bill_acct_id = ba1.intl_bill_acct_id
                AND AB.ACCT_BILL_ID = ABR.ACCT_BILL_ID
                AND ba1.intl_bill_acct_id = ba2.parent_bill_acct_id
                AND ba2.intl_bill_acct_id = bap.intl_bill_acct_id
                AND bap.intl_prod_id = abr.intl_prod_id
                AND ABR.CHRG_TP = 'INSTALLMENT'
                AND bap.intl_prod_id = pds.intl_prod_id
                AND bap.intl_prod_id = p.intl_prod_id
                AND p.intl_prod_id = pg.intl_prod_id(+)
                AND ABR.intl_prod_id = l_prod_ids(indx)
UNION
    SELECT AB.ACCT_BILL_ID,
                AB.BILL_NO,
                AB.INV_ID,
                AB.BILL_DATE,
                ba1.bill_acct_id,
                ba1.bill_acct_id parent_bill_acct_id,
                AB.DUE_DATE,
                PG.CMPG_ID,
                ABR.NET_AMT,
                AB.DUE_AMT,
                P.PROD_NUM,
                pds.DST_ID,
                ABR.DESCR,
                p.intl_prod_id
           FROM apld_bill_rt abr,
                acct_bill ab,
                prod p,
                FCBSADM.PROD_DST pds,
                bill_acct_prod bap,
                bill_acct ba1,
                prod_cmpg pg
          WHERE ab.intl_bill_acct_id = ba1.intl_bill_acct_id
                AND AB.ACCT_BILL_ID = ABR.ACCT_BILL_ID
                --AND ba1.intl_bill_acct_id = ba2.parent_bill_acct_id
                AND ba1.intl_bill_acct_id = bap.intl_bill_acct_id
                AND bap.intl_prod_id = abr.intl_prod_id
                AND ABR.CHRG_TP = 'INSTALLMENT'
                AND bap.intl_prod_id = pds.intl_prod_id
                AND bap.intl_prod_id = p.intl_prod_id
                AND p.intl_prod_id = pg.intl_prod_id(+)
                AND ABR.intl_prod_id = l_prod_ids(indx);

      
    COMMIT;  
    
    END LOOP;
   CLOSE c1;
end;

【问题讨论】:

  • @Gar 你怎么看这个问题?

标签: database oracle plsql rdbms


【解决方案1】:

您可以为参数添加默认值。以如下函数为例:

CREATE OR REPLACE FUNCTION sf_showDefault
(
  p_in DATE DEFAULT LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), -1))
)
RETURN DATE
IS
BEGIN
  RETURN p_in;
END sf_showDefault;
/

当没有输入参数时,它会得到一个截断的SYSDATE 并减去一个月,然后如果找到该月的最后一天。该函数所做的只是返回该数据(或您传入的数据……如果您愿意的话)。

这是一个显示DEFAULT参数效果的DBFiddle (LINK)

【讨论】:

  • 您好,感谢您的回答。您认为我应该在程序中添加该函数的哪一行?我的第二个问题是,如果它有效,将执行什么脚本? (我的假设是开始 GPU_DATA_EXTRACTOR;结束;但不确定
  • @burakzbc 该函数只是一个示例。如果您想在您的过程中使用它,只需复制DEFAULT LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), -1)) 并将其放在参数定义中的单词DATE 之后。
  • 您好,定义编译成功,但我在开发环境中只有日期31/8/2021的记录。因此,当我执行不带参数的测试过程时,它可以工作,但不会在表中插入任何内容。你认为应该是什么原因?是关于我只有八月的记录还是其他什么?我用“-2”测试过。它也没有插入
  • 顺便说一句,我的第一行是这个//创建或替换过程 GPU_DATA_EXTRACTOR_TEST(pid_billdate DATE DEFAULT LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE), -1)))
  • 因为我们目前在 10 月,我预计它会在 9 月运行。如果您需要使用 8 月份的数据进行测试,只需将 ADD_MONTHS 参数更改为 -2 而不是 -1只是为了测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多