If statement pl sql如何减少我的代码

If statement pl sql如何减少我的代码,if-statement,plsql,sql-update,procedure,If Statement,Plsql,Sql Update,Procedure,有人能帮我减少代码吗?(如果您能注意到这两个If-elsif语句,我会进行相同的选择。因此我希望有一种方法可以进行一次选择。并根据pilot\u操作使用1或0进行更新)。 下面是我的代码 create or replace PROCEDURE F_16 (TRK_ID NUMBER, pilot_action NUMBER) IS BEGIN BEGIN IF pilot_action=0 THEN UPDATE "ControlTow"

有人能帮我减少代码吗?(如果您能注意到这两个If-elsif语句,我会进行相同的选择。因此我希望有一种方法可以进行一次选择。并根据pilot\u操作使用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;

提前谢谢。

由于您似乎要将
试点行动
分配给
意向
,我将执行以下操作:

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
条件以在
中使用
,并简化
where
子句(假设
Id
确实是选择要更新的行的唯一条件)。

既然您似乎要将
引导动作
分配给
意图
,我将执行以下操作:

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
条件以在
中使用
,并简化
where
子句(假设
Id
确实是选择要更新的行的唯一条件)。

既然您似乎要将
引导动作
分配给
意图
,我将执行以下操作:

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
条件以在
中使用
,并简化
where
子句(假设
Id
确实是选择要更新的行的唯一条件)。

既然您似乎要将
引导动作
分配给
意图
,我将执行以下操作:

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
条件以在
中使用
,并简化
where
子句(假设
Id
确实是选择要更新的行的唯一条件)。

您的代码有几个问题,我已经在下面的评论中解决了。请注意,没有讨论事务管理,因为不清楚何时应该进行
提交
/
回滚

-- #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 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 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 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;


此问题属于堆栈交换网络中的另一个站点:此问题属于堆栈交换网络中的另一个站点:此问题属于堆栈交换网络中的另一个站点:此问题属于堆栈交换网络中的另一个站点:感谢您的关注,我的朋友,但@Guillems解决方案正在运行,我我会同意的。:)@TakisMakis欢迎您编写您喜欢的低级代码;)然而,其他读者应该注意到,被接受的答案可能不是“最正确的”(有一些“正确”的定义)答案。。我会记在心里的。。但为了记录在案,吉勒姆说“设定”意图=飞行员行动“解决了我的问题”。仅此而已。您的答案也有效,但如果sql%rowcount=0,则dbms_输出有问题。put_行(“假警报”)@用户272735,+1,关于
where
条件(除非在子选项中有更多OP未包含在问题中的条件)和
in
条件(我回答时咖啡太少…),您都是对的。至于检查受影响的行,这可能有趣,也可能不有趣,这取决于OP需要什么。谢谢您的关心,我的朋友,但是@Guillems解决方案正在工作,我将继续。:)@TakisMakis欢迎您编写您喜欢的低级代码;)然而,其他读者应该注意到,被接受的答案可能不是“最正确的”(有一些“正确”的定义)答案。。我会记在心里的。。但为了记录在案,吉勒姆说“设定”意图=飞行员行动“解决了我的问题”。仅此而已。您的答案也有效,但如果sql%rowcount=0,则dbms_输出有问题。put_行(“假警报”)@用户272735,+1,关于
where
条件(除非在子选项中有更多OP未包含在问题中的条件)和
in
条件(我回答时咖啡太少…),您都是对的。至于检查受影响的行,这可能有趣,也可能不有趣,这取决于OP需要什么。谢谢您的关心,我的朋友,但是@Guillems解决方案正在工作,我将继续。:)@TakisMakis欢迎您编写您喜欢的低级代码;)然而,其他读者应该注意到,被接受的答案可能不是“最正确的”(有一些“正确”的定义)答案。。我会记在心里的。。但为了记录在案,吉勒姆说“设定”意图=飞行员行动“解决了我的问题”。仅此而已。您的答案也有效,但如果sql%rowcount=0,则dbms_输出有问题。put_行(“假警报”)@用户272735,+1,关于
where
条件(除非在子选项中有更多OP未包含在问题中的条件)和
in
条件(我回答时咖啡太少…),您都是对的。至于检查受影响的行,这可能有趣,也可能不有趣,这取决于OP需要什么