2

私はPL/SQLを初めて使用するので、これが初心者のような質問であると思われる場合は、マークを付けないでください。私はこれに数時間取り組んできましたが、今は助けを求めています。さらに、このコードは不完全であることに注意してください。私はそれを完了するための助けを求めています。そこで、KEYBOARD_LEARNINGというテストテーブルの簡単なプロシージャを作成しようとしています。以前は、このコードを手動で使用する必要がありました。

INSERT INTO keyboard_learning (emplid, wpm, date_completed,exercise,attempt,score_lvl) 
VALUES ('000000000','37.66','04-JUL-2012','Keyhero.com','28','95.87% accuracy')

..新しいスコアをKEYBOARD_LEARNINGに記録したいときはいつでも。これを処理するプロシージャを作成できると思いましたが、このプロシージャを呼び出すときに入力する値は常に変化するため、静的ではない必要があります。私が持っているコードをこの最適な機能で動作させる方法について何か考えはありますか?ちなみに、以下のコードは実行されていません。経験豊富なOracleユーザーは、その理由をすぐに理解できると確信しています。

ありがとうございました

CREATE OR REPLACE PROCEDURE INSERT_WPM_SCORE
(
          P_EMPLID VARCHAR2
         ,P_WPM NUMBER
         ,P_DATE_COMPLETED SYSDATE
         ,P_EXERCISE VARCHAR2
         ,P_ATTEMPT VARCHAR2
         ,P_SCORE_LVL VARCHAR2
) AS

          /*
          Original Author: 
          Created Date: 2-Aug-2012
          Purpose: For inputting latest WPM score from typing practice
          */

          /*variables*/

          L_EMPLID VARCHAR2(4000);
          L_WPM NUMBER;
          L_DATE_COMPLETED SYSDATE;
          L_EXERCISE VARCHAR2(4000);
          L_ATTEMPT VARCHAR2(4000);
          L_SCORE_LVL VARCHAR2(4000);
          L_PREVENT_NULL_INPUT EXCEPTION;
          PRAGMA EXCEPTION_INIT(L_PREVENT_NULL_INPUT, -44002); --GET CORRECT ERROR # BY TESTING WITHOUT EXCEPTION
          VALUES VARCHAR2(4000);  [b]<-- getting an error here[/b]

          /*Procedure 'W' is a wrapper for DBMS output*/
          PROCEDURE W(STR VARCHAR2) IS
                        L_STRING VARCHAR2(4000);
          BEGIN
                        /*Outputting string parameter passed into 'W' procedure*/
                        L_STRING := STR;
                        DBMS_OUTPUT.PUT_LINE(STR);
          END;

BEGIN

         VALUES := (L_EMPLID, L_WPM,  L_DATE_COMPLETED, L_EXERCISE,  L_ATTEMPT,L_SCORE_LVL);

          SELECT INTO (SELECT *
                       FROM KEYBOARD_LEARNING A
                       ORDER BY A.EXERCISE
                               ,TO_NUMBER(ATTEMPT))

                     -- DBMS_OUTPUT.PUT_LINE(RESULTS);

EXCEPTION
          /* */            
          WHEN L_PREVENT_NULL_INPUT THEN
                        NULL;

          /*this exception catches all other exceptions*/
          WHEN OTHERS THEN
                        W('ERROR: ' || SQLERRM);

END;
4

1 に答える 1

4

まず、機能する可能性のある最も単純なものを実装しましょう

CREATE OR REPLACE PROCEDURE INSERT_WPM_SCORE
(
          P_EMPLID VARCHAR2
         ,P_WPM NUMBER
         ,P_DATE_COMPLETED DATE DEFAULT SYSDATE
         ,P_EXERCISE VARCHAR2
         ,P_ATTEMPT VARCHAR2
         ,P_SCORE_LVL VARCHAR2
) AS
BEGIN
  INSERT INTO keyboard_learning (emplid, wpm, date_completed,exercise,attempt,score_lvl) 
    VALUES( p_emplid, p_wpm, p_date_completed, p_exercise, p_attempt, p_score_lvl );
END;

これが機能すると仮定すると、手順に機能を追加する作業を行うことができます。残念ながら、どの追加機能を実装したいかは私には明らかではありません。

  • NULLたとえば、入力に基づいてスローおよび/またはキャッチしたいように見える例外がありますが、それが何を達成しようとしているのかわかりません。プロシージャへの入力を検証しようとしていますか? 実行して制約INSERTに違反したときにスローされる例外をキャッチしようとしていますか? NOT NULL他の何か?
  • 元の投稿のステートメントが何SELECTを意図しているのかわかりません。おそらくp_attempt、プロシージャに渡された をオーバーライドしようとしていますか?

さらに、原則として、処理できない例外をキャッチすることは間違いであり、aWHEN OTHERSが続かないことRAISEはほとんどの場合間違いです。例外をキャッチしてSQLERRMtoを書き込むDBMS_OUTPUTと、例外が提供する有用なスタック トレース情報がすべて失われ、エラーを生成したコードの行番号が失われ、実際にDBMS_OUTPUTバッファを有効にするためにクライアント アプリケーションに依存することになります。そしてそれから読み取る (ほとんどのクライアント アプリケーションはそうではありません) ため、プロシージャの呼び出し元が呼び出しが失敗したと判断するのを妨げています。例外ハンドラーを完全に排除することで、より良いサービスを提供できます。

于 2012-08-07T22:20:37.200 に答える