2012-05-20 66 views
0

我使用PL/SQL,我想檢查是否在一個表中存在記錄是否存在包含給定詞的記錄,我已經使用,或如果不存在的時候試過,但我以異常結束。如何檢查是否在表

Select name from nameTable where name = nameFromArgument; 

當程序開始,我把一個錯誤的名字,這是不是在我得到一個錯誤的數據庫,甚至不能處理它

我已經試過這樣的事情:

PL/SQL check if query returns empty

編輯:

對不起,選擇我已經把之前只是一個例子,整個代碼[對不起的變量名...]我在這兒:

CREATE OR REPLACE 
PROCEDURE SELLSTOCKS 
(IloscAkcji IN NUMBER 
, NazwaAkcji IN VARCHAR2 
, IdRachunkuMaklerskiego IN NUMBER 
) AS 
Bledna_ilosc EXCEPTION; 
Bledna_nazwa EXCEPTION; 
amount NUMBER; 
stocksCash number; 
idRachunku number; 
stocksOnDealerSide number; 
temp number; 
tempus akcje_uzytkownika.nazwa % type; 
BEGIN 

--Select nazwa into tempus from akcje_uzytkownika where nazwa = nazwaakcji; 
--dbms_output.put_line(tempus); 

    dbms_output.put_line('pre'); 
select nazwa into tempus from akcje_uzytkownika where nazwa = nazwaakcji; 
dbms_output.put_line('pre2'); 
if tempus!=null then 
    if (iloscakcji> amount) THEN 
    raise Bledna_ilosc; 
    else 
    select ilosc, cena_sztuki into amount, stockscash from akcje_uzytkownika where nazwa= NazwaAkcji and id_rachunku_maklerskiego= IdRachunkuMaklerskiego; 
dbms_output.put_line(amount); 
dbms_output.put_line(stockscash); 
    amount :=amount - iloscakcji; 
    dbms_output.put_line(amount); 
    update akcje_uzytkownika set ilosc= amount where nazwa=NazwaAkcji and id_rachunku_maklerskiego= idrachunkumaklerskiego; 
    stockscash:= iloscAkcji * stocksCash; 
    dbms_output.put_line(stockscash); 
    select id_rachunku into idrachunku from rachunek_maklerski where id_rachunku_maklerskiego= idrachunkumaklerskiego; 
    temp:=SALDOUPDATE(stockscash, idrachunku); 
    select ilosc into stocksOnDealerSide from akcje where nazwa = nazwaAkcji; 
    stocksOnDealerSide := stocksondealerside+ iloscakcji; 
    dbms_output.put_line(stocksOnDealerSide); 
    update akcje set ilosc = stocksondealerside where nazwa = nazwaAkcji; 
    end if; 
    else 
    dbms_output.put_line('post'); 
    end if; 
EXCEPTION 

    when Bledna_ilosc then 
    dbms_output.put_line('Bledna ilosc'); 
    when Bledna_nazwa then 
    dbms_output.put_line('Bledna nazwa'); 

END SELLSTOCKS; 

我使用的Oracle SQL Developer 1.5.5

BEGIN 

--Select nazwa into tempus from akcje_uzytkownika where nazwa = nazwaakcji; 
--dbms_output.put_line(tempus); 

    dbms_output.put_line('pre'); 
    select nazwa into tempus from akcje_uzytkownika where nazwa = nazwaakcji; 
    dbms_output.put_line('pre2'); 
    exception when no_data_found then 
    raise no_data_found; 

-- is this the right place? 

    select ilosc, cena_sztuki into amount, stockscash from akcje_uzytkownika where nazwa= NazwaAkcji and id_rachunku_maklerskiego= IdRachunkuMaklerskiego; 
    dbms_output.put_line(amount); 
    dbms_output.put_line(stockscash); 
    amount :=amount - iloscakcji; 
    dbms_output.put_line(amount); 
    if (iloscakcji> amount) THEN 
    raise Bledna_ilosc; 
    else 
    update akcje_uzytkownika set ilosc= amount where nazwa=NazwaAkcji and id_rachunku_maklerskiego= idrachunkumaklerskiego; 
    stockscash:= iloscAkcji * stocksCash; 
    dbms_output.put_line(stockscash); 
    select id_rachunku into idrachunku from rachunek_maklerski where id_rachunku_maklerskiego= idrachunkumaklerskiego; 
    temp:=SALDOUPDATE(stockscash, idrachunku); 

........

+0

你可以發佈您的實際代碼爲你的'select'似乎什麼是失蹤的'into'條款。你還可以發佈你使用的Oracle的錯誤和版本嗎? – Ben

回答

3

您必須是錯的四個主要的東西(我可以看到)。

首先,tempus!=null從來沒有工作。由於null是缺少信息,所以在檢查空值時不能使用(in)相等運算符。不存在!=不存在。正確的語法是使用is null,或者在您的情況下使用tempus is not null

其次,if (iloscakcji> amount) THEN永遠不會計算爲真,因爲您沒有初始化值amount。一個數字不能大於null,因爲它不存在。您必須初始化變量amount。也許你的意思是下一個選擇語句要高於此?

第三,所有的select ... into ...陳述是進入單變量 - 不是用戶定義的表類型。這意味着如果您的查詢返回0行,將會引發一個no_data_found異常。如果多於一個行被返回,則會引發too_many_rows異常。

如果你只在最一行期待,那麼你就不需要太擔心too_many_rows。如果可能的話,這應該通過表上的唯一約束來實施。例如,我認爲nazwaakcje_uzytkownika上應該是唯一的。

no_data_found略有不同,我希望你的意思是tempus != null。假設amount已被初始化爲這個可以重新寫成值:

begin 

    -- do some stuff  
    begin 

     select nazwa into tempus from akcje_uzytkownika where nazwa = nazwaakcji; 

    -- If there-s no data catch the exception. 
    exception when no_data_found then 
     if (iloscakcji > amount) then 
      raise Bledna_ilosc; 
     end if; 

    end;   
    -- do some more stuff 

end; 

最後,這是不是一個真正的錯誤,但,你的代碼是相當不可讀。我會考慮使用更多的空白,以便您可以看到發生了什麼。

P.S.我認爲Oracle版本的意思是11gr2或10g等,但在這種情況下它沒有任何區別。

+0

哇,非常感謝你的支持,你提供了我,大量的東西:),但我仍然遭受更多的問題,我敢肯定,它只是語法的事情。 – iie

+1

@iie,因爲你在代碼中添加了異常。您必須嵌套PL/SQL塊才能在正確的位置獲得異常處理。我會稍微更新我的答案。 – Ben

+0

好的好,抱歉不要打擾,我已經把它整理出來了;再次感謝你,與更好的人共處一個美好的地方;) – iie