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;

PACKAGETASK5のBODY

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つの異なる入力に対して2つの異なる手順でパッケージを作成しました。しかし、オーバーロード手順でヘッダーと本文を書き直したいのですが、何か提案はありますか?

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 に答える