ORA- 01403 Данные не найдены

dykee
Дата: 16.09.2015 21:38:48
Нужно при выборе людей с 20 отдела(таких людей 4) сделать надбавку к зарплате. Я пошарился по форума и понял что инто только для одного значения делает вывод. Как сделать так что б для 4х?? Покажите реализацию пожалуйста:)
CREATE OR REPLACE PROCEDURE lab3 IS
sum_sal NUMBER;
nadbavka NUMBER;
BEGIN
  SELECT SUM(t.sal) INTO sum_sal FROM emp t;
  SELECT sal+(0.2*7) INTO nadbavka FROM emp WHERE deptno=20;
  dbms_output.put_line(' Всего бабок зарплата в отделах:'||sum_sal);
  dbms_output.put_line(' Надбавка:'||nadbavka);
 
  END lab3;
ora601
Дата: 16.09.2015 21:47:16
dykee,

Для твоего случая реализация -

begin
exception when no_data_found
then ... 
end;


Для 4х -

SELECT ... INTO var1, var2, var3, var4 
dykee
Дата: 16.09.2015 22:04:33
Извините, а можно конкретней? Только начал писать на пл/скл.
CREATE OR REPLACE PROCEDURE lab3 IS
sum_sal NUMBER;
p1 float;
p2 float;
p3 float;
p4 float;
BEGIN

  SELECT SUM(t.sal) INTO sum_sal FROM emp t;
  SELECT sal+(0.2*7) into p1,p2,p3,p4 from scott.emp where deptno=20;

  dbms_output.put_line(' Всего бабок зарплата в отделах:'||sum_sal);
  dbms_output.put_line(' Надбавка:'||p1);

END lab3;

Если так пишу, то ошибка: 00913 много значений.
dykee
Дата: 16.09.2015 22:29:15
ora601,

Извините, а можно конкретней? Только начал писать на пл/скл.
CREATE OR REPLACE PROCEDURE lab3 IS
sum_sal NUMBER;
p1 float;
p2 float;
p3 float;
p4 float;
BEGIN

  SELECT SUM(t.sal) INTO sum_sal FROM emp t;
  SELECT sal+(0.2*7) into p1,p2,p3,p4 from scott.emp where deptno=20;

  dbms_output.put_line(' Всего бабок зарплата в отделах:'||sum_sal);
  dbms_output.put_line(' Надбавка:'||p1);

END lab3;


Если так пишу, то ошибка: 00913 много значений.
ora601
Дата: 16.09.2015 22:36:47
dykee,

тебе нужно захэндлить ексепшн no_data_found.

i.e. >
begin
<<your code there>>
exception 
when no_data_found then ...
end
dykee
Дата: 16.09.2015 22:46:48
ora601,
Блин я до конца вас не понимаю. это экзапшен ради игнорирование этой ошибки делаем на сколько я понимаю.... Можете пожалуйста уже написать что б оно заработало, честно говоря устал сидеть.
CREATE OR REPLACE PROCEDURE lab3 IS
sum_sal NUMBER;
p1 float;
p2 float;
p3 float;
p4 float;
BEGIN
  
  SELECT SUM(t.sal) INTO sum_sal FROM emp t;
  dbms_output.put_line(' Всего бабок зарплата в отделах:'||sum_sal);
  SELECT sal+(0.2*7) into p1,p2,p3,p4 from scott.emp where deptno=20;
  exception when no_data_found then  dbms_output.put_line(' Надбавка:'||p1,p2,p3,p4);


  
END lab3;
JDS
Дата: 16.09.2015 23:00:29
Тебе наверно к балк коллект инто надо
dykee
Дата: 16.09.2015 23:06:34
JDS,
Что??? Ты думаешь я понял что ты написал по русски не очень ясна такая терминология и что эта функция делает или запрос?
JDS
Дата: 16.09.2015 23:13:43
Ну ты странно пытаешься выбрать несколько строк в одну переменную панимаишь? )
Запрос сам говоришь, должен вернуть 4 записи, а ты эти 4 значения тычешь в одну переменную, ты и
ли циклом тогда перебирай, или в коллекцию с
елект делай через bulk collect into как бы)
Да и вообще конечная цель какая смотря, может и не надо ничего выбирать)
JDS
Дата: 16.09.2015 23:57:32
+
declare
  sum_sal number;
  type t_tab is table of scott.emp%rowtype;
  v_tab t_tab;
begin
  dbms_output.put_line('v1');
  select sum(nvl(sal, 0)) 
    into sum_sal
    from scott.emp;
  dbms_output.put_line('всего ' || to_char(sum_sal));
    
  for c in (select ename, sal + 0.2*7 as add_sal
              from scott.emp
             where deptno = 20)
  loop
     dbms_output.put_line('Надбавка для ' || c.ename || ' - ' || c.add_sal);
  end loop;
  
  dbms_output.put_line('v2');
  for c in (select 'всего ' || to_char(sum(nvl(sal,0))) as text from scott.emp
            union all
            select 'Надбавка для ' ||ename || ' ' || to_char(sal + 0.2*7) as add_sal
              from scott.emp
             where deptno = 20)
  loop
     dbms_output.put_line(c.text);
  end loop;
  
  dbms_output.put_line('v3');
  dbms_output.put_line('всего ' || to_char(sum_sal));  
  select *
    bulk collect into v_tab
    from scott.emp
   where deptno = 20;
  
  if v_tab.count>0 then 
    for i in v_tab.first..v_tab.last
    loop
       dbms_output.put_line('Надбавка для ' || v_tab(i).ename || ' - ' || to_char(v_tab(i).sal + 0.2*7));  
    end loop;
  end if;  
  
  dbms_output.put_line('');
  dbms_output.put_line('итд');      
end;