sql - 包中的重载过程

标签 sql oracle plsql overloading plsqldeveloper

下面是包 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/

相关文章:

oracle - 如何解决 Oracle DBMS_LOB 问题

sql - 查询嵌套表

sql - 选择常量作为伪列并对伪列进行算术运算

mysql - 架构定义中的 SQL 日期格式

mysql - 在 Mysql 中标记旧的重复项

database - 如何调用存储在表中的名称的 PL/SQL 过程?

sql - 此实现是否符合SQL-92?

php - 错误 SQLSTATE[42000] : Syntax error or access violation: 1064 You have an error in your SQL syntax

java - java.io.File 的静态最终字段的命名不标准

sql - scn 如何在 Oracle 中使用 sys.smon_scn_time 映射到时间戳?