如何获取ROWTYPE变量中的行数

时间:2018-12-10 22:33:47

标签: oracle plsql

我有两个表Table1和dTable2,它们具有相同的列。我需要检查特定的ID是否在其中之一中,并从任何一个表返回数据行。 我有以下PL / SQL代码:

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;

问题在于不会引发异常,因此v_result不返回任何数据。如何检查v_result的行数?

对于游标,我可以使用ROWCOUNT,但v_result不是游标。

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

我将代码更改为:

component 'count' must be declared

出现错误k

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

在记录变量中只能使用一行。如果要存储和计数多行,则可以定义一组记录,并使用BULK COLLECT INTO一次加载所有记录,而不会引发NO_DATA_FOUNDcount函数可用于集合。

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
     ..
     ..