0
CREATE OR REPLACE PROCEDURE ABC ( REG_NO   IN  CO_ENROLMENT.S_REGNO%TYPE,
                                  TERM     IN  COURSEOFFERING.CO_TERMNUMBER%TYPE,
                                  YEAR     IN  COURSEOFFERING.CO_YEAR%TYPE,
                                  CO_TITLE IN  COURSE.C_TITLE%TYPE,
                                  EN_DATE  OUT CO_ENROLMENT.COE_ENROLDATE%TYPE,
                                  COM_ST   OUT CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE)

AS 
BEGIN
   SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
     INTO COM_ST, EN_DATE
     FROM COURSEOFFERING O
    INNER JOIN COURSE C
            ON C.C_ID = O.C_ID
    INNER JOIN CO_ENROLMENT M
            ON M.CO_ID = O.CO_ID
    WHERE M.S_REGNO LIKE REG_NO AND
          O.CO_TERMNUMBER LIKE TERM AND
          O.CO_YEAR LIKE YEAR AND
          C.C_TITLE LIKE CO_TITLE;
END ABC;

以上の手順を書きました。以下は、上記のプロシージャを呼び出す PL/SQL ブロックです。

DECLARE
  COMPL_STATUS   CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE;
  ENROL_DATE     CO_ENROLMENT.COE_ENROLDATE%TYPE;
BEGIN
  ABC (44444444, 2009, 2, 'PLSQL Programming', 
       EN_DATE => enrol_date, COM_ST =>compl_status);
  DBMS_OUTPUT.PUT_LINE ('STUDENT COMPLETION STATUS AND ENROLMENT DATE IS ' 
                         || ENROL_DATE
                         || '    ' 
                         || compl_status );
END;

データが見つからないというエラーが返されますが、クエリを個別に実行すると出力が得られます。何が悪いのかわかりませんでした。プロシージャ ブロックを正しく記述し、PL/SQL ブロックで渡されるパラメータは正しいですか?

4

4 に答える 4

1

プロシージャ クエリにワイルドカードが不足している可能性があります。

16:02:06 SYSTEM@dwh-prod> select * from dual where 'abc' like 'ab'; 

no rows selected                                                    


16:02:18 SYSTEM@dwh-prod> select * from dual where 'abc' like 'ab%';

D                                                                   
-                                                                   
X                                                                   

それらがなければ、C.C_TITLE LIKE CO_TITLEは と等しくなりますがC.C_TITLE = CO_TITLE、これは必ずしも必要なものではありません。

C.C_TITLE LIKE '%'||CO_TITLE||'%'などをお試しください。

于 2012-10-31T08:03:52.713 に答える
1

selectプロシージャ内のステートメントがABC行を返さない場合、NO_DATA_FOUND例外が発生し、ストアド プロシージャの実行が停止します。このような動作を回避するには、ストアド プロシージャにセクションを追加EXCEPTIONして、例外をキャッチし、適切に対応する必要があります。そのために、ストアド プロシージャの実行セクションは次のようになります。

BEGIN
   SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
     INTO COM_ST, EN_DATE
     FROM COURSEOFFERING O
    INNER JOIN COURSE C
            ON C.C_ID = O.C_ID
    INNER JOIN CO_ENROLMENT M
            ON M.CO_ID = O.CO_ID
    WHERE M.S_REGNO LIKE REG_NO AND
          O.CO_TERMNUMBER LIKE TERM AND
          O.CO_YEAR LIKE YEAR AND
          C.C_TITLE LIKE CO_TITLE;
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example
END ABC

または、ステートメントが例外を発生させても続行したい場合は、ステートメントをネストされたブロック でselect囲むことができます。selectBEGIN .. END

BEGIN
   -- some code before
   BEGIN    
     SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
       INTO COM_ST, EN_DATE
       FROM COURSEOFFERING O
      INNER JOIN COURSE C
              ON C.C_ID = O.C_ID
      INNER JOIN CO_ENROLMENT M
              ON M.CO_ID = O.CO_ID
      WHERE M.S_REGNO LIKE REG_NO AND
            O.CO_TERMNUMBER LIKE TERM AND
            O.CO_YEAR LIKE YEAR AND
            C.C_TITLE LIKE CO_TITLE;
   EXCEPTION
     WHEN NO_DATA_FOUND
     THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example
  END;
  -- some code after
END ABC
于 2012-10-31T06:59:39.280 に答える
1

proc では、3 位の年がありますが、2 位でそれを呼び出します。また、型 (COURSEOFFERING.CO_TERMNUMBER%TYPE、COURSEOFFERING.CO_TERMNUMBER%TYPE) はどのように宣言されるのでしょうか?

于 2012-10-31T06:56:51.120 に答える
0

ストアド プロシージャを間違って呼び出しています。パラメータを正しい順序で指定するか、名前付きパラメータ表記法を使用する必要があります。

ABC (44444444, 2, 2009, 'PLSQL Programming', enrol_date, compl_status);

また

ABC (REG_NO => 44444444, YEAR => 2009, TERM => 2,
   CO_TITLE => 'PLSQL Programming', 
   EN_DATE => enrol_date, COM_ST =>compl_status);

名前付きパラメーター表記法を使用すると、パラメーターを別の順序で指定できることがわかります (パラメーターに DEFAULT 値がある場合は、まったく指定できません)。

于 2012-10-31T08:09:11.470 に答える