Re: Робота з діапазонами дат (Оракл)
Так, у вас, схоже, дефіцит уваги.
Вирізаю питання так, щоб ви його бачили:
яке буде значення виразу '20.10.2017'='26.10.2016'
Конкретно на це ви можете відповісти?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Бази даних → Робота з діапазонами дат (Оракл)
Так, у вас, схоже, дефіцит уваги.
Вирізаю питання так, щоб ви його бачили:
яке буде значення виразу '20.10.2017'='26.10.2016'
Конкретно на це ви можете відповісти?
помилка буде.
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.
Так.
Ви чогось не розумієте. Чогось дуже базового. Я поки що не можу збагнути, чого саме; але ви не зможете програмувати, доки не прорветеся крізь це.
Спробуємо опуститися ще нижче.
Я написав вираз
'20.10.2017'='26.10.2016'
Ви написали вираз
SET SERVEROUTPUT ON
exec Book_update('20.10.2017','26.10.2016');
Скільки відмінностей між цими виразами ви бачите? Це вже, вибачте, рівень дитячого садка, але якось нам треба крізь це прорватися.
Чекайте. Вам давали такі поняття, як "математична логіка", "булева алгебра" чи хоча б TRUE та FALSE?
давали!
'20.10.2017'='26.10.2016' - false
О! Чудово, щось є.
Тепер знову до виразу
'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?
а як тоді в start_date та end_date занести значення які знаходяться в DATE_OF_PUBLISH? Щоб при виконанні процедури робилась перевірка дати з стовпчика таблиці DATE_OF_PUBLISH?
Ви хочете сказати що start_date та end_date зсилаються на одну і ту назву стовпця?
Нащо в них щось заносити всередині процедури? start_date date та end_date date - це параметри процедури, в них заносяться значення, коли процедуру викликають. Вони не посилаються на жоден стовбчик.
А перевірка має робитися у клаузі where. Питання лише в тому, яка саме перевірка. Ваша майже завжди дає false, бо ви в неї зайві умови напхали.
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'
якщо вносити однакову початкову і кінцеву дати не можна через користувацьку помилку...
а навіщо?
Дивіться, я запитав:
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 ?
Чи вірно я зрозумів, що цей допис був вашою відповіддю на моє запитання - це вірно.
Там стоять різні дати.
від 01.01.2005 і до 22.04.2020
Там стоять різні дати.
від 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
Не зрозумів, куди вставити?
Запустити процедуру з вказаними датами
Book_update(start_date date, end_date date)
пропоную вказати як вхідні параметри названі вами дати:
start_date = 01.01.2005, end_date=22.04.2020
P.S.: Я розумію, що у вас на курсі багато різних тем, на кожну з них дають недостатньо часу, тому "очі розбігаються", однак все ж намагайтесь зосередитися.
Це ви мали на увазі?
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.
То що не так в цій процедурі?
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');
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 таблиці і приклад заповнення даних для неї. Тоді охочий вам допомогти легко скомпілює процедуру і зможе в себе перевірити.
identifier 'START_DATE' must be declared
Ок, зробив замість вас маленьку роботу для кращої демонстрації. В такому вигляді ви мали би показувати DDL таблиці і приклад заповнення даних.
Отже, проблема в тому, що ви оголосили змінну
DATE_OF_PUBLISH date;
однак не присвоїли їй жодного значення.
Далі в процедурі йде перевірка:
if DATE_OF_PUBLISH between start_date and end_date
однак так як поки що DATE_OF_PUBLISH is null, то перевірка не проходить і апдейт відповідно не виконується.