PLS-00306:错误的编号或具有正确编号和类型的参数类型

问题描述 投票:-1回答:1
create or replace PROCEDURE REC_PURGE
(
  pInterfaceName              IN    VARCHAR2,
  pInterfaceRunDate           IN    VARCHAR2,        -- MM/DD/YYYY
  PARAM_CLEANUP_DAYS          IN    NUMBER,
  pErrorCd                    OUT   NUMBER
)
AS

--************************************************************************************************************
--**                      DECLARE LOCAL VARIABLES                                                           **
--************************************************************************************************************/
  LV_CLEANUP_DAYS                     NUMBER        := 366; 
  LV_SP_RUN_DT                        VARCHAR2(19)  := pInterfaceRunDate; 
  lv_interdaceRunDate                 TIMESTAMP     := TO_DATE(pInterfaceRunDate,'MM/DD/YYYY');

BEGIN


IF PARAM_CLEANUP_DAYS IS NOT NULL THEN
  LV_CLEANUP_DAYS := PARAM_CLEANUP_DAYS;
END IF;

DELETE /*+ PARALLEL(16) */
from ST_DTI_MBR_STG
where rec_lst_updt_dttm <= trunc(TO_DATE(LV_SP_RUN_DT,'MM/DD/YYYY')-LV_CLEANUP_DAYS);

COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        pErrorCd:= SQLCODE;
        pErrorMsg := 'Failure at step ' || TO_CHAR(lvCurrentStep, '99.90') || ' with the message: ' || SQLCODE || '-' || SQLERRM;

END REC_PURGE;

这是我创建程序的代码,我像这样rxc:

DECLARE
  PINTERFACENAME VARCHAR2(200);
  PINTERFACERUNDATE VARCHAR2(19);
  PARAM_CLEANUP_RANGE NUMBER;
  PERRORCD NUMBER;
BEGIN
  PINTERFACENAME :='REC';
  PINTERFACERUNDATE := '03/18/2020';
  PARAM_CLEANUP_RANGE := '366';

  REC_PURGE(
    PINTERFACENAME => PINTERFACENAME,
    PINTERFACERUNDATE => PINTERFACERUNDATE,
    PARAM_CLEANUP_RANGE => PARAM_CLEANUP_RANGE,
    PERRORCD => PERRORCD
  );
  PERRORCD := PERRORCD;
END;

类型和数字匹配,但我仍然收到错误

ORA-06550: line 11, column 3:
PLS-00306: wrong number or types of arguments in call to 'REC_PURGE'
ORA-06550: line 11, column 3:
PL/SQL: Statement ignored

有人知道为什么吗?

oracle debugging plsql procedure
1个回答
1
投票

[不确定为什么要声明Varchar保留日期。使用DATE变量保存日期,如下所示:

表格:

CREATE TABLE st_dti_mbr_stg
  ( col NUMBER,rec_lst_updt_dttm TIMESTAMP
  );

 SELECT * FROM st_dti_mbr_stg;

 INSERT INTO st_dti_mbr_stg  VALUES   (1,sysdate );
 INSERT INTO st_dti_mbr_stg  VALUES   (1,sysdate-60 );

步骤:

create or replace PROCEDURE REC_PURGE
(
  pInterfaceName              IN    VARCHAR2,
  pInterfaceRunDate           IN    DATE,-- VARCHAR2,    --<-- Use Date variable
  PARAM_CLEANUP_DAYS          IN    NUMBER,
  pErrorCd                    OUT   NUMBER
)
AS

--************************************************************************************************************
--**                      DECLARE LOCAL VARIABLES                                                           **
--************************************************************************************************************/
  LV_CLEANUP_DAYS                     NUMBER        := 366; 
 -- LV_SP_RUN_DT                        VARCHAR2(19)  := pInterfaceRunDate; 
  LV_SP_RUN_DT                        DATE       := pInterfaceRunDate; 
  --lv_interdaceRunDate                 TIMESTAMP     := TO_DATE(pInterfaceRunDate,'MM/DD/YYYY');

BEGIN

IF PARAM_CLEANUP_DAYS IS NOT NULL 
THEN
  LV_CLEANUP_DAYS := PARAM_CLEANUP_DAYS;
END IF;

dbms_output.put_line(LV_SP_RUN_DT || '  '||LV_CLEANUP_DAYS);

DELETE /*+ PARALLEL(16) */
from ST_DTI_MBR_STG
where trunc(rec_lst_updt_dttm) <= LV_SP_RUN_DT - LV_CLEANUP_DAYS;

COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        pErrorCd:= SQLCODE;
       -- pErrorMsg := 'Failure at step ';-- || TO_CHAR(lvCurrentStep, '99.90') || ' with the message: ' || SQLCODE || '-' || SQLERRM;

END REC_PURGE;

执行;

DECLARE
  PINTERFACENAME VARCHAR2(200);
  PINTERFACERUNDATE DATE ;--VARCHAR2(19);
  PARAM_CLEANUP_RANGE NUMBER;
  PERRORCD NUMBER;
BEGIN
  PINTERFACENAME :='REC';
  PINTERFACERUNDATE :=to_Date('03/18/2020','MM/DD/YYYY');
  PARAM_CLEANUP_RANGE := 30;

  REC_PURGE(
    pInterfaceName => PINTERFACENAME,
    pInterfaceRunDate => PINTERFACERUNDATE,
    PARAM_CLEANUP_DAYS => PARAM_CLEANUP_RANGE, --<- You messed up argument name
    pErrorCd => PERRORCD
  );
  PERRORCD := PERRORCD;
END;
© www.soinside.com 2019 - 2024. All rights reserved.