281

(7 відповідей, залишених у Бази даних)

Це звичайний селект. Проблема у використанні функції 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;

282

(7 відповідей, залишених у Бази даних)

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

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.

283

(5 відповідей, залишених у Бази даних)

тепер працює

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;

284

(5 відповідей, залишених у Бази даних)

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

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.

285

(5 відповідей, залишених у Бази даних)

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

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.

286

(18 відповідей, залишених у Бази даних)

create or replace trigger PriceChek
after insert or update on SALES for each row
declare price books.price%type;
begin
select PRICE into price from books where ID_BOOK =:new.ID_BOOK;
    if (:new.Price <price) then
    raise_application_error(-20111,'price is to low');
end if;
end;

тепер працює

287

(18 відповідей, залишених у Бази даних)

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

create or replace trigger PriceChek
after insert on SALES for each row
declare price books.price%type;
begin
select PRICE into price from books where price=:PRICE and ID_BOOK=ID_BOOK;
    if (:new.Price <price) then
    raise_application_error(-20111,'price is to low');
end if;
end;

288

(18 відповідей, залишених у Бази даних)

як цей тригер підігнати під синтаксис оракла?

sasha87 написав:
create trigger PriceCheck
on [dbo].[SALES (sale)]
for insert
as
begin
declare @a money, @b int, @c int

select @a =[Price], @b = [ID_BOOK] from inserted
select @c = (Select [Price] from [dbo].[BOOKS (book)] where [ID_BOOK] = @b)

if(@a < @c)
begin
raiserror('Sale price`s fewer than the average price', 20, 20)
rollback transaction
end
end

289

(18 відповідей, залишених у Бази даних)

create trigger PriceCheck
on [dbo].[SALES (sale)]
for insert
as
begin
declare @a money, @b int, @c int

select @a =[Price], @b = [ID_BOOK] from inserted
select @c = (Select [Price] from [dbo].[BOOKS (book)] where [ID_BOOK] = @b)

if(@a < @c)
begin
raiserror('Sale price`s fewer than the average price', 20, 20)
rollback transaction
end
end

290

(18 відповідей, залишених у Бази даних)

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

291

(18 відповідей, залишених у Бази даних)

інсертед - тимчасова таблиця, куди заносяться дані при вставленні в таблицю, делетед - при видаленні. На скільки я розумію інсертед треба використовувати (в даному випадку), якщо наприклад коли в таблиці було би 10000 записів. Якщо зробити вибірку з таблиці Книги, то як занести всі дані в одну змінну?

292

(18 відповідей, залишених у Бази даних)

alter trigger PriceCheck 
on [dbo].[SALES (sale)] for insert, update, delete
as
begin
declare @price1 money
declare @price2 money
select @price1=b.[Price] from [BOOKS (book)] b inner join inserted i on b.ID_BOOK=i.ID_BOOK
select @price2 =s.[Price] from [SALES (sale)] s inner join deleted d on s.ID_BOOK=d.ID_BOOK
if @price1>@price2  
rollback transaction 
raiserror ('цена продажы меньше основной цены',16,2) 
end

синтаксично помилки немає

293

(18 відповідей, залишених у Бази даних)

create trigger PriceCheck 
on [dbo].[SALES (sale)] for insert, update, delete
as
begin
declare @price1 money
declare @price2 money
select @price1=[Price] from[dbo].[BOOKS (book)] 
select @price2 =[Price] from [dbo].[SALES (sale)]
if @price1>@price2  raiserror ('цена продажы меньше основной цены',16,2) 
end

якось так має бути. Але ще треба зробити вибірку з таблиць Іnserted, Deleted.

294

(18 відповідей, залишених у Бази даних)

треба написати тригер і використовувати таблиці інсертед і делетед
і видавати помилку якщо ціна з таблиці продажі нижча від ціни з таблиці книги

295

(18 відповідей, залишених у Бази даних)

Саме так. Вибачаюсь за не інформативність.
Є поля ID. В таблиці Книги є поля Айді, назва книги, Кількість сторінок, Ціна, Айді теми(яке є зовнішнім ключем до таблиці Теми), Айді автора(яке є зовнішнім ключем до таблиці Автори), Дата публікації, Опис(що є на обкладинці - назва книги, рік видання, видавництво та інша інформація)
Таблиця Продажі є поля: Айді продажу, айді книги(відношення з таблицею Книги), Дата продажу, ціна, Кількість проданих екземплярів однієї книги, Айді магазину (відношення до таблиці Магазини)
Також є Таблиця Магазини:Айді магазину, назва магазину, айді країни(відношення з таблицею Країни, тобто в якій країні знаходиться магазин)
таблиця Країни: Айді країни, назва країни
таблиця Теми: Айді теми, назва теми
таблиця Автори: Айді автора, ім'я, прізвище, айді країни(відношення до таблиці Країни, тобто з якої країни автор)

296

(18 відповідей, залишених у Бази даних)

як зробити порівняння поля Ціна з таблиці Книги і поля Ціна з таблиці Продажі використовуючи тригер?
Якщо ціна з таблиці продажі нижча від ціни з таблиці книги, тоді генерувати помилку.
Ось є початок, але не знаю в умові Where що потрібно писати?

alter trigger PriceCheck 
on [dbo].[SALES (sale)] 
INSTEAD OF INSERT
AS
BEGIN
IF (EXISTS (SELECT [dbo].[SALES (sale)].Price
 FROM [dbo].[SALES (sale)], inserted I,deleted d,[dbo].[BOOKS (book)]
where 
begin print ('ціна нижча основної') end
END

297

(31 відповідей, залишених у C++)

чому?

298

(31 відповідей, залишених у C++)

7, 8, 9 пункти меню - нічого не роблять

#include<iostream>
#include<ostream>
#include<string>
#include<list>
#include<iterator>
#include<algorithm>
using namespace std;
class Аbonent
{
protected:
    string fname;
    string lname;
    string e_mail;
    string PhoneNumber;
    string DateofBirth;
public:
    Аbonent()
    {
        fname = "NULL";
        lname = "NULL";
        e_mail = "NULL";
        PhoneNumber = "NULL";
        DateofBirth = "NULL";
    }
    Аbonent(string f, string l,string e,string P, string D)
    {
        fname=f;
        lname = l;
        e_mail =e;
        PhoneNumber = P;
        DateofBirth = D;
    }
    void Setlname()
    {
        cout << "введите фамилию"<< endl;
        cin >> lname;
    }
    string Getlname()
    {
        return this->lname;
    }

    void Setfname()
    {
        cout << "введите имя" << endl;
        cin >> fname;
    }
    string Getfname()
    {
        return this->fname;
    }
    void Setemail()
    {
        cout << "введите адрес електронной почты" << endl;
        cin >> e_mail;
    }
    string Getemail()
    {
        return this->e_mail;
    }
    void SetPhone()
    {
        cout << "введите номер телефона " << endl;
        cin >> PhoneNumber;
    }
    string GetPhone()
    {
        return PhoneNumber;
    }
    void SetDateofbirth()
    {
        cout << "введите дату рождения"<< endl;
        cin >> DateofBirth;
    }
    string GetDateofBirth()
    {
        return this->DateofBirth;
    }
    void setallINFO()
    {
        Setlname();
        Setfname();
        Setemail();
        SetPhone();
        SetDateofbirth();
    }
    friend ostream& operator<< (ostream& out, Аbonent& obj);
    friend istream& operator>>(istream& in, Аbonent& obj);
};
std::ostream& operator<< (std::ostream& out, Аbonent& obj)
{
    out << obj.lname << endl;
    out << obj.fname << endl;
    out << obj.e_mail << endl;
    out << obj.PhoneNumber << endl;
    out << obj.DateofBirth << endl;
    return out;
}
std::istream& operator>>(std::istream& in, Аbonent& obj)
{
    in >> obj.lname;
    in >> obj.DateofBirth;
    in >> obj.fname;
    in >> obj.e_mail;
    in >> obj.PhoneNumber;
    return in;
}
bool Srbonent a1, Аbonent a2)
{
    return a1.Getlname() > a2.Getlname();
}
class Notebook
{
private:
    listbonent>Note;
  
public:
    string lname = "NULL";
    void add_client()
    {
       /* Добавление новой записи*/
        Аbonent* tmp = new Аbonent();
        tmp->setallINFO();
        this->Note.push_back(*tmp);
        delete tmp;
    }
    void add_clientbonent tmp)
       /* перегрузка метода добавления новой записи*/
    {
        this->Note.push_back(tmp);
    }
  /*  вывод всех записей*/
    void Output()
    {
        listbonent>::iterator IT = Note.begin();
        for (; IT != Note.end(); IT++)
        {
            cout << *IT << endl;
        }
    }
    void SearchByFname(string F)
    {
        bool f = false;
        listbonent>::iterator IT = Note.begin();
        for (; IT != Note.end(); IT++)
        {
            if (F == (*IT).Getfname())
                cout << *IT << endl;
            f = true;
        }
        if (!f)
            cout << "нет такого имени в записной книжке" << endl;
    }
    void SearchByLname(string L)
    {
        bool l = false;
        listbonent>::iterator IT = Note.begin();
        for (; IT != Note.end(); IT++)
        {
            if (L == (*IT).Getlname())
                cout << *IT << endl;
            l = true;
        }
        if (!l)
            cout << "нет такой фамилии в записной книжке" << endl;
    }
    void SearchByEmail(string E)
    {
        bool e = false;
        listbonent>::iterator IT = Note.begin();
        for (; IT != Note.end(); IT++)
        {
            if (E == (*IT).Getemail())
                cout << *IT << endl;
            e = true;
        }
        if (!e)
            cout << "нет такой електронной почты в записной книжке" << endl;
    }
    void SearchByPhoneNumber(string P)
    {
        bool p = false;
        listbonent>::iterator IT = Note.begin();
        for (; IT != Note.end(); IT++)
        {
            if (P == (*IT).GetPhone())
                cout << *IT << endl;
            p = true;
        }
        if (!p)
            cout << "нет такого номера телефона в записной книжке" << endl;
    }
    void SearchByDateofBirth(string D)
    {
        bool d = false;
        listbonent>::iterator IT = Note.begin();
        for (; IT != Note.end(); IT++)
        {
            if (D == (*IT).GetDateofBirth())
                cout << *IT << endl;
            d = true;
        }
        if (!d)
            cout << "нет такой даты в записной книжке" << endl;
    }
    bool Lnamepredbonent& a1, Аbonent& a2)
    {
        return a1.Getlname() < a2.Getlname();
    }
    void SortBylname()
    {
        Note.sort(Sr);
    }
    void searchinfo(string value)
    {
        listbonent>::iterator iter = Note.begin();
        for (; iter != Note.end(); iter++)
        {
            if ((*iter).GetDateofBirth() == value ||
                ((*iter).Getemail() == value) ||
                ((*iter).Getfname() == value) ||
                ((*iter).Getlname() == value) ||
                ((*iter).GetPhone() == value))
            {
                cout << *iter << endl;
            }
        }
    };
    void deleteinfo(string value) 
    {
        listbonent>::iterator it = Note.begin();
        for (; it != Note.end(); it++)
        {
            if ((*it).GetDateofBirth().compare(value) == 0)
            {
                (*it).GetDateofBirth().erase();
            }
            else if ((*it).Getemail().compare(value) == 0)
            { 
                (*it).Getemail().erase();
            }
            else if ((*it).GetPhone().compare(value) == 0)
            {
                (*it).GetPhone().erase();
            }
            else if ((*it).Getfname().compare(value) == 0)
            {
                (*it).Getfname().erase();
            }
            else if ((*it).Getlname().compare(value) == 0)
            {
                (*it).Getlname().erase();
            }
        }
    }
};
void Menu_()
{
    cout << "Заполните пожалуйста данные" << endl;
    cout << "1 - Добавить новую запись" << endl;
    cout << "2 - Показать информацию по имени" << endl;
    cout << "3 - Показать информацию по фамилии" << endl;
    cout << "4 - Показать информацию по Дате рождения" << endl;
    cout << "5 - Показать информацию по електронной почте" << endl;
    cout << "6 - Показать информацию по телефону" << endl;
    cout << "7 - Сортировать по фамилии" << endl;
    cout << "8 - Показать информацию по нескольким признакам" << endl;
    cout << "9 - Удалить информацию" << endl;
    cout << "10 - EXIT" << endl;
}
int main()
{
    setlocale(LC_ALL, "rus");
    Аbonent A;
    Notebook N;
    string TMP;
    listbonent>::iterator IT;
    int Menu = 0;
    int param;
    do
    {
        system("cls");
        Menu_();
        cin >> Menu;
        switch (Menu)
        {
        case 1:
            cout << "добавление новой записи" << endl;
            N.add_client();
            break;
        case 2:
            cout << "Показ информации по имени" << endl;
            cout << "Введите имя" << endl;
            cin >> TMP;
            N.SearchByFname(TMP);
            cout << "Введите другое имя" << endl;
            break;
        case 3:
            cout << "Показ информации по фамилии" << endl;
            cout << "Введите фамилию" << endl;
            cin >> TMP;
            N.SearchByLname(TMP);
            cout << "Введите другую фамилию" << endl;
            break;
        case 4:
            cout << "Показ информации по Дате Рождения" << endl;
            cout << "Введите Дату Рождения" << endl;
            cin >> TMP;
            N.SearchByDateofBirth(TMP);
            cout << "Введите другую дату рождения" << endl;
            break;
        case 5:
            cout << "Показ информации по Електронной почте" << endl;
            cout << "Введите адрес електронной почты" << endl;
            cin >> TMP;
            N.SearchByEmail(TMP);
            cout << "Введите другой адрес електронной почты" << endl;
            break;
        case 6:
            cout << "Показ информации по номеру телефона" << endl;
            cout << "Введите номер телефона" << endl;
            cin >> TMP;
            N.SearchByPhoneNumber(TMP);
            cout << "Введите другой номер телефона" << endl;
            break;
        case 7:
            cout << "Сортировка по фамилии" << endl;
            N.SortBylname();
            break;
        case 8:
            cin >> TMP;
            N.searchinfo(TMP);
            cout << "Поиск информации завершен" << endl;
            break;
        case 9:
            cout << "удаление ";
        }
        system("pause");
    } 
    while (Menu != 10);
    system("pause");
    return 0;
}

299

(31 відповідей, залишених у C++)

буду мати на увазі. Класи - з великої букви, методи - з маленької, змінні - однією буквою. Це ви мали на увазі?
і все ж таки як щодо помилок?

300

(31 відповідей, залишених у C++)

wander написав:
std::sort(Note.begin(),Note.end(),Lname)

sasha87, щось я ніяк не можу допетрати, що ви тут хочете зробити?

І так, визначтеся зі стилем найменування функцій, класів, змінних і т.д.
Бо всякі: lname, e_mail, PhoneNumber, Setfname, GetDateofBirth, add_client - це просто жах.

lname - прізвище
e_mail - електронна пошта
Setfname - задати ім'я абонента
GetDateofBirth - показати ім'я абонента(повертає ім'я абонента)
add_client - додати в книжку абонента, тобто інформацію про нього - прізвище, номер телефону ітд.