1

Тема: оракл _ курсор

створити послідовний курсор, який показує скільки кожний американський магазин продав книг за останній рік

declare 
shop_name shops.name_shop%type;
country_name country.name_country%type;
shop_id shops.id_shop%type;
date_sale sales.date_of_sale%type;
cursor USA_shops is 
select sh.name_shop,c.name_country,s.quantity,s.date_of_sale
from SHOPS sh join COUNTRY c on (c.id_country=sh.id_country) join sales s on(sh.id_shop=s.id_shop)
and c.ID_COUNTRY=6 and DATE_OF_SALE BETWEEN DATE '07.07.2019' AND '07.07.2020';
begin
open USA_shops;
loop
exit when USA_shops%notfound;
dbms_output.put_line(NAME_SHOP||' '||NAME_COUNTRY||' '||QUANTITY||' '||DATE_OF_SALE);
end loop;
dbms_output.put_line('was found'||USA_shops%rowcount||'records');
close USA_shops;
end;

видає такі помилки після компіляції

ORA-06550: line 9, column 50:
PL/SQL: ORA-01861: literal does not match format string
ORA-06550: line 7, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

2

Re: оракл _ курсор

Здається, проблема в типі даних колонки date_of_sale - під час конкатенації її потрібно перетворити на стрічку.
Точніше можна сказати, маючи перед очима DDL кожної використаної таблиці, бажано також з прикладами даних.

3

Re: оракл _ курсор

DATE_OF_SALE BETWEEN DATE '07.07.2019' AND '07.07.2020';

Тут дату потрібно вказувати у форматі 2020-01-01.

4

Re: оракл _ курсор

поміняв формати дати і вже інші помилки

ORA-06550: line 14, column 22:
PLS-00201: identifier 'NAME_SHOP' must be declared
ORA-06550: line 14, column 1:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

5

Re: оракл _ курсор

Ви проіґнорували мою пропозицію викласти DDL таблиць... Що ж, спробую без них. Здається, в DBMS_output.put_line потрібно вказувати назву курсора перед колонкою, наприклад USA_shops.name_shop і т.д.

Подякували: sasha871

6

Re: оракл _ курсор

тепер працює

declare 
NAME_SHOP VARCHAR2(120);
NAME_COUNTRY VARCHAR(120);
QUANTITY NUMBER(38);
DATE_OF_SALE DATE;
cursor USA_shops is 
select sh.name_shop,c.name_country,s.quantity,to_char(s.date_of_sale)as sale_date
from SHOPS sh join COUNTRY c on (c.id_country=sh.id_country) join sales s on(sh.id_shop=s.id_shop)
where c.ID_COUNTRY=6 and s.DATE_OF_SALE BETWEEN '07.07.2019' AND '07.07.2020';
begin
open USA_shops; 
loop
fetch USA_shops into NAME_SHOP, NAME_COUNTRY, QUANTITY, DATE_OF_SALE;
exit when USA_shops%notfound;
dbms_output.put_line(NAME_SHOP||' '||NAME_COUNTRY||' '||QUANTITY||' '||DATE_OF_SALE);
end loop;
dbms_output.put_line('was found'||USA_shops%rowcount||'records');
close USA_shops;
end;
Подякували: frz1