【问题标题】:How to get the number of rows in ROWTYPE variable如何获取 ROWTYPE 变量中的行数
【发布时间】:2018-12-10 22:33:46
【问题描述】:

我有两个表 Table1 和 dTable2 具有相同的列。我需要检查一个特定的 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_result 的行数?

对于游标,我可以使用 ROWCOUNT 但 v_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

我做错了什么?

【问题讨论】:

  • 这样的变量只能存储一行。
  • 那么如果没有抛出异常,我如何才能确定是否没有返回任何内容?
  • 请检查我的答案,如果它对你有用,请接受/投票,这样它也可以帮助其他人寻求答案。请阅读:stackoverflow.com/help/someone-answers

标签: oracle plsql


【解决方案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
     ..
     ..

【讨论】:

  • 如果我使用我的原始代码,我怎么知道返回的行是空的?
  • @CodingDuchess :这就是这个答案的意义所在。哪一部分你没看懂? if v_result1.count = 0 then 就是这样做的
  • 我不打算更改原始查询。在那种情况下 v_result.count 给了我一个错误
  • @CodingDuchess :原始查询中没有任何更改,只是您不能在记录变量中存储多行,因此我使用集合来存储使用 @987654330 加载的数据@ .你的意思是你根本不能改变代码?那么我们能帮到你的就很少了。
猜你喜欢
  • 2012-06-26
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2017-08-15
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多