下面是包 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;
我用两个不同的过程编写了包,用于 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 在评论中指出的那样,当您执行高度相关的事情时,重载过程是正常的。例如,如果您使用过程发送电子邮件,并且将电子邮件地址作为字符串或数组传递。您似乎没有在此处的过程中执行相同的操作,并且可能需要重新考虑执行此操作的必要性。
关于sql - 包中的重载过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217166/