2

以下是包 TASK5 的标题

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;

我为两个不同的输入编写了两个不同的程序包。但是,我想用重载过程重写标题和正文,有什么建议吗?

4

1 回答 1

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 在评论中指出的那样,当您执行高度相关的事情时,重载程序是正常的。例如,如果您使用过程发送电子邮件,并且将电子邮件地址作为字符串或数组传递。您在这里的程序中似乎没有做同样的事情,并且可能想重新考虑这样做的必要性。

于 2012-11-04T12:18:28.193 回答