Процедуры PL / SQL той же строки - PullRequest
0 голосов
/ 12 августа 2011

Таблица до решения:

       ID NAME             DATA</p>

<hr>

<pre><code>     1 zhang               9
     1 zhang              12
     2 wang                1
     2 wang                2
</code>

/ это таблица до решения /

Таблица после решения:

    ID NAME             DATA

     1 DIY                13
     2 DIY                 3

/ вот что я хочу получить / Есть процедура:

update A a 
set a.date=(select  max(f_get(f.id,f.date,g.date))
           from A f,A g 
            where f.date!=g.date 
            and f.id=a.id);


--function f_get()
create or replace function f_get
      (id in varchar2,date in varchar,date2 in varchar ) 
    return varchar is
  Result varchar     
      date3 varchar(4);

begin

      select nvl(date,date2) into date3 
      from dual;

      Result:=date3;

    delete  from A a 
    where a.ID=id  
    and a.date=date2;--there is error 

  return(Result);
end  f_get;

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Ваш вопрос старается изо всех сил, чтобы скрыть себя, но в этом суть:

"- есть ошибка"

Ошибка, которую вы получаете (предположительно) ORA-14551: cannot perform a DML operation inside a query, которую вы получаете, потому что вы вызываете FUNCTION, которая включает команду DELETE из оператора SELECT.

Транзакционная модель Oracle не позволяет запросам изменять состояние базы данных. Вместо FUNCTION вам нужно написать процедуру.

Хотя, если вы хотите удалить повторяющиеся строки, достаточно простого решения SQL. Что-то вроде

delete from a
where (id, date) not in 
    ( select id, max(date) from a
      group by id)
/ 
1 голос
/ 12 августа 2011

Вы действительно должны обратить внимание, как писать вопросы. Это поможет нам помочь вам. Это мое предположение, что вы ищете. К сожалению, у меня нет 9i, но надеюсь, что это поможет!

create table so7t (
  id number,
  name varchar2(10),
  data number -- date is a reserved word and can't be used as identifier
);

-- 1001
insert into so7t values (1, 'zhang', 9);
-- 1100
insert into so7t values (1, 'zhang', 12);
-- 0001
insert into so7t values (2, 'wang', 1);
-- 0010
insert into so7t values (2, 'wang', 2);

select * from so7t;

/* from http://www.dbsnaps.com/oracle/bitwise-operators-in-oracle/ */
create or replace function bitor (x number, y number)
return number
is
begin
  return (x+y)-bitand(x,y);
end;
/
show errors

create or replace procedure solve (
  p_id in number
) as
  type ids_t is table of number;
  v_ids ids_t;
  v_result number := 0;
begin
  select data bulk collect into v_ids from so7t where id = p_id;

  for i in v_ids.first .. v_ids.last loop
    v_result := bitor(v_result, v_ids(i));
  end loop;

  delete from so7t where id = p_id;

  insert into so7t values (p_id, 'DIY', v_result);
end;
/

begin
  solve(1);
  commit;

  solve(2);
  commit;
end;
/

Таблица до solve:

        ID NAME             DATA
---------- ---------- ----------
         1 zhang               9
         1 zhang              12
         2 wang                1
         2 wang                2

Таблица после solve:

        ID NAME             DATA
---------- ---------- ----------
         1 DIY                13
         2 DIY                 3
...