Oracle
 sql >> база данни >  >> RDS >> Oracle

Възможно ли е да се използва sql%rowcount за SELECT?

Да, можете да използвате SQL%ROWCOUNT . Валиден е в PL/SQL.

В PL/SQL обаче резултатът от вашата заявка трябва да отиде някъде, напр. в PL/SQL таблица. PL/SQL никога няма да изпрати резултата до изход (терминал, прозорец и др.). Така че SELECT * FROM няма да работи.

Вашият код може да изглежда така:

DECLARE
  TYPE emp_t ...;
  emp_tab emp_t;

BEGIN
  SELECT *
  BULK COLLECT INTO emp_tab
  FROM emp
  WHERE empname = 'Justin' AND dept='IT';

  IF sql%rowcount > 0 THEN
    .. do something ...
  END IF;
END;
/

Актуализация :

Актуализираните въпроси предполагат, че търсите нещо друго.

Опция 1:Използвайте изключения

Ако има 0 реда или повече от 1 ред, тези случаи се обработват отделно (като грешки):

BEGIN
  select PORT_NUMBER,STATIC_IP into outport, outIP
  from TINST
  where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    outretvalue := -12;
    RETURN;

  WHEN TOO_MANY_ROWS THEN
    outretvalue := -13;
    RETURN;
END;

Вариант 2:Използвайте агрегирания

Използвайки агрегати, заявката винаги ще връща точно един ред. Ако сега редът източник съответства на клаузата WHERE, тогава и двете резултатни стойности ще бъдат NULL. Ако клаузата WHERE съответства на повече от един ред, ще бъде взет максимумът.

Имайте предвид, че тази заявка може да върне номер на порт и IP адрес, които първоначално не са били на един и същи ред.

select MAX(PORT_NUMBER), MAX(STATIC_IP) into outport, outIP
from TINST
where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y';

IF outport IS NULL OR outIP IS NULL THEN
    outretvalue := -12;
    RETURN;
END IF;

Опция 3:Използвайте ROWNUM

Тази заявка връща най-много един ред. Ако нито един ред не съответства на клаузата WHERE, се хвърля изключение и трябва да бъде обработено:

BEGIN
  select PORT_NUMBER, STATIC_IP into outport, outIP
  from TINST
  where INST_ID = in_Hid AND IP_PORT_STATUS = 'Y'
  AND ROWNUM = 1;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    outretvalue := -12;
    RETURN;

END;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CX_Oracle - импортирайте данни от Oracle в рамка с данни на Pandas

  2. Entity Framework ORA-00932:непоследователни типове данни:„'очакван CLOB получи CHAR'

  3. Грешка:ORA-01704:низовият литерал е твърде дълъг

  4. Най-добрият начин за обработка на LOB в разпределени бази данни на Oracle

  5. Как можете да видите какво ниво на изолация на транзакция използва произволна сесия на оракул