我正在使用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 :(得分:3)
你有四个主要的错误(我可以看到)。
首先,tempus!=null
永远不会工作。由于null是缺少信息,因此在检查空值时不能使用(in)相等运算符。不存在!=不存在。正确的语法是使用is null
,或者使用tempus is not null
。
其次,if ( iloscakcji> amount) THEN
永远不会评估为true,因为您没有初始化值amount
。数字不能大于null
,因为它不存在。您必须初始化变量amount
。也许你的意思是下一个选择语句高于此?
第三,所有select ... into ...
语句都是单变量 - 而不是用户定义的表类型。这意味着如果查询返回0行,则会引发no_data_found
异常。如果返回了多个行,则会引发too_many_rows
异常。
如果您只想要最多一行,那么您不必过于担心too_many_rows
。如果可能的话,这应该通过表上的唯一约束来强制执行。例如,我希望nazwa
上的akcje_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等,但在这种情况下没有任何区别。