21

Re: Робота з діапазонами дат (Оракл)

Так, у вас, схоже, дефіцит уваги.
Вирізаю питання так, щоб ви його бачили:

koala написав:

яке буде значення виразу '20.10.2017'='26.10.2016'

Конкретно на це ви можете відповісти?

22

Re: Робота з діапазонами дат (Оракл)

помилка буде.

SET SERVEROUTPUT ON
exec Book_update('20.10.2017','26.10.2016');
BEGIN Book_update('20.10.2017','26.10.2016'); END;
Error report -
ORA-21000: error number argument to raise_application_error of 201 is out of range
ORA-06512: at "C##SASHA.BOOK_UPDATE", line 8
ORA-06512: at line 1
21000. 00000 -  "error number argument to raise_application_error of %s%s is out of range"
*Cause:    
*Action:   Use an error number in the range of -20000 to -20999, inclusive.

23

Re: Робота з діапазонами дат (Оракл)

Так.
Ви чогось не розумієте. Чогось дуже базового. Я поки що не можу збагнути, чого саме; але ви не зможете програмувати, доки не прорветеся крізь це.
Спробуємо опуститися ще нижче.
Я написав вираз

 '20.10.2017'='26.10.2016'

Ви написали вираз

SET SERVEROUTPUT ON
exec Book_update('20.10.2017','26.10.2016');

Скільки відмінностей між цими виразами ви бачите? Це вже, вибачте, рівень дитячого садка, але якось нам треба крізь це прорватися.

24

Re: Робота з діапазонами дат (Оракл)

Чекайте. Вам давали такі поняття, як "математична логіка", "булева алгебра" чи хоча б TRUE та FALSE?

25

Re: Робота з діапазонами дат (Оракл)

давали!
'20.10.2017'='26.10.2016' - false

26

Re: Робота з діапазонами дат (Оракл)

О! Чудово, щось є.
Тепер знову до виразу

'20.10.2017'='26.10.2016' and '27.10.2017'='26.10.2016'
and '26.10.2016' between '20.10.2017' and '27.10.2017'; 

Його значення теж буде false, це ви розумієте, чому?

І нарешті

where start_date=DATE_OF_PUBLISH and end_date=DATE_OF_PUBLISH 
and DATE_OF_PUBLISH between start_date and end_date; 

Тепер ви бачите, які саме частини цього виразу роблять його false?

27

Re: Робота з діапазонами дат (Оракл)

а як тоді в start_date та end_date занести значення які знаходяться в DATE_OF_PUBLISH? Щоб при виконанні процедури робилась перевірка дати з стовпчика таблиці DATE_OF_PUBLISH?
Ви хочете сказати що start_date та end_date зсилаються на одну і ту назву стовпця?

28

Re: Робота з діапазонами дат (Оракл)

Нащо в них щось заносити всередині процедури? start_date date та end_date date - це параметри процедури, в них заносяться значення, коли процедуру викликають. Вони не посилаються на жоден стовбчик.

А перевірка має робитися у клаузі where. Питання лише в тому, яка саме перевірка. Ваша майже завжди дає false, бо ви в неї зайві умови напхали.

29

Re: Робота з діапазонами дат (Оракл)

sasha87 написав:
koala написав:

Підставимо наведені вами значення у ваш вираз:

where '20.10.2017'='26.10.2016' and '27.10.2017'='26.10.2016'
and '26.10.2016' between '20.10.2017' and '27.10.2017'; 

Скажіть, ви знаєте, яке буде значення виразу '20.10.2017'='26.10.2016' і як працює булевий оператор AND?

Видасть помилку, тому що початкова дата діапазону більша від кінцевої дати.

Вірно.
Тепер питання, як ви збираєтеся виконати умову

where [start_date]='26.10.2016' and [end_date]='26.10.2016'

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

30

Re: Робота з діапазонами дат (Оракл)

а навіщо?

31

Re: Робота з діапазонами дат (Оракл)

sasha87 написав:

а навіщо?

Дивіться, я запитав:
https://replace.org.ua/post/144631/#p144631

Тут питання до даних в таблиці Books - які там наявні значення в колонці DATE_OF_PUBLISH ?

Ви написали після мого запитання:
https://replace.org.ua/post/144632/#p144632

Стояла дата 26.10.2016

1. Чи вірно я зрозумів, що цей допис був вашою відповіддю на моє запитання?
2. Чи вірно я зрозумів, що всюди в таблиці значення DATE_OF_PUBLISH становить 26.10.2016 ?

32

Re: Робота з діапазонами дат (Оракл)

Чи вірно я зрозумів, що цей допис був вашою відповіддю на моє запитання - це вірно.
Там стоять різні дати.
від 01.01.2005 і до 22.04.2020

33

Re: Робота з діапазонами дат (Оракл)

sasha87 написав:

Там стоять різні дати.
від 01.01.2005 і до 22.04.2020

Нарешті та відповідь, котра була потрібна.
Отже, враховуючи цей ваш допис:
https://replace.org.ua/post/144642/#p144642

update BOOKS set PRICE=PRICE*1.1,PAGES=PAGES*2
where start_date=DATE_OF_PUBLISH and end_date=DATE_OF_PUBLISH and DATE_OF_PUBLISH
between start_date and end_date;

пропоную вказати як вхідні параметри названі вами дати:
start_date = 01.01.2005,  end_date=22.04.2020

34

Re: Робота з діапазонами дат (Оракл)

Не зрозумів, куди вставити?

35 Востаннє редагувалося frz (24.07.2020 18:54:10)

Re: Робота з діапазонами дат (Оракл)

sasha87 написав:

Не зрозумів, куди вставити?

Запустити процедуру з вказаними датами

Book_update(start_date date, end_date date)

пропоную вказати як вхідні параметри названі вами дати:
start_date = 01.01.2005,  end_date=22.04.2020

P.S.: Я розумію, що у вас на курсі багато різних тем, на кожну з них дають недостатньо часу, тому "очі розбігаються", однак все ж намагайтесь зосередитися.

36

Re: Робота з діапазонами дат (Оракл)

Це ви мали на увазі?

SET SERVEROUTPUT ON
exec Book_update(start_date='10.10.2016',end_date='14.10.2016');

помилка:

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

37

Re: Робота з діапазонами дат (Оракл)

То що не так в цій процедурі?

create or replace procedure Book_update(start_date date, end_date date)
as
DATE_OF_PUBLISH date;
begin
if start_date=end_date then 
RAISE_APPLICATION_ERROR(200,'Дата початку та дата кінця однакові');
elsif start_date>end_date then 
RAISE_APPLICATION_ERROR(201,'Дата початку більша ніж дата кінця');
elsif start_date>systimestamp then 
RAISE_APPLICATION_ERROR(202,'Дата початку більша ніж сьогоднішня дата');
if DATE_OF_PUBLISH between  start_date and end_date 
then update BOOKS set PRICE=PRICE*1.1,QUANTITYBOOKS=QUANTITYBOOKS*2
where date_of_publish between start_date and end_date;
--where start_date=date_of_publish and end_date=date_of_publish;
else update BOOKS set PRICE=PRICE*1.1
where 
date_of_publish not between start_date and end_date; 
--start_date=date_of_publish and end_date=date_of_publish;
end if;
end if;
end;
SET SERVEROUTPUT ON
exec Book_update('10.10.2016','14.10.2016');

38 Востаннє редагувалося frz (24.07.2020 21:43:53)

Re: Робота з діапазонами дат (Оракл)

SET SERVEROUTPUT ON
exec Book_update(start_date='10.10.2016',end_date='14.10.2016');

Тут ви зрозуміли мене буквально (
Однак щоб вказати явно, для якого саме параметру ви передаєте значення (скажімо, є три параметри, один чи більше з них необов'язковий, тож ви хочете передати лише два з них), тоді вказувати потрібно start_date=>'10.10.2016' а не start_date='10.10.2016'.

SET SERVEROUTPUT ON
exec Book_update('10.10.2016','14.10.2016');

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

39

Re: Робота з діапазонами дат (Оракл)

identifier 'START_DATE' must be declared

40 Востаннє редагувалося frz (24.07.2020 22:32:55)

Re: Робота з діапазонами дат (Оракл)

Ок, зробив замість вас маленьку роботу для кращої демонстрації. В такому вигляді ви мали би показувати DDL таблиці і приклад заповнення даних.

Прихований текст
create table BOOKS (PRICE decimal, QUANTITYBOOKS integer, date_of_publish date);

insert into BOOKS (PRICE, QUANTITYBOOKS, date_of_publish)
select 5, 6, to_date('11/10/2016','DD/MM/YYYY') from dual union all
select 6, 7, to_date('12/10/2016','DD/MM/YYYY') from dual union all
select 8, 9, to_date('13/10/2016','DD/MM/YYYY') from dual;
commit;

SET SERVEROUTPUT ON
exec Book_update(to_date('10/10/2016','DD/MM/YYYY'),to_date('14/10/2016','DD/MM/YYYY'));
commit;

select * from BOOKS;

Отже, проблема в тому, що ви оголосили змінну

DATE_OF_PUBLISH date;

однак не присвоїли їй жодного значення.
Далі в процедурі йде перевірка:

if DATE_OF_PUBLISH between  start_date and end_date 

однак так як поки що DATE_OF_PUBLISH is null, то перевірка не проходить і апдейт відповідно не виконується.