Эй, ребята, просто чтобы посмотреть, сможете ли вы, ребята, помочь мне решить эту проблему с процедурой, с которой я сталкиваюсь.Короче говоря, я создал новую таблицу с именем
Create Table ClientHistoricalPurchases(
ClientID varchar2(6) constraint clientidhistorical references Clients,
DistinctProducts number (9),
TotalProducts number(9),
TotalCost number (9,2),
Primary Key (ClientID));
И я хочу заполнить / обновить эту таблицу, запустив процедуру, которая в основном читает из следующей таблицы:
create table OrderDetails(
OrderID varchar2(6) CONSTRAINT orddetpk PRIMARY KEY,
ProductID varchar2(6) CONSTRAINT prdfk REFERENCES Products ,
UnitPrice number(10,2),
Quantity number(4),
Discount number(3),
ShippingDate date);
Я делаюпара объединений с еще двумя таблицами, называемыми Заказами и Клиентами, но это тривиальные объединения с использованием первичного ключа / FK.
Итак, цель этой процедуры состоит в том, что при запуске я хочу просмотреть детали заказа иЯ хочу рассчитать различное количество продуктов, купленных Клиентом, общее количество продуктов и общую сумму покупки, и я хочу обновить существующую запись новыми значениями, если она есть в новой таблице ClientHistoricalPurchases, если нет, я хочу добавить новую записьдля этого.Итак, это то, что я написал, но оно дает мне ошибки:
Create or Replace Procedure Update_ClientHistPurch as
Cursor C1 is
Select orderid, orders.clientid, productid, unitprice, quantity, discount
from orderdetails
Inner join orders on orderdetails.orderid = orders.clientid
for update of TotalCost;
PurchaseRow c1%RowType;
DistinctProducts orderdetails.quantity%type;
TotalProducts orderdetails.quantity%type;
ProposedNewBalance orderdetails.unitprice%type;
Begin
Begin
Begin
Begin
Open C1;
Fetch c1 into PurchaseRow;
While c1% Found Loop
Select count(distinct productid)
into DistinctProducts
from orderdetails
Inner join orders on orderdetails.orderid = orders.orderid
Inner join clients on orders.clientid = clients.clientid
where clients.clientid = purchaserow.clientid;
end;
Select count(ProductID)
into TotalProducts
from orderdetails
Inner join orders on orderdetails.orderid = orders.orderid
Inner join clients on orders.clientid = clients.clientid
where clients.clientid = purchaserow.clientid;
end;
Select sum((unitprice * quantity) - discount)
into ProposedNewBalance
from orderdetails
Inner join orders on orderdetails.orderid = orders.orderid
Inner join clients on orders.clientid = clients.clientid
where clients.clientid = purchaserow.clientid;
end;
If purchaserow.clientid not in ClientHistoricalpurchases.clientid then
insert into ClientHistoricalPurchases values (purchaserow.clientid,DistinctProducts, TotalProducts, ProposedNewBalance);
End if;
If purchaserow.clientid in ClientHistoricalPurchases.clientid then
Update Clienthistoricalpurchases
set clienthistoricalpurchases.distinctproducts = distinctproducts, clienthistoricalpurchases.totalproducts = totalproducts, clienthistoricalpurchases.totalcost = ProposedNewBalance
where purchaserow.clientid = clienthistoricalpurchases.clientid;
end if;
end loop;
end;
Ошибки следующие:
Ошибка (27,4): PLS-00103: обнаружен символ ";»когда ожидается одно из следующего: loop Символ «loop» был заменен на «;»продолжить.
Ошибка (33,7): PLS-00103: Обнаружен символ «ПРИСОЕДИНЯЙТЕСЬ» при ожидании одного из следующих действий:,;для группы, имеющей пересечение, минус порядок, начало объединения, где соединяются
Любая помощь приветствуется, ребята.Спасибо!