pl sql如何减少我的代码

时间:2015-02-20 09:31:54

标签: if-statement plsql sql-update procedure

任何人都可以帮我减少代码吗? (如果你能注意到两个if-elsif语句,我会选择相同的..所以我希望有一种方法可以使这个选择一次。并根据pilot_action以1或0更新)。 在我的代码下面。

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;

提前谢谢你。

2 个答案:

答案 0 :(得分:2)

您的代码有几个我在下面的评论中提到过的问题。请注意,交易管理不会被讨论,因为基于commit / 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;

答案 1 :(得分: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;

编辑:正如@ user272735所说,代码还有进一步改进的空间。特别是重写if条件以使用in并简化where子句(假设Id实际上是选择要更新的行的唯一条件)。