Как получить количество строк в переменной ROWTYPE - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть две таблицы Table1 и dTable2, которые имеют идентичные столбцы.Мне нужно проверить, есть ли конкретный идентификатор в одном из них и вернуть строку данных из любой таблицы.У меня есть следующий код 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

Что я делаю не так?

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете использовать только одну строку в переменной записи.Если вы хотите сохранить и сосчитать несколько строк, вы можете определить коллекцию записей и использовать 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;
  /

Вывод для Демо

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
     ..
     ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...