实现和测试存储的PL / SQL过程

时间:2014-05-28 19:09:38

标签: sql plsql

我试图在APPLICANT表中插入一行,并在新申请人具有相同的所有属性值时生成警告,但申请人编号(a#)作为申请人已经记录在表APPLICANT中。通过存储过程INSAPP的输入参数传递属性的值。

这是我的代码:

CREATE OR REPLACE PROCEDURE INSAPP(

a_num       IN  NUMBER,
a_fname     IN  VARCHAR,
a_lname     IN  VARCHAR,
a_address   IN  VARCHAR,
a_city      IN  VARCHAR,
a_state     IN  VARCHAR,    
a_phone     IN  NUMBER, 
a_fax       IN  NUMBER, 
a_email     IN  VARCHAR,    
a_acomment  IN  LONG) IS

    app_row     APPLICANT%ROWTYPE;
    FAIL EXCEPTION;

BEGIN
--VERIFY APPLICANT FNAME
    SELECT *
    INTO app_row
    FROM APPLICANT
    WHERE fname = a_fname AND
    lname = a_lname AND
    address = a_address AND
    city = a_city AND
    state = a_state  AND
    phone# = a_phone AND
    fax# = a_fax AND
    email = a_email AND
    acomment = a_acomment;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('CREATING APPLICANT');
        BEGIN
            SELECT MAX(a#)+1
            INTO a_num
            FROM APPLICANT;
            INSERT INTO APPLICANT VALUES (a_num,a_fname,a_lname,a_address,a_city,a_state,a_phone,a_fax,a_email,a_acomment);
        COMMIT;
        DBMS_OUTPUT.PUT_LINE('APPLICANT HAS SUCCESSFULLY ADDED');
    EXCEPTION
        WHEN Fail THEN
            ROLLBACK;
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
            ROLLBACK;
    END;

END;
END INSAPP;
/

但是当我尝试使用此代码执行它时,它会给我一个像这样的错误消息

  • 警告:使用编译错误创建了Phedure。

然后我试图展示错误:   - 49/1 PLS-00103:遇到符号" END"

我是否对pl / sql代码有任何错误?请更正我,因为我还是pl / sql的新手。谢谢,非常感谢。 :)

1 个答案:

答案 0 :(得分:0)

如果你从sqlplus执行它,请尝试

EXEC INSAPP ( 000001, 'PETER', 'JONES', '7 STATION ST.', 'PERTH', 'WA', 645278453, NULL, NULL, 'Job expectations ? Money, money, money, ...' );

或将其包装在begin .. end

begin
    INSAPP ( 000001, 'PETER', 'JONES', '7 STATION ST.', 'PERTH', 'WA', 645278453, NULL, NULL, 'Job expectations ? Money, money, money, ...' );
end;
/

UPD。 我认为你的程序没有编译。

你不能改变输入参数a_num的值(顺便说一下,最好不要为表获取新的id,使用序列)

SELECT MAX(a#)+1
INTO a_num
FROM APPLICANT;

END;部分

中的rollback语句后您有when个必填项

由于比较空值总是返回false,因此按这种情况搜索记录是不好的

WHERE fname = a_fname AND
   lname = a_lname AND
   address = a_address AND
   city = a_city AND
   state = a_state  AND
   phone# = a_phone AND
   fax# = a_fax AND
   email = a_email AND
   acomment = a_acomment;