我是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;
答案 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
缓冲区并从中读取(大多数客户端应用程序不会),并且您阻止过程的调用者确定调用失败。完全消除异常处理程序会更好。