oracle триггер точной выборки возвращает больше, чем запрошенное количество строк - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь получить количество из таблицы транзакций. Попытайтесь получить количество продажи и количество покупки. Используйте Portfolio_Number, Stock_Code, Buy_Sell для проверки количества.

Transaction Table (Portfolio_Number, Transaction_Date, 
Stock_Code, Exchange_Code, Broker_Number, Buy_Sell, Quantity, Price_Per_Share)
create or replace trigger TR_Q5 
before Insert on 
Transaction 
for each row 
declare
V_quantityB number(7,0);
V_quantityS number(7,0);
begin 

if(:new.buy_sell ='S') then 

select quantity 
into V_quantityS
from transaction
where :new.portfolio_number = portfolio_number
and :new.stock_code = stock_code
and buy_sell='S'
;

if V_quantityS>=1 then

  Raise_Application_Error(-20020, 'not S');

 end if;
end if;

попытайтесь вставить

INSERT INTO Transaction 
(Portfolio_Number, Transaction_Date, Stock_Code, Exchange_Code, Broker_Number, Buy_Sell, Quantity, Price_Per_Share)
values
    (500, To_Date('09-Feb-2020 16:41:00', 'DD-Mon-YYYY HH24:MI:SS'), 'IBM', 'TSX', 4, 'S', 10000, 25.55 );

, но при этом появляется ошибка

точная выборка возвращает больше, чем запрошенное количество строк

1 Ответ

0 голосов
/ 27 февраля 2020

Указанная вами ошибка не требует пояснений. select вы написали должны вернуть только 1 строку, но она возвращает больше, чем это. Поскольку вы не можете поместить несколько строк в скалярную переменную number, вы получили ошибку.

Что бы это исправить? Например, агрегация:

select sum(quantity) 
  into V_quantityS
  ...

или, возможно,

select distinct quantity

или даже

select quantity
...
where rownum = 1

Однако будьте осторожны: триггер создан на transaction таблицы, и вы выбираете из нее одновременно, что приводит к изменяющейся таблице ошибка. Что с этим делать? Используйте составной триггер.

...