PL SQL : 此表达式类型的自定义数据类型声明不完整或函数格式错误

PL SQL : custom data type declaration of the type of this expression is incomplete or malformed function

我创建了一个具有如下功能的包:

create or replace 
PACKAGE TRANSAC_ERRONNEES AS

TYPE dateArrayVar IS TABLE OF DATE;

FUNCTION calc_date_moyenne(dateArrayIn dateArrayVar                    
                       ) RETURN DATE; 
END TRANSAC_ERRONNEES;

正文:

CREATE OR REPLACE PACKAGE BODY TRANSAC_ERRONNEES AS
  FUNCTION calc_date_moyenne(dateArrayIn datearrayvar) RETURN DATE IS 
    dateFinal DATE;
    tempsEnSeconde NUMBER;
    tempsMoyenEnSeconde NUMBER;  
  BEGIN
      tempsEnSeconde := 0;
      tempsMoyenEnSeconde := 0;

      FOR i IN 1..dateArrayIn.count loop
        tempsEnSeconde := to_number(to_char(dateArrayIn(i), 'HH24')) * 60 * 60 + to_number(to_char(dateArrayIn(i), 'MI')) * 60 + to_number(to_char(dateArrayIn(i), 'SS'));
        tempsMoyenEnSeconde := tempsMoyenEnSeconde+tempsEnSeconde;
      end loop;

      tempsMoyenEnSeconde := tempsMoyenEnSeconde/dateArrayIn.count;
      dateFinal := to_date(TO_CHAR(dateArrayIn(1),'DD-MM-YYYY') || ' ' || TO_CHAR(to_date(tempsMoyenEnSeconde,'sssss'), 'HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS');
      dbms_output.put_line(TO_CHAR(dateFinal,'DD-MM-YYYY HH24:MI:SS'));
      RETURN dateFinal;
  END calc_date_moyenne;
END TRANSAC_ERRONNEES;
/

我试着像这样测试这个功能:

DECLARE
  dates dateArrayVar;
  resultat DATE;

BEGIN
 dates := dateArrayVar(SYSDATE, SYSDATE);
 resultat := transac_erronnees.calc_date_moyenne(dates);
END;

我收到以下错误:

PLS-00320: the declaration of the type of this expression is incomplete or malformed

请告诉我错误。提前致谢。

您使用的方式不正确。您需要使用带有 extend 的数组来分配内存,然后在其中分配值。

DECLARE
  dates dateArrayVar;
  resultat DATE;

BEGIN
 dates.extend(2); -- Since you want to assign two values, extend by 2
 dates(1) := SYSDATE;
 dates(2) := SYSDATE;
 resultat := transac_erronnees.calc_date_moyenne(dates);
END;

更新:第二件事是 DateArrayVar 仅在您创建的包内具有作用域,在匿名块中,Oracle 看不到该声明。一种解决方案是创建对所有其他过程和匿名块可见的外部类型或测试,在包内创建过程并从外部调用它。

create or replace 
PACKAGE TRANSAC_ERRONNEES AS

TYPE dateArrayVar IS TABLE OF DATE;

FUNCTION calc_date_moyenne(dateArrayIn dateArrayVar                    
                       ) RETURN DATE; 
PROCEDURE test;
END TRANSAC_ERRONNEES;
/

CREATE OR REPLACE PACKAGE BODY TRANSAC_ERRONNEES AS
  FUNCTION calc_date_moyenne(dateArrayIn datearrayvar) RETURN DATE IS 
    dateFinal DATE;
    tempsEnSeconde NUMBER;
    tempsMoyenEnSeconde NUMBER;  
  BEGIN
      tempsEnSeconde := 0;
      tempsMoyenEnSeconde := 0;

      FOR i IN 1..dateArrayIn.count loop
        tempsEnSeconde := to_number(to_char(dateArrayIn(i), 'HH24')) * 60 * 60 + to_number(to_char(dateArrayIn(i), 'MI')) * 60 + to_number(to_char(dateArrayIn(i), 'SS'));
        tempsMoyenEnSeconde := tempsMoyenEnSeconde+tempsEnSeconde;
      end loop;

      tempsMoyenEnSeconde := tempsMoyenEnSeconde/dateArrayIn.count;
      dateFinal := to_date(TO_CHAR(dateArrayIn(1),'DD-MM-YYYY') || ' ' || TO_CHAR(to_date(tempsMoyenEnSeconde,'sssss'), 'HH24:MI:SS'), 'DD-MM-YYYY HH24:MI:SS');
      dbms_output.put_line(TO_CHAR(dateFinal,'DD-MM-YYYY HH24:MI:SS'));
      RETURN dateFinal;
  END calc_date_moyenne;

PROCEDURE test
  dates dateArrayVar;
  resultat DATE;

BEGIN
     dates.extend(2); -- Since you want to assign two values, extend by 2
     dates(1) := SYSDATE;
     dates(2) := SYSDATE;
     resultat := transac_erronnees.calc_date_moyenne(dates);
END;
END TRANSAC_ERRONNEES;
/

为了测试,将其命名为

BEGIN
  TRANSAC_ERRONNEES.TEST;
END;
/

DateArrayVar has scope only within the package

我找到了解决方案:我必须指定包:TRANSAC_ERRONNEES.dateArrayVar;

所以:

DECLARE
  dates TRANSAC_ERRONNEES.dateArrayVar;
  resultat DATE;

BEGIN
 dates := TRANSAC_ERRONNEES.dateArrayVar(SYSDATE, SYSDATE);
 resultat := transac_erronnees.calc_date_moyenne(dates);
 dbms_output.put_line(TO_CHAR(resultat,'DD-MM-YYYY HH24:MI:SS'));
END;

现在可以用了,谢谢