Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / APEX oracle. Базы данных sql. / 20 сообщений из 20, страница 1 из 1
19.12.2021, 23:10
    #40121491
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Друзья , помогите пожалуйста в решении данной задачи. Создал базу данных, необходимо для неё написать процедуру, выводящую список экспонатов автора, у которого име-ется не менее пяти работ. Если таких авторов несколько, то вывести их фами-лии и количество экспонатов.
Очень надо. Среда разработки APEX oracle. Спасибо



CREATE TABLE Авторы (Код_автора NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Фамилия VARCHAR2(40) NOT NULL,
Имя VARCHAR2(40) NOT NULL,
Дата_рождения DATE NOT NULL);

CREATE TABLE Виды_экспозиций (
Код_вида NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Наименование VARCHAR2(50) NOT NULL);

CREATE TABLE Виды_жанров (
Код_жанра NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Наименование VARCHAR2(100) NOT NULL);

CREATE TABLE Экспонаты (
Код_экспоната NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Название VARCHAR (60) NOT NULL,
Тип VARCHAR (60) NOT NULL,
Ценность NUMBER (9,2) NOT NULL,
Известность VARCHAR (60) NOT NULL,
Код_жанра NUMBER NOT NULL,
FOREIGN KEY (Код_жанра) REFERENCES Виды_жанров
);

CREATE TABLE Проведение_выставки (
Код_экспозиции NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
ДатаВремя_проведения DATE NOT NULL,
Код_автора NUMBER NOT NULL,
Код_вида NUMBER NOT NULL,
Код_экспоната NUMBER NOT NULL,
FOREIGN KEY (Код_автора) REFERENCES Авторы,
FOREIGN KEY (Код_вида) REFERENCES Виды_экспозиций,
FOREIGN KEY (Код_экспоната) REFERENCES Экспонаты );
...
Рейтинг: 0 / 0
20.12.2021, 05:07
    #40121534
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx, СОЗДАЛ ПРОЦЕДУРУ , КОТОРАЯ ВЫВОДИТ СПИСОК АВТОРОВ И ЭКСПОНАТОВ. Подскажите пожалуйста как посчитать общее кол-во работ автора, знаю что за общий подсчёт отвечает функция count, но как её применить в процедуре не имею понятия. заранее спасибо

create or replace procedure list_of_exhibits
is

cursor AVTORS_CUR
is
select фамилия,Название
from ПРОВЕДЕНИЕ_ВЫСТАВКИ
join АВТОРЫ on Авторы.Код_автора = ПРОВЕДЕНИЕ_ВЫСТАВКИ.Код_автора
join Экспонаты on Экспонаты.Код_экспоната = ПРОВЕДЕНИЕ_ВЫСТАВКИ.Код_экспоната;


begin
for AVTORS_CYCLE in AVTORS_CUR
loop
DBMS_OUTPUT.PUT_LINE ('Автор:'||AVTORS_CYCLE.фамилия||' - Экспонат:'||
AVTORS_CYCLE.Название);
END LOOP;
END;
/
...
Рейтинг: 0 / 0
20.12.2021, 10:20
    #40121585
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx,

1 экспонат - 1 работа?

ps
...
group by фамилия,Название
having count(*)>4

....
stax
...
Рейтинг: 0 / 0
20.12.2021, 13:35
    #40121641
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Stax,

Реализовал, но выдаёт ошибки. Может подскажите почему?

create or replace procedure list_of_exhibits
is

cursor AVTORS_CUR
is

SELECT фамилия,
count(КОД_ЭКСПОНАТА)
FROM ПРОВЕДЕНИЕ_ВЫСТАВКИ
join АВТОРЫ on Авторы.Код_автора = ПРОВЕДЕНИЕ_ВЫСТАВКИ.Код_автора
GROUP BY АВТОРЫ.фамилия
having count(*)>1

begin

for AVTORS_CYCLE in AVTORS_CUR
loop
DBMS_OUTPUT.PUT_LINE ('Автор:'||AVTORS_CYCLE.фамилия||' - Экспонат:'||
AVTORS_CYCLE.count(КОД_ЭКСПОНАТА));
END LOOP;
end;
/

ОШИБКИ

Error at line 10: PL/SQL: ORA-00933: SQL command not properly ended
Error at line 16: PLS-00103: Encountered the symbol "END" when expecting one of the following:

begin function pragma procedure subtype type <an identifier>
<a double-quoted delimited-identifier> current cursor delete
exists prior

Error at line 5: PL/SQL: SQL Statement ignored
...
Рейтинг: 0 / 0
20.12.2021, 13:43
    #40121644
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx,

оператор заканчивается ;

ps
count(КОД_ЭКСПОНАТА)
добавить алиас, напр количество_экспонатов

зыы
пропало Название?

.....
stax
...
Рейтинг: 0 / 0
20.12.2021, 13:54
    #40121652
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Stax,


Да, название пропало, потому что незнаю как его реализовать.

----------------------------------------------------------------------------------------------------------------------------------------------------------

можно пока без название. Что указывать здесь(' - Кол_во_работ_автора:'||
AVTORS_CYCLE.count(КОД_ЭКСПОНАТА)); подскажите пожалуйста

create or replace procedure list_of_exhibits
is

cursor AVTORS_CUR
is

SELECT фамилия,
count(КОД_ЭКСПОНАТА) "Кол_во_работ_автора"
FROM ПРОВЕДЕНИЕ_ВЫСТАВКИ
join АВТОРЫ on Авторы.Код_автора = ПРОВЕДЕНИЕ_ВЫСТАВКИ.Код_автора
GROUP BY АВТОРЫ.фамилия
having count(*)>1

begin

for AVTORS_CYCLE in AVTORS_CUR
loop
DBMS_OUTPUT.PUT_LINE ('Автор:'||AVTORS_CYCLE.фамилия||' - Кол_во_работ_автора:'||
AVTORS_CYCLE.count(КОД_ЭКСПОНАТА));
END LOOP;
end;
/
...
Рейтинг: 0 / 0
20.12.2021, 13:56
    #40121655
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx,

Допишите пожалуйста
...
Рейтинг: 0 / 0
20.12.2021, 14:07
    #40121666
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx,

create or replace procedure list_of_exhibits
is

cursor AVTORS_CUR
is

SELECT фамилия,
count(КОД_ЭКСПОНАТА) "Кол_во_работ_автора"
FROM ПРОВЕДЕНИЕ_ВЫСТАВКИ
join АВТОРЫ on Авторы.Код_автора = ПРОВЕДЕНИЕ_ВЫСТАВКИ.Код_автора
GROUP BY АВТОРЫ.фамилия
having count(*)>1;

begin

for AVTORS_CYCLE in AVTORS_CUR
loop
DBMS_OUTPUT.PUT_LINE ('Автор:'||AVTORS_CYCLE.фамилия||' - Кол_во_работ_автора:'||
AVTORS_CYCLE.count(КОД_ЭКСПОНАТА));
END LOOP;
end;
/





-------------------------------------------------------------------------------------------------------------------

Error at line 14: PL/SQL: Statement ignored
Error at line 15: PLS-00302: component 'COUNT' must be declared
...
Рейтинг: 0 / 0
20.12.2021, 14:43
    #40121686
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
необходимо для неё написать процедуру, выводящую

Уже стопиццот раз спрашивали - зачем "процедура, выводящая" вместо простого запроса? Научиться писать PL/SQL блок c dbms_output?

автора, у которого имеется не менее пяти работ

По вашим данным ни у одного автора нет пяти работ.


Код: plsql
1.
2.
SELECT a.*, v.*
    FROM ПРОВЕДЕНИЕ_ВЫСТАВКИ v join АВТОРЫ a on a.Код_автора = v.Код_автора;




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
begin

for c in (
  SELECT фамилия,
   count (КОД_ЭКСПОНАТА) cnt
    FROM ПРОВЕДЕНИЕ_ВЫСТАВКИ join АВТОРЫ on Авторы.Код_автора = ПРОВЕДЕНИЕ_ВЫСТАВКИ.Код_автора
GROUP BY АВТОРЫ.фамилия
  having count(*) > 1
         )

loop
  DBMS_OUTPUT.PUT_LINE ('Автор:'||c.фамилия||', кол-во работ автора:'||c.cnt);
END LOOP;
end;
...
Рейтинг: 0 / 0
20.12.2021, 14:45
    #40121688
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
используйте алиас

DBMS_OUTPUT.PUT_LINE ('Автор:'||AVTORS_CYCLE.фамилия||' - Кол_во_работ_автора:'||
AVTORS_CYCLE."Кол_во_работ_автора");

....
stax
...
Рейтинг: 0 / 0
20.12.2021, 15:00
    #40121692
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Stax, огромное вам спасибо. дай бог вам здоровья
...
Рейтинг: 0 / 0
20.12.2021, 15:03
    #40121695
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
dmdmdm, огромное вам спасибо
...
Рейтинг: 0 / 0
20.12.2021, 15:52
    #40121712
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
declare
  v_cnt_autor int;
  v_kod_autor number;
  v_name_autor varchar2(40);
begin
  select count(count(*)),max(max(v.Код_автора)),max(max(Фамилия))
  into v_cnt_autor,v_kod_autor,v_name_autor
  from  Проведение_выставки v,Авторы a
  where v.Код_автора=a.Код_автора 
  group by v.Код_автора
  having count(*)>4;
  case 
    when  v_cnt_autor=0 then dbms_output.put_line('нету авторов, у которых > 4 експоната');
    when  v_cnt_autor=1 then dbms_output.put_line('1 автор, c > 4 експонатоми -->'||v_name_autor||' и его експонаты');
      for r in (select Название  from  Проведение_выставки v, Экспонаты e   where v.Код_автора=v_kod_autor and v.Код_экспоната=e.Код_экспоната
       ) loop
        dbms_output.put_line(r.Название);
      end loop;

    when  v_cnt_autor>1 then dbms_output.put_line('много авторов, у которых > 4 експоната');
      for r in (select max(Фамилия) fio ,count(*) cnt
                from  Проведение_выставки v,Авторы a   where v.Код_автора=a.Код_автора 
                group by v.Код_автора
                having count(*)>4
         ) loop
        dbms_output.put_line(r.fio||' '||r.cnt);
      end loop;
    
  end case;
end;

много авторов, у которых > 4 експоната
xxxxALEKSEYxxxx 5
ALEKSEY 6

Statement processed.

0.01 seconds

delete Проведение_выставки where КОД_АВТОРА=2 and rownum<4;

declare
  v_cnt_autor int;
  v_kod_autor number;
  v_name_autor varchar2(40);
...
1 автор, c > 4 експонатоми -->xxxxALEKSEYxxxx и его експонаты
Ручка
блокнот
Карандаш
Ноут
Тетрадь

Statement processed.

0.02 seconds




ps
set transaction read only;
....
stax
...
Рейтинг: 0 / 0
20.12.2021, 17:23
    #40121739
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Stax,


Спасибо огромное, очень помогли. Вы настоящий профессионал!!!
...
Рейтинг: 0 / 0
21.12.2021, 15:02
    #40121932
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Здравствуй. Помогите пожалуйста для представленной БД создать функцию, которая возвращает количество выставок в задан-ном месяце (году). Очень надо, самому разбираться как это реализовать нет времени. Буду очень благодарен. Заранее всем спасибо. среда разработка APEX oracle.

--------------------------------------------------------------------------------------------------------------------------------------------

CREATE TABLE Авторы (Код_автора NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Фамилия VARCHAR2(40) NOT NULL,
Имя VARCHAR2(40) NOT NULL,
Дата_рождения DATE NOT NULL);

CREATE TABLE Виды_экспозиций (
Код_вида NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Наименование VARCHAR2(50) NOT NULL);

CREATE TABLE Виды_жанров (
Код_жанра NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Наименование VARCHAR2(100) NOT NULL);

CREATE TABLE Экспонаты (
Код_экспоната NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Название VARCHAR (60) NOT NULL,
Тип VARCHAR (60) NOT NULL,
Ценность NUMBER (9,2) NOT NULL,
Известность VARCHAR (60) NOT NULL,
Код_жанра NUMBER NOT NULL,
FOREIGN KEY (Код_жанра) REFERENCES Виды_жанров
);

CREATE TABLE Проведение_выставки (
Код_экспозиции NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
ДатаВремя_проведения DATE NOT NULL,
Код_автора NUMBER NOT NULL,
Код_вида NUMBER NOT NULL,
Код_экспоната NUMBER NOT NULL,
FOREIGN KEY (Код_автора) REFERENCES Авторы,
FOREIGN KEY (Код_вида) REFERENCES Виды_экспозиций,
FOREIGN KEY (Код_экспоната) REFERENCES Экспонаты );

--------------------------------------------------------------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
21.12.2021, 15:05
    #40121934
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxxПомогите пожалуйста для представленной БД создать функцию, которая возвращает
количество

Такая функция уже есть, называется COUNT().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.12.2021, 15:08
    #40121935
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Dimitry Sibiryakov,

Если бы всё это было так просто). Мне необходимо это реализовать в такой функции:


[CREATE [OR REPLACE ] ]
FUNCTION имя_функции[ (параметр1 [ , параметр2 ]... ) ]
RETURN тип_возвращаемого_результата
[ AUTHID { DEFINER | CURRENT_USER } ]
[ PARALLEL_ENABLE ]
[DETERMINISTIC] [ PIPELINED ]
{IS | AS}
[ PRAGMA AUTONOMOUS_TRANSACTION; ]
[ локальные объявления переменных]
BEGIN
Исполняемые_операторы
[ EXCEPTION
обработка_ошибок]
END [ имя_функции];
...
Рейтинг: 0 / 0
21.12.2021, 19:06
    #40122005
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
РЕБЯТА , помогите пожалуйста !!!
...
Рейтинг: 0 / 0
21.12.2021, 20:45
    #40122021
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
xxxxALEKSEYxxxx,
автор...
создать функцию, которая возвращает количество выставок в задан-ном месяце (году).
...
Очень надо, самому разбираться как это реализовать нет времени.
...


А ждать полдня, когда дядя решит время есть?

Мессир,

PL/SQL References 8 PL/SQL Subprograms
Extract (datetime)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> create table dropme( id number, e_date date);

Table created.

SQL> commit;

Commit complete.

SQL> insert into dropme select level,sysdate+(level*2) from dual connect by level < 30;

29 rows created.

SQL> with 
function f_expos(p_year in number,p_month in number) return number
is
v_cnt number:=1;
begin
select count(*) into v_cnt
from dropme where 
    extract(year from e_date) = p_year 
and extract(month from e_date) = p_month;
return v_cnt;
end;
select f_expos(2022,1) from dual
;
F_EXPOS(2022,1)
---------------
             15



памятка:
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?
Студентам, желающим помощи

1) Полная постановка задачи (без сокращений)

2) Подготовьте тестовые данные, лучше в виде with
пример (не ваш случай) в конце

3) Покажите что сделали, что получили, без сокращений. ( лучше не в виде screenshot)

4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение

Пример подготовленных данных, запроса и вывода.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
-- table 1 with column list
with user_tab(user_id,user_name,registry_date) as (
select 1,'Bob',to_date('11.02.1921 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,'Max',to_date('11.02.1922 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,'Jon',to_date('11.02.1923 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual
)
-- table 2 with column list
,user_post(post_id,user_id,parent_post_id,post_date,message) as (
select 100,1,null,to_date('11.02.1923 23:04:00','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 101,2,100,to_date('11.02.1923 23:05:23','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 102,3,100,to_date('11.02.1923 23:05:35','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 103,1,102,to_date('11.02.1923 23:06:00','DD.MM.YYYY HH24:MI:SS'),'How are you' from dual union all
select 104,2,102,to_date('11.02.1923 23:07:05','DD.MM.YYYY HH24:MI:SS'),'All right!' from dual union all
select 105,1,101,to_date('11.02.1923 23:06:21','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 106,1,104,to_date('11.02.1923 23:04:37','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 107,2,null,to_date('11.02.1923 23:08:56','DD.MM.YYYY HH24:MI:SS'),'Hmm' from dual
)
select
rpad(to_char(p.post_date,'YYYY-MM-DD HH24:MI:SS  '),20+level*2,' ')||u.user_name||': '||p.message as txt
from 
 user_post p
 join user_tab  u on ( p.user_id = u.user_id)
where p.post_date >= u.registry_date
start with p.parent_post_id is null 
connect by prior p.post_id=p.parent_post_id 
;

TXT
--------------------------------------------------------------------------------
1923-02-11 23:04:00   Bob: Hi
1923-02-11 23:05:23     Max: Hi
1923-02-11 23:06:21       Bob: Bye
1923-02-11 23:05:35     Jon: Hi
1923-02-11 23:06:00       Bob: How are you
1923-02-11 23:07:05       Max: All right!
1923-02-11 23:04:37         Bob: Bye
1923-02-11 23:08:56   Max: Hmm

8 rows selected.
...
Рейтинг: 0 / 0
21.12.2021, 21:15
    #40122024
xxxxALEKSEYxxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
APEX oracle. Базы данных sql.
Vadim Lejnin,

Спасибо, дядя за ваш труд!!!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / APEX oracle. Базы данных sql. / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]