2011-10-13 29 views
4

我已經瀏覽了很多網上的教程,並且我看到了很多類似的問題,因爲他們使用不同的SQL實現,所以不回答我的問題。我正在使用SQLPlus,oracle 10g。這個簡單的(Oracle)SQL存儲過程代碼有什麼問題?

CREATE OR REPLACE PROCEDURE getuserid 
(uname in varchar) AS 
BEGIN 
select accountId from "ValidClients" 
where username = uname 
END getuserid; 

代碼'SELECT clientId from「ValidClients」WHERE username ='testname'; '正常工作,所以我不明白我做錯了什麼使SQLPlus給我一個編譯錯誤。

編輯:沒有INTO子句是答案,謝謝大家幫助。一方面可以解決問題,我可以問一下確認:一個ja​​va程序將調用這些存儲過程並嘗試將它們存儲在結果集中。以下代碼是否可以爲上述存儲過程正常工作?

CallableStatement cs = connection.prepareCall("{call getuserid(?)}"); 
cs.setString(1, user); 
ResultSet rs = cs.executeQuery(); 

int userid = Integer.parseInt(rs.getString(1)); 

編輯2:忽略了上述內容,它爲後代保留。它不僅足以應對自己的問題,而且可以通過Google搜索輕鬆解決問題,而且不需要定製答案。

+0

你說得對,我想我一直都很粗魯,沒有這樣做。糾正。 – buggritall

回答

3

你在哪裏把查詢的結果?假設帳戶ID是一個數字,您可以嘗試:

CREATE OR REPLACE PROCEDURE getuserid 
(uname_p in varchar, accountId_p out NUMBER) AS 
BEGIN 
select accountId into accountId_p from "ValidClients" 
where username = uname_p; 
END getuserid; 

問候

+0

這裏的每個人都回答了我,這是一個很大的幫助。顯然,我的講師和導師都忽略了INTO條款的重要性。 – buggritall

+0

請注意,這是PL * SQL語法,不是純粹的SQL語法,所以根據您的導師和講師的講話內容,他們可能是對的。 SQL * Plus管理PL * SQL和SQL。 – BigMike

+2

如果你要返回一個結果而不是OUT參數,我仍然傾向於使它成爲一個函數。另外,您應該爲NO_DATA_FOUND異常添加至少一個異常句柄。我會質疑你的導師和講師,因爲INTO子句是PL/SQL中聲明的基礎。 – Ollie

1

加分號到選擇的結尾,你需要select into可變

e.g:

CREATE OR REPLACE PROCEDURE getuserid (uname in varchar) AS 
    v_account Number; 
BEGIN 
    SELECT accountId INTO v_account 
    FROM "ValidClients" 
    WHERE username = uname; 
END getuserid; 
1

它應該是:

CREATE OR REPLACE 
PROCEDURE getuserid (
    uname in varchar2 
) 
AS 
    v_account_id ValidClients.account_id%TYPE; 
BEGIN 
    select accountId 
    into v_account_id 
    from "ValidClients" 
    where username = uname; 
END getuserid; 

你可能要考慮你會與你一同回值做什麼。 要麼建立一個OUT參數或更好,如果你返回一個值使它成爲一個函數。

CREATE OR REPLACE 
FUNCTION getuserid (
    uname in varchar2 
) 
RETURN ValidClients.account_id%TYPE 
AS 
    v_account_id ValidClients.account_id%TYPE; 
BEGIN 
    select accountId 
    into v_account_id 
    from "ValidClients" 
    where username = uname; 

    RETURN v_account_id; 
EXCEPTION 
    WHEN no_data_found 
    THEN 
     -- Handle account ID not being present 
    WHEN others 
    THEN 
     -- Handle other errors. 
END getuserid; 
相關問題