Oracle 如何获取ROWTYPE变量中的行数

Oracle 如何获取ROWTYPE变量中的行数,oracle,plsql,Oracle,Plsql,我有两个表Table1和DTTable2,它们有相同的列。我需要检查其中一个表中是否有特定的id,并从哪个表返回数据行。 我有以下PL/SQL代码: v_result Table1%ROWTYPE; BEGIN SELECT a.* INTO v_result FROM Table1 a WHERE a.id = 123; EXCEPTION WHEN NO_DATA_FOUND THEN -- when reco

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

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_result不会返回任何数据。如何检查v_结果中的行数

对于游标,我可以使用ROWCOUNT,但v_结果不是游标

我还尝试使用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;
并得到一个错误
必须声明组件“count”


我做错了什么?

记录变量中只能使用一行。如果要存储和计数多行,可以定义一个记录集合,并使用
批量收集到
一次加载所有记录,而不会引发
未找到数据
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;
  /
输出为

如果您的目的是简单地检查一行是否存在,那么更简单有效的方法是使用
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
     ..
     ..

您只能存储一行这样的变量。那么,如果没有引发异常,我如何确定是否不会返回任何内容?请检查我的答案,如果它对您有效,请接受/投票,这样也会帮助其他人寻找答案。请阅读:如果我使用我的原始代码,我怎么才能知道返回的那一行是空的?@CodingDuchess:这就是这个答案。你不明白哪一部分
如果v_result1.count=0,那么
就是这样做的,我不打算更改原始查询。在这种情况下,v_result.count给了我一个error@CodingDuchess:原始查询中没有任何更改,只是无法在记录变量中存储多行,因此我使用了一个集合来使用
批量收集
存储加载的数据。你的意思是你根本不能更改代码吗?那我们帮不了你什么忙。
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
     ..
     ..