Проблема перегрузки: ошибка (83,5): PLS-00307: слишком много объявлений «REPORTEQ» соответствуют этому вызову - PullRequest
2 голосов
/ 15 мая 2011

Итак, я пытаюсь использовать перегрузку, но у меня есть некоторые проблемы.В моем пакете 4 процедуры с одинаковым именем, но с разными типами аргументов (VARCHAR2, NUMBER, BOOLEAN, DATE).Заголовок пакета и тело пакета в конце моего вопроса.

Я пытаюсь использовать процедуру пакета следующим образом:

OPEN bookCountCur;
FETCH bookCountCur INTO how_many;
testutil.reporteq('add procedure, book record count',
  expected_value => '1', actual_value => how_many);
CLOSE bookCountCur;

OPEN copiesCountCur;
FETCH copiesCountCur INTO how_many;
testutil.reporteq('add procedure, book copy record count',
  expected_value => '1', actual_value => how_many);
CLOSE copiesCountCur;

И я получаю эту ошибку компиляции:

Error(83,5): PLS-00307: too many declarations of 'REPORTEQ' match this call

Что это значит?


Заголовок пакета:

CREATE OR REPLACE 
PACKAGE TESTUTIL AS 

  /* TODO enter package declarations (types, exceptions, methods etc) here */ 

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN VARCHAR2, actual_value IN VARCHAR2);

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN NUMBER, actual_value IN NUMBER);

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN BOOLEAN, actual_value IN BOOLEAN);

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN DATE, actual_value IN DATE);

END TESTUTIL;

И тело пакета:

CREATE OR REPLACE
PACKAGE BODY TESTUTIL AS

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN VARCHAR2, actual_value IN VARCHAR2) AS
  BEGIN
    DBMS_OUTPUT.PUT(description || ': ');

    IF expected_value = actual_value 
    OR expected_value IS NULL AND actual_value IS NULL
    THEN
      DBMS_OUTPUT.PUT_LINE('PASSED');
    ELSE
      DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value);
    END IF;
  END reporteq;

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN NUMBER, actual_value IN NUMBER) AS 
  BEGIN
    DBMS_OUTPUT.PUT(description || ': ');

    IF expected_value = actual_value 
    OR expected_value IS NULL AND actual_value IS NULL
    THEN
      DBMS_OUTPUT.PUT_LINE('PASSED');
    ELSE
      DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value);
    END IF;
  END reporteq;

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN BOOLEAN, actual_value IN BOOLEAN) 
  AS
    expected_value_tostr VARCHAR2(5);
    actual_value_tostr VARCHAR2(5); 
  BEGIN
    DBMS_OUTPUT.PUT(description || ': ');

    IF expected_value = actual_value 
    OR expected_value IS NULL AND actual_value IS NULL
    THEN
      DBMS_OUTPUT.PUT_LINE('PASSED');
    ELSE
      /* Transform TRUE/FALSE to 'TRUE'/'FALSE' */
      IF TRUE = expected_value
      THEN
        expected_value_tostr := 'TRUE';
      ELSE
        expected_value_tostr := 'FALSE';
      END IF;
      IF TRUE = actual_value
      THEN
        actual_value_tostr := 'TRUE';
      ELSE
        actual_value_tostr := 'FALSE';
      END IF;
      DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value_tostr || '; got ' || actual_value_tostr);
    END IF;
  END reporteq;

  PROCEDURE reporteq(description IN VARCHAR2
  , expected_value IN DATE, actual_value IN DATE) AS
  BEGIN
    DBMS_OUTPUT.PUT(description || ': ');

    IF expected_value = actual_value 
    OR expected_value IS NULL AND actual_value IS NULL
    THEN
      DBMS_OUTPUT.PUT_LINE('PASSED');
    ELSE
      DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || TO_CHAR(expected_value, 'YYYY/MM/DD') 
      || '; got ' || TO_CHAR(actual_value, 'YYYY/MM/DD'));
    END IF;
  END reporteq;

END TESTUTIL;

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Какого типа ваша переменная PL / SQL how_many ?Это должен быть VARCHAR2, иначе ожидается, что_значение должно быть ЧИСЛО.Попробуйте это:

testutil.reporteq('add procedure, book record count',
  expected_value => '1', actual_value => TO_CHAR(how_many));

Проблема заключается в том, что (если how_many является числовым типом) в том, что у вас нет спецификации, которая соответствует VARCHAR2 и списку параметров NUMBER.У вас есть VARCHAR2 / VARCHAR2, NUMBER / NUMBER, VARCHAR2 / BOOLEAN и DATE / DATE.

1 голос
/ 15 мая 2011

Делает ли кастинг '1' на VARCHAR2 свое дело? I.e.:

testutil.reporteq('add procedure, book record count',
  expected_value => cast('1' as VARCHAR2), actual_value => how_many);

Я думаю, что литерал '1' может рассматриваться компилятором PL / SQL как VARCHAR2, или NUMBER, или, может быть, даже BOOLEAN ...

...