程序创建所需的简单初学者Oracle PL / SQL帮助/修复

时间:2012-08-07 22:10:04

标签: sql oracle plsql oracle11g plsqldeveloper

我是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;

1 个答案:

答案 0 :(得分: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

此外,作为一般规则,捕获您无法处理的异常是错误的,WHEN OTHERS后面没有RAISE几乎总是错误的。如果您捕获异常并将SQLERRM写入DBMS_OUTPUT,则会丢失该异常提供的所有有用堆栈跟踪信息,您将丢失生成错误的代码段的行号,您是依赖于客户端应用程序来实际启用DBMS_OUTPUT缓冲区并从中读取(大多数客户端应用程序不会),并且您阻止过程的调用者确定调用失败。完全消除异常处理程序会更好。