2014-05-19 221 views
1

我是oracle數據庫的新手,特別是存儲過程。創建Oracle數據庫存儲過程來創建用戶帳戶和/或檢查帳戶是否已存在

我的主要目標是在創建表中的用戶之前檢查並確保帳戶(用戶名或電子郵件)尚不存在。

我遇到的問題是:執行過程時,沒有任何內容插入到數據庫中。 如果有人可以檢查此代碼並確保它是正確的,將有助於很多。

 CREATE OR REPLACE PROCEDURE A2PROXYCREATEUSER (
     in_name IN VARCHAR2 
, in_password IN VARCHAR2 
, in_email IN VARCHAR2 
, in_subscript IN NUMBER DEFAULT 1 
, customaction IN VARCHAR2 
, userdata IN VARCHAR2 
, userdatalen IN NUMBER 
, returncode OUT NUMBER) 
     AS 
    CodeSuccess    constant number := 0; 
    CodeAlreadyExists  constant number := 1; 
    CodeInvalidUserName  constant number := 2; 
    CodeAccountCreationDisabled  constant number := 3; 
    CodeInvalidPassword  constant number := 4; 
    CodeKeyInUser constant number := 10; 
    CodeInvalidKey  constant number := 11; 
    current_name VARCHAR2(32); 
    current_email varchar2(12); 
    wonidseq number; 
    BEGIN 
    wonidseq := 0; 
    returncode := CodeSuccess; 

     SELECT NAME 
     INTO current_name 
     FROM WONUSER 
     WHERE NAME = in_name; 
    returncode := CodeAlreadyExists; 

     -- If the first SELECT statement above fails to return any 
     -- records at all, then the NO_DATA_FOUND exception will be 
     -- signalled. The following code reacts to this exception 
     EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      BEGIN 
      SELECT EMAIL 
       INTO current_email 
       FROM WONUSER 
       WHERE EMAIL = in_email; 
     returncode:=CodeAlreadyExists; 
EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      BEGIN 
SELECT UNIQUEID_SEQ.nextval into wonidseq from WONUSER; 
       INSERT INTO WONUSER(WONUSERSEQ, NAME, PASSWORD, NEWPASSWORD, EMAIL, TRUSTLEVEL, COMMUNITYSEQ, ISBANNED, ISACTIVE) 
       VALUES(wonidseq, in_name, in_password, NULL, in_email, 120, 0, 0, 1); 
returncode := CodeSuccess; 
     end; 


      END; 
    if returncode = CodeSuccess then 
     commit; 
    else 
     rollback; 
    end if; 
     END; 

編輯:

我設法修復代碼(可能看起來像一個黑客的人誰知道語法井)

create or replace 
PROCEDURE A2PROXYCREATEUSER (
     in_name IN VARCHAR2 
, in_password IN VARCHAR2 
, in_email IN VARCHAR2 
, in_subscript IN NUMBER DEFAULT 1 
, customaction IN VARCHAR2 
, userdata IN VARCHAR2 
, userdatalen IN NUMBER 
, returncode OUT NUMBER) 
     AS 
    CodeSuccess    constant number := 0; 
    CodeAlreadyExists  constant number := 1; 
    CodeInvalidUserName  constant number := 2; 
    CodeInvalidEmail  constant number := 7; 

    CodeAccountCreationDisabled  constant number := 3; 

    current_name VARCHAR2(32); 
    current_email varchar2(12); 
    wonidseq number; 
    BEGIN 

SELECT LoginName into current_name from WONUSER WHERE loginname = in_name; 
returncode := CodeAlreadyExists; 
    exception 
     when NO_DATA_FOUND then 
      returncode := CodeSuccess; 
if returncode = CodeSuccess then 
    BEGIN 
SELECT EMAIL into current_email from WONUSER where EMAIL = in_email; 
returncode := CodeAlreadyExists; 
    exception 
     when NO_DATA_FOUND then 
      returncode := CodeSuccess; 
       INSERT INTO WONUSER (WONUSERSEQ, LOGINNAME, PASSWORD, NEWPASSWORD, EMAIL, TRUSTLEVEL, COMMUNITYSEQ, ISBANNED, ISACTIVE,birthdate) 
       VALUES(wonidseq, in_name, in_password, ' ', in_email, 120, 0, 0, 1, sysdate); 
     commit; 
    end; 
else 
rollback; 
end if; 
end; 
+0

那麼,你是否像一個調試器,像SQLDeveloper一樣? – OldProgrammer

回答

0

我的代碼將是這樣一個:

PROCEDURE A2PROXYCREATEUSER (...) AS 

    CodeSuccess    constant number := 0; 
    CodeAlreadyExists  constant number := 1; 
    CodeInvalidUserName  constant number := 2; 
    CodeInvalidEmail  constant number := 7; 
    CodeAccountCreationDisabled  constant number := 3; 


    CURSOR curWonUser IS 
    SELECT * 
    FROM WONUSER 
    WHERE EMAIL = in_email OR NAME = in_name; 
    WonUser curWonUser%ROWTYPE; 

BEGIN 

    OPEN curWonUser; 
    FETCH curWonUser INTO WonUser; 
    IF curWonUser%NOTFOUND THEN 
     INSERT INTO WONUSER(WONUSERSEQ, NAME, PASSWORD, NEWPASSWORD, EMAIL, TRUSTLEVEL, COMMUNITYSEQ, ISBANNED, ISACTIVE) 
      VALUES (UNIQUEID_SEQ.NEXTVAL, in_name, in_password, NULL, in_email, 120, 0, 0, 1); 
     returncode = CodeSuccess; 
     COMMIT; 
    ELSE 
     returncode = CodeAlreadyExists; 
    END IF; 
    CLOSE curWonUser; 

end; 

請注意,您沒有使用任何其他返回碼。

+0

這看起來比我做的更簡單! 我對於光標是什麼感到困惑?我一直在oracledb網站上看到它,但havnt發現它實際上是什麼 – user3654535

+0

看看這篇文章,它給你一個很好的概述:[Oracle Magazine:Working with Cursors](http://www.oracle.com /technetwork/issue-archive/2013/13-mar/o23plsql-1906474.html) –

相關問題