以下是包TASK5的HEADER
CREATE OR REPLACE PACKAGE TASK5
AS
PROCEDURE TASK5APROCEDURE (
REG_NO IN NUMBER,
CERT_TITLE OUT VARCHAR2,
E_DATE OUT DATE,
C_MARKS OUT INTEGER);
PROCEDURE TASK5BPROCEDURE (
CERT_ID IN CHAR,
C_T OUT CHAR) ;
END TASK5;
PACKAGE TASK5的身体
CREATE OR REPLACE PACKAGE BODY TASK5
AS
PROCEDURE TASK5APROCEDURE (
REG_NO IN NUMBER,
CERT_TITLE OUT VARCHAR2,
E_DATE OUT DATE,
C_MARKS OUT INTEGER)
IS
BEGIN
SELECT
O.PCP_TITLE,
C.CERT_EXAMDATE,
C.CERT_MARKS
INTO
CERT_TITLE,
E_DATE,
C_MARKS
FROM
PROFCERTPROGRAM O
INNER JOIN
CERTIFICATION C
ON O.PCP_ID = C.PCP_ID
WHERE
C.S_REGNO LIKE REG_NO;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE('NO DATA FOUND');
END TASK5APROCEDURE;
PROCEDURE TASK5BPROCEDURE (
CERT_ID IN CHAR, C_T OUT CHAR)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE ('COURSE NAMES: ');
FOR R IN (
SELECT O.C_TITLE C_T
FROM
COURSE O
INNER JOIN
CERTIFICATIONREQUIREMENT C
ON O.C_ID = C.C_ID
WHERE
C.PCP_ID LIKE '%'||CERT_ID||'%')
LOOP
DBMS_OUTPUT.PUT_LINE (R.C_T);
END LOOP ;
END TASK5BPROCEDURE;
END TASK5;
我为两个不同的输入编写了两个不同的程序包。 但是,我想用重载程序重写标题和正文,有什么建议吗?
答案 0 :(得分:2)
重载意味着在包中创建多个相同名称的过程或函数,这些过程或函数使用不同数量的参数和/或参数具有不同的数据类型。这使您可以调用过程并根据给定的参数发生不同的事情。
因此,您的问题的答案很简单。在包规范和包体中将TASK5BPROCEDURE
重命名为TASK5APROCEDURE
。或者,将它们重命名为不同的东西。作为一个例子,您的规范之后可能会如下所示:
create or replace package task5 as
procedure task5procedure (
, reg_no in number
, cert_title out varchar2
, e_date out date
, c_marks out integer);
procedure task5procedure (
, cert_id in char
, c_t out char);
end task5;
在一个有用的注意事项中,在捕获的异常中使用dbms_output.put_line
并不是最好的做法。如果你要捕捉异常,你应该对它做点什么。
正如APC在评论中指出的那样,当你做高度相关的事情时,重载程序是正常的。例如,如果您使用过程发送电子邮件,并且您将电子邮件地址作为字符串或数组传递。你似乎没有在你的程序中做同样的事情,可能想重新考虑这样做的必要性。