重载问题:错误(83,5):PLS-00307:“REPORTEQ”声明太多匹配这个调用
所以我尝试使用重载,但遇到了一些麻烦。我的包有 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;
So I am trying to use overloading but I am having some troubles. My package has 4 procedures with the same name but different type of arguments (VARCHAR2, NUMBER, BOOLEAN, DATE). The package header and package body are at the end of my question.
I am trying to use the package procedure like this:
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;
And I am getting this compilation error:
Error(83,5): PLS-00307: too many declarations of 'REPORTEQ' match this call
What does it mean?
Package header:
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;
And the package body:
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;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的 PL/SQL 变量 how_many 是什么类型?它必须是 VARCHAR2,否则预期值必须是 NUMBER。试试这个:
问题是(假设 how_many 是数字类型)是您没有与 VARCHAR2 和 NUMBER 参数列表匹配的规范。您有 VARCHAR2/VARCHAR2、NUMBER/NUMBER、VARCHAR2/BOOLEAN 和 DATE/DATE。
What type is your PL/SQL variable how_many? It needs to be a VARCHAR2, else expected_value needs to be a NUMBER. Try this:
The problem is (assuming how_many is a numeric type) is that you don't have a spec that matches a VARCHAR2 and a NUMBER parameter list. You've got VARCHAR2/VARCHAR2, NUMBER/NUMBER, VARCHAR2/BOOLEAN, and DATE/DATE.
将
'1'
转换为VARCHAR2
可以解决问题吗?即:我认为文字
'1'
可以被视为VARCHAR2
,或NUMBER
,甚至可能是BOOLEAN< /code> 由 PL/SQL 编译器...
Does casting
'1'
toVARCHAR2
do the trick? I.e.:I think the literal
'1'
can be seen as aVARCHAR2
, or aNUMBER
, or maybe even aBOOLEAN
by the PL/SQL compiler...