【问题标题】:How to check if record containing given word exists in table如何检查表中是否存在包含给定单词的记录
【发布时间】:2012-05-20 09:11:21
【问题描述】:

我正在使用 PL/SQL,我想检查表中是否存在记录,我尝试使用 when exists 或 if not exists,但最终出现异常。

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);

........

【问题讨论】:

  • 您能否将您的实际代码发布为select 似乎缺少into 子句。您能否也发布您正在使用的 Oracle 的错误和版本。

标签: oracle plsql


【解决方案1】:

您有四个主要问题(我可以看到)。

首先,tempus!=null永远工作。由于 null 是缺少信息,因此您在检查 null 时不能使用(不)等式运算符。不存在!=不存在。正确的语法是使用is null,或者在你的情况下使用tempus is not null

其次,if ( iloscakcji> amount) THEN 永远不会评估为 true,因为您没有初始化值 amount。数字不能大于null,因为它不存在。您必须初始化变量amount。也许您的意思是下一个 select 语句在此之上?

第三,您所有的 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;

最后,这并不是一个真正的错误,但是您的代码相当不可读。我会考虑使用更多的空格,以便您可以看到发生了什么。

附: Oracle 版本是指 11gr2 或 10g 等,但在这种情况下没有任何区别。

【讨论】:

  • 哇,非常感谢您为我提供的支持,非常重要:),但我仍然遇到更多问题,我很确定这只是语法问题。
  • @iie,从您的更新来看,这是因为您在代码中间添加了异常。您必须嵌套 PL/SQL 块才能在正确的位置处理异常。我会稍微更新我的答案。
  • 好吧好吧,对不起,我已经解决了;再次感谢你,有更好的人的好地方;)
猜你喜欢
  • 2014-01-15
  • 2014-01-09
  • 2018-04-21
  • 2017-11-10
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
相关资源
最近更新 更多