Оператор CASE для вставки, обновления или удаления - PullRequest
0 голосов
/ 02 июля 2018

У меня есть создание по хранимой процедуре. В этом сохраненном процессе я хочу выписать регистр для вставки, обновления или удаления.

If v_var='I' then insert into main_tbl
If v_var='D' then delete from main_tbl where  <condition>
If v_var='U' then update main_tbl set <condition>.

Итак, для этого я создал Stored Proc

create or replace procedure sp_cs as
    v_var txt.col1%type;
    type record is ref cursor return txt%rowtype;  --Staging table
    v_rc record;
    cursor c1 is select * from txt;
begin
    open c1;
    loop 
        fetch c1 into v_rc;
        for i in 1 .. v_rc.count
        loop
         select v_rc(i).col1 into v_var from txt;
            case when v_var ='I' then
                 insert into main_tbl values (v_rc(i).col1, .....);
            when v_var ='D' then
                 delete from main_tbl m where m.col2=v_rc(i).col2;
            when v_var ='U' then
                 update main_tbl m set m.col2=v_rc(i).col2;
            end case;
        end loop;
    end loop;
    close c1;
end;

После выполнения этого данные не могут быть загружены в main_tbl . Не могли бы вы помочь мне решить мою проблему. Спасибо

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Вам нужна ссылка здесь? Если нет, то попробуйте это

create or replace procedure sp_cs 
as
    cursor c1 is select * from txt;
    rc c1%rowtype;
begin
    For c in rc Loop
        case c.col1 
            When 'I' Then
                insert into main_tbl values (c.col1, .....);
            When 'U' Then
                update main_tbl m set m.col2=c.col2;
            When 'D'
                delete from main_tbl m where m.col2=c.col2;
        End Case;
    End Loop;
end;
0 голосов
/ 02 июля 2018

В процедуре создания есть несколько синтаксических ошибок, попробуйте следующее. Кроме того, взгляните на Oracle MERGE

MERGE сможет выполнять операции INSERT, UPDATE и DELETE в одном операторе.

CREATE OR REPLACE PROCEDURE sp_cs
IS
   v_var   txt.col1%TYPE;

   TYPE record IS REF CURSOR
      RETURN txt%ROWTYPE;                                      --Staging table

   v_rc    record;

   CURSOR c1
   IS
      SELECT * FROM txt;
BEGIN
   OPEN c1;

   LOOP
      FETCH c1 INTO v_rc;

      FOR i IN 1 .. v_rc.COUNT
      LOOP
         CASE
            WHEN v_var = 'I'
            THEN
               INSERT INTO main_tbl
                    VALUES (v_rc (i).col1);
            WHEN v_var = 'D'
            THEN
               DELETE FROM main_tbl m
                     WHERE m.col2 = v_rc.col2;
            WHEN v_var = 'U'
            THEN
               UPDATE main_tbl m
                  SET m.col2 = v_rc.col2;
         END CASE;
      END LOOP;
   END LOOP;

   CLOSE c1;
END;
0 голосов
/ 02 июля 2018

Ну, OPEN..FETCH..LOOP стал довольно старомодным. Вы должны просто использовать один оператор вставки / обновления / удаления, основанный на параметре. Он будет гораздо более эффективным, чем ваши циклические конструкции.

CREATE OR replace PROCEDURE sp_cs (p_var txt.col1%TYPE) 
IS 
BEGIN 
    CASE p_var 
      WHEN 'I' THEN 
        INSERT INTO main_tbl 
        SELECT * 
        FROM   txt; 
      WHEN 'D' THEN 
        DELETE FROM main_tbl m 
        WHERE  EXISTS (SELECT 1 
                       FROM   txt t 
                       WHERE  m.col2 = t.col2); 
      WHEN 'U' THEN 
        UPDATE main_tbl m 
        SET    m.col2 = (SELECT v_rc.col2 
                         FROM   txt 
                         WHERE  m.somecol = t.somecol); -- the column you want to compare while updating
    END CASE; 
END; 

/ 

Хотя из вашего запроса на обновление не ясно, чего вы пытаетесь достичь, я предполагаю, что у вас есть общий столбец в txt при обновлении col2 с main_tbl. Более того, я использовал ваш параметр в качестве аргумента процедуры p_var. Вы можете использовать его как локальную переменную, если не хотите передавать его.

0 голосов
/ 02 июля 2018

Вам нужно объявить вашу процедуру такой, какая она есть, поэтому вам не хватает одного ключевого слова в первой строке:

create or replace PROCEDURE sp_cs

Вам не хватает WHEN ключевых слов и END CASE.

 case when v_var = 'I'
      then insert into main_tbl values (v_rc(i).col1, .....);
      when v_var = 'D'
      then delete from main_tbl m where m.col2=v_rc.col2;
      when v_var = 'U'
      then update main_tbl m set m.col2=v_rc.col2;
 end case;
...