如何比较 IF 语句中的两个变量?

Posted

技术标签:

【中文标题】如何比较 IF 语句中的两个变量?【英文标题】:How to compare two variables in IF statement? 【发布时间】:2020-06-25 12:52:28 【问题描述】:

我正在尝试执行以下查询。

我正在尝试使用 IF 语句进行此比较。我希望我的结果喜欢从 v_anwen2_id 中选择不在 v_anwen_id 中的值。所以当 v_anwen2_id 不等于 v_anwen_id 时执行插入语句。但我没有得到“ v_anwen2_id is not equal to v_anwen_id ”值。 (我希望它就像 a 不等于 b 然后执行 insert 语句。但它仍然插入 b 中的值)。 我不确定是我的 if 语句还是光标的问题。

 IF v_anwen2_id <> v_anwen_id

以下是我的查询。

SET serveroutput ON; 
DECLARE 
    v_client_id  NUMBER(38);
    v_roles_id      NUMBER(38);
    v_old_roles     NUMBER(38);
    v_rights_id     NUMBER(38);
    v_user1_id       NUMBER(38);
    v_anwen_id       NUMBER(38);
    v_anwen2_id   NUMBER(38);
    v_client1_id    NUMBER(38);
    v_abtei     NUMBER(38);
    

CURSOR c_abtei (var01 NUMBER) IS
     SELECT abteil,client_id FROM ty_join_anwen_abteil WHERE anwen = var01;
     
CURSOR c_anwen (var02 NUMBER) IS
     SELECT anwen FROM ty_join_anwen_abteil WHERE abteil = var02;
CURSOR c_roles (var03 NUMBER) IS
     SELECT roles FROM ty_join_rolesn_righte WHERE right = var03; 
     
CURSOR c_users (var04 NUMBER) IS
     SELECT anwen FROM ty_join_anwen_rolesn WHERE roles = var04;  
     
BEGIN 



    
 --  SELECT id INTO v_roles_id FROM ty_sd_roles WHERE description ='cod_Test';
    SELECT id INTO v_rights_id FROM ty_sd_berightigung WHERE description ='failure_note';
      
  --  INSERT INTO ty_join_rolesn_righte (role,right) 
--    VALUES  (v_roles_id,v_rights_id);
    
    SELECT ID INTO v_user1_id FROM ty_sd_person WHERE email = 'jens@gmail.com';         
    OPEN c_abteil(v_user1_id); 
      LOOP 
        FETCH c_abteil INTO v_abteil,v_client1_id;
        EXIT WHEN c_abteil%NOTFOUND;
        
          OPEN c_anwen(v_abteil); 
             LOOP 
                FETCH c_anwen INTO v_anwen_id; 
                EXIT WHEN c_anwen%NOTFOUND;
      --  INSERT INTO ty_join_anwen_rolesn (anwen,roles,client_id) VALUES (v_anwen_id,v_roles_id,v_client1_id);
     END LOOP; 
          CLOSE c_anwen;
      END LOOP; 
    CLOSE c_abteil;
    OPEN c_roles(v_rights_id);
      LOOP 
        FETCH c_roles INTO v_old_roles;
        EXIT WHEN c_roles%NOTFOUND;
        
          OPEN c_users(v_old_roles); 
             LOOP 
                FETCH c_users INTO v_anwen2_id; 
                EXIT WHEN c_users%NOTFOUND;
                IF v_anwen2_id <> v_anwen_id
                THEN
                dbms_output.put_line(v_anwen2_id);
             --   INSERT INTO ty_join_anwen_rolesn (anwen,roles,client_id) VALUES (v_anwen2_id,v_roles_id,v_client1_id);
                END IF;
             --   delete from ty_join_roles_right where roles = v_old_roles;
             END LOOP; 
          CLOSE c_users;
      END LOOP; 
    CLOSE c_roles;
            

END; 
/

【问题讨论】:

你在前面的循环中循环了多少次?在您评估IF 时,v_anwen_id 变量将具有嵌套c_abtei/c_anwen 循环中看到的最后一个值。您是否期望第二组嵌套循环忽略第一组中看到的所有 ID,而不仅仅是最后一个? (为什么要为此使用游标,或者根本使用 PL/SQL;您可以使用两个更简单的纯 SQL insert ... select 语句来做到这一点,不是吗?) 【参考方案1】:

尊重你的努力,我敢说打开这么多游标不是一个好的编码习惯。

您可以通过在一个 SQL 中连接所有表来实现此目的。尝试将尽可能多的逻辑整合到一两个 SQL 中。

供您参考的示例 SQL -

Select a.abteil, a.client_id, c.anwen
From ty_join_anwen_abteil a, ty_sd_person b, ty_join_anwen_abteil  c
Where a.anwen = b.id
And b.email = 'jens@gmail.com'
And c.abteil. = a.abteil; 

Select c.anwen 
From ty_join_rolesn_righte a, ty_sd_berightigung b, ty_join_anwen_rolesn c
Where b.description ='failure_note'
And a.right = b.id
And c.roles = a.id

【讨论】:

以上是关于如何比较 IF 语句中的两个变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 if 语句中显示/比较 mysql 行的动态值?

JAVA怎么用if语句 比较两个数的大小? 急!!谢谢!在线等

请教如何比较两个hash是不是相同

verilog中如何将wire类型的变量A 与reg类型的变量B进行比较?

如何比较两个for循环的值并在django模板中使用if语句?

编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。