2015-02-20 2 views
0

Может ли кто-нибудь помочь мне сделать мой код меньше? (Если вы можете заметить оба оператора if-elsif, я делаю то же самое Select .., поэтому я хотел бы, чтобы был способ сделать этот выбор один раз и обновить с помощью 1 или 0 в зависимости от pilot_action). Ниже моего кода.pl sql Как сделать мой код менее

create or replace 
PROCEDURE F_16 (TRK_ID NUMBER, pilot_action NUMBER) IS 
BEGIN 
    BEGIN 

    IF pilot_action=0 THEN 
      UPDATE "ControlTow" 
      SET "Intention"=0 
      WHERE "Id" IN (    
      SELECT "Id" FROM "ControlTow" WHERE "Id"=TRK_ID); 

    ELSIF pilot_action=1 THEN 
      UPDATE "ControlTow" 
      SET "Intention"=1   
      WHERE "Id" IN (
      SELECT "Id" FROM "ControlTow" WHERE "Id"=TRK_ID); 
     END IF; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN dbms_output.put_line('False Alarm'); 
    COMMIT; 
    END;  
END F_16; 

спасибо, заранее.

+0

Этот вопрос относится на другом сайте в сети Stack Exchange Server: https://codereview.stackexchange.com – user272735

ответ

1

Поскольку вы, кажется, назначая pilot_action к Intention, я хотел бы сделать следующее:

create or replace 
PROCEDURE F_16 (TRK_ID NUMBER, pilot_action NUMBER) IS 
BEGIN 
    BEGIN 

    IF pilot_action IN (0, 1) THEN 
     -- if the only condition in subselect is the ID then use it directly 
     UPDATE "ControlTow" 
      SET "Intention"= pilot_action 
     WHERE "Id"=TRK_ID; 
     -- if there are more conditions than just the ID then subselect may be the way to go 
     --(hard to say without more information) 
     -- WHERE "Id" IN (    
     -- SELECT "Id" FROM "ControlTow" WHERE "Id"=TRK_ID AND ...) 
    ELSE 
     Null; -- do whatever you need in this case. Raise exception? 
    END IF; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN dbms_output.put_line('False Alarm'); 
    COMMIT; 
    END;  
END F_16; 

EDIT: Как @ user272735 сказал, есть место для более усовершенствования на коде. В частности, переписать условие if на использование in и упростить предложение where (предположим, что Id действительно является единственным условием выбора строк для обновления).

+0

идеальный! ты босс .. спасибо, брат! –

2

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

-- #1 use of explicit parameter mode 
create or replace procedure f_16(p_trk_id in number, p_pilot_action in number) is 
begin 
    -- #2 use of in 
    if p_pilot_action in (0, 1) 
    then 
    -- #3 unnecessary subquery removed 
    update controltow 
     set intention = p_pilot_action 
    where id = p_trk_id; 

    -- #4 use pl/sql implicit cursor attribute to check the number of affected rows 
    if sql%rowcount = 0 
    then 
     dbms_output.put_line('false alarm'); 
    end if; 
    end if; 
end; 
+0

спасибо за беспокойство моего друга, но @Guillems решение работает, и я пойду с этим. :) –

+0

@TakisMakis Вы можете писать как уступающий код по своему усмотрению;) Однако другие читатели должны учитывать, что принятый ответ может быть не «самым правильным» (с некоторым определением «правильного») ответа. – user272735

+0

ОК .. У меня это будет на уме ... но для записи линия, где Guillem говорит «SET» Intention «= pilot_action», решает мою проблему. Это все. –

Смежные вопросы