所以我试图使用重载但是我遇到了一些麻烦。我的包有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;
答案 0 :(得分:3)
您的PL / SQL变量 how_many 是什么类型的?它必须是VARCHAR2,否则expected_value需要是NUMBER。试试这个:
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 :(得分:1)
将'1'
投射到VARCHAR2
是否有效?即:
testutil.reporteq('add procedure, book record count',
expected_value => cast('1' as VARCHAR2), actual_value => how_many);
我认为文字'1'
可以被PL / SQL编译器视为VARCHAR2
或NUMBER
,甚至可能被BOOLEAN
视为...... < / p>