代码之家  ›  专栏  ›  技术社区  ›  Coding Duchess

如何获取ROWTYPE变量中的行数

  •  2
  • Coding Duchess  · 技术社区  · 6 年前

    我有两个表Table1和dTable2具有相同的列。我需要检查其中一个表中是否有特定的id,并从哪个表返回数据行。

    v_result Table1%ROWTYPE; 
    BEGIN
    
         SELECT a.*
         INTO   v_result
         FROM   Table1 a
         WHERE  a.id    = 123;
    
    
      EXCEPTION
    
         WHEN NO_DATA_FOUND THEN  -- when record not found
    
            SELECT b.*
            INTO   v_result
            FROM   Table2 b
            WHERE  b.id    = 123;
    
      END;
    

    问题是没有抛出异常,因此v\u result不返回任何数据。如何检查v\u result的行数?

    我也试过使用count属性,但它出错了。

    v_result Table1%ROWTYPE; 
    BEGIN
    
         SELECT a.*
         INTO   v_result
         FROM   Table1 a
         WHERE  a.id    = 123;
    
         if v_result.count =0 then
            SELECT b.*
            INTO   v_result
            FROM   Table2 b
            WHERE  b.id    = 123;
         end if;
    
      EXCEPTION
    
         WHEN NO_DATA_FOUND THEN  -- when record not found
    
            SELECT b.*
            INTO   v_result
            FROM   Table2 b
            WHERE  b.id    = 123;
    
      END;
    

    然后出错了 component 'count' must be declared

    我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Kaushik Nayak    6 年前

    在记录变量中只能使用一行。如果要存储和计数多行,可以定义一个记录集合并使用 BULK COLLECT INTO 一次装上所有的东西就不会引起什么麻烦了 NO_DATA_FOUND . 这个 count

    DECLARE
    TYPE type_tab1 IS TABLE OF  Table1%ROWTYPE; 
    TYPE type_tab2 IS TABLE OF  Table2%ROWTYPE; 
    
    v_result1 type_tab1;
    v_result2 type_tab2;
    BEGIN
    
         SELECT a.*
           BULK COLLECT INTO  v_result1
         FROM   Table1 a
         WHERE  a.id = 123;
    
         if v_result1.count = 0 then
            SELECT b.* BULK COLLECT
              INTO   v_result2
            FROM   Table2 b
            WHERE  b.id    = 123;
         end if;
    
         DBMS_OUTPUT.PUT_LINE('v_result1 ='|| v_result1.count);
         DBMS_OUTPUT.PUT_LINE('v_result2 ='|| v_result2.count);
    
    
     END;
      /
    

    的输出 Demo

    v_result1 =0
    v_result2 =1
    

    如果您的目的是简单地检查一行是否存在,那么使用 EXISTS

    SELECT
         CASE WHEN 
              EXISTS (
                   SELECT 1
                     FROM table1
                   WHERE id = 123
              ) THEN 1
              ELSE 0 
          END
    INTO v_count
    FROM dual;
    
    IF v_count = 0
        THEN
         ..
         ..