1

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

Створіть курсор, який містить список тематик і інформацію про те, скільки авторів пишуть в кожному окремому жанрі. Збережіть значення полів в змінних. За допомогою курсору і пов'язаних змінних виконайте наступні
дії:
■ виведіть в циклі всі дані курсора;

declare 
Name_theme varchar2(120);
i integer;
cursor theme_list is 
select t.NAME_THEME,count (a.id_author)into i
from BOOKS b join THEMES t on(b.ID_THEME=t.ID_THEME) join AUTHORS a on(b.ID_AUTHOR=a.ID_AUTHOR) 
where b.ID_AUTHOR=a.ID_AUTHOR and b.ID_THEME=t.ID_THEME
group by t.NAME_THEME,i;
begin
open theme_list; 
loop
fetch theme_list into t.NAME_THEME,count(a.id_author);
exit when theme_list%not_found;
dbms_output.put_line(Name_theme||' '||i);
end loop;
dbms_output.put_line('was found'||theme_list%rowcount||'records');
close theme_list;
end;

Не знаю як в курсорі використати функцію Count, щоб рахувало загальну кількість авторів по кожній темі.
видає наступні помилки:

ORA-06550: line 5, column 47:
PL/SQL: ORA-00947: not enough values
ORA-06550: line 5, column 1:
PL/SQL: SQL Statement ignored
ORA-06550: line 12, column 23:
PLS-00201: identifier 'T.NAME_THEME' must be declared
ORA-06550: line 12, column 1:
PL/SQL: SQL Statement ignored
ORA-06550: line 13, column 22:
PLS-00208: identifier 'NOT_FOUND' is not a legal cursor attribute
ORA-06550: line 13, column 1:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

2

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

Це звичайний селект. Проблема у використанні функції Count в курсорі.
Наприклад має показувати Тему - Роман (в одній колонці), а в іншій - кількість авторів, які працюють по даній тематиці.

select t.NAME_THEME,count(a.id_author)
from BOOKS b join THEMES t on(b.ID_THEME=t.ID_THEME) join AUTHORS a on(b.ID_AUTHOR=a.ID_AUTHOR) 
where b.ID_AUTHOR=a.ID_AUTHOR and b.ID_THEME=t.ID_THEME
group by t.NAME_THEME;

3

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

Потрібно присвоїти аліас, наприклад

count(column_name) as cnt

і далі працювати в курсорі як із іншими колонками.

4

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

declare 
NAME_THEME varchar2(120);
cnt integer;
cursor theme_list is 
select t.name_theme,count(a.id_author)as cnt
from BOOKS b join THEMES t on(b.ID_THEME=t.ID_THEME) join AUTHORS a on(b.ID_AUTHOR=a.ID_AUTHOR) 
group by t.name_theme,cnt;
begin
open theme_list; 
loop
fetch theme_list into t.NAME_THEME,cnt;
exit when theme_list%notfound;
dbms_output.put_line(t.NAME_THEME||' '||cnt);
end loop;
dbms_output.put_line('was found'||theme_list%rowcount||'records');
close theme_list;
end;

і коди помилки:

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

5

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

fetch theme_list into t.NAME_THEME,cnt;

тут t. не потрібно, просто NAME_THEME

6

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

declare 
Name_theme varchar2(120);
cnt integer;
cursor theme_list is 
select t.name_theme,count(a.id_author)as cnt
from BOOKS b join THEMES t on(b.ID_THEME=t.ID_THEME) join AUTHORS a on(b.ID_AUTHOR=a.ID_AUTHOR) 
group by t.name_theme;
begin
open theme_list; 
loop
fetch theme_list into NAME_THEME,cnt;
exit when theme_list%notfound;
dbms_output.put_line(Name_theme||' '||cnt);
end loop;
dbms_output.put_line('was found'||theme_list%rowcount||'records');
close theme_list;
end;

працює. а як перевірити курсор можна?

7

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

Иии... запустити?

8

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

тобто побачити дані в курсорі - вибірку, що міститься в курсорі