Имеется процедура по добавлению счетов. Всё работает.. вроде как :)
База данных будет не большая.. до 1000 человек.. поэтому вопрос о оптимизации не стоит..
НО! Хочется спросить.. Сильно ли я наговнокодил ? :)
А может эксперт эту всю процедуру уместит в 5 строк ? :)
Спасибо!
DROP PROCEDURE IF EXISTS insert_bill;
DELIMITER |
CREATE PROCEDURE insert_bill (IN var_customer INT, IN var_service CHAR(20), IN var_date_bill_begin DATE)
BEGIN
# сбор данных для проверки ( что будет ниже )
SELECT COUNT(id_customer) FROM table_customers
WHERE table_customers.`id_customer` = var_customer
INTO @custm_check;
SELECT COUNT(id_service) FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_check;
# .......................................................check all arguments
IF var_date_bill_begin = '0000-00-00' THEN
SELECT 'wrong date!';
ELSEIF @custm_check = 0 THEN
SELECT 'customer is not exists!';
ELSEIF @serv_check = 0 THEN
SELECT 'service not found';
ELSE
# ..................................................... get all data for insert ( service, ident - default... )
SELECT id_service FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_id;
SELECT period_month FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_period;
SELECT price FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_price;
# ..................................................... add notice_payment
SELECT notice_payment_days FROM table_customers
WHERE table_customers.`id_customer` = var_customer
INTO @pay_notice;
IF @pay_notice = 0 THEN
SELECT notice_payment_days FROM table_services
WHERE service_name = var_service
INTO @pay_notice;
END IF;
INSERT INTO table_bills VALUES (
NULL,
var_customer,
@serv_id,
1,
CURDATE(),
var_date_bill_begin,
DATE_ADD(var_date_bill_begin, INTERVAL @serv_period MONTH),
@serv_price,
'unpaid',
@pay_notice
);
# ............................................. IF user status 'inactive' you have to change it.
SELECT status FROM table_customers
WHERE table_customers.`id_customer` = var_customer
INTO @custm_status;
IF @custm_status = 'inactive' THEN
UPDATE table_customers
SET table_customers.`status` = 'active'
WHERE table_customers.`id_customer` = var_customer;
END IF;
END IF;
END;
|
DELIMITER ;
Спустя 32 минуты, 11 секунд (28.01.2012 - 19:25) bob marley написал(а):
Это разве php ?
если да,то я чайник..

если да,то я чайник..

! |
Winston |
Спустя 7 минут, 24 секунды (28.01.2012 - 19:33) vitaly777 написал(а):
Цитата (bob marley @ 28.01.2012 - 19:25) |
Это разве php ? ![]() если да,то я чайник.. ![]() |
рубрика SQL..
или низя тут такие вещи спрашивать ? ))
Спустя 4 минуты, 39 секунд (28.01.2012 - 19:37) bob marley написал(а):
vitaly777
рубрика php+sql !А это какой язык программирования?Так ради саморазвития!
Winston, я не флудил!Я задал человеку вопрос,на который ответ был отрицательный!Помоему не мне предупреждения требуется, а человеку который не в тот раздел написал
рубрика php+sql !А это какой язык программирования?Так ради саморазвития!
Winston, я не флудил!Я задал человеку вопрос,на который ответ был отрицательный!Помоему не мне предупреждения требуется, а человеку который не в тот раздел написал

Спустя 17 минут, 35 секунд (28.01.2012 - 19:55) Winston написал(а):
Это SQL, если не знаешь что это - пойди почитай.
Цитата (bob marley @ 28.01.2012 - 18:37) |
я не флудил |
Ну да, ты не флудил, ты оффтопил.
Цитата (bob marley @ 28.01.2012 - 18:37) |
не в тот раздел написал |
В тот раздел.
PS: ссылки мне в личку нифиг бросать, я и так все увижу.
Спустя 4 минуты, 54 секунды (28.01.2012 - 20:00) bob marley написал(а):
Winston
Тут вопрос о чем у него второй?
Тут вопрос о чем у него второй?
Цитата (vitaly777 @ 28.01.2012 - 15:53) |
Сильно ли я наговнокодил ? ![]() |
Как я определю если тут не php?
Короче не буду я с тобой ругаться!Твое право!Флудил..Оффтопил..Делать мне больше нечего!Зашел помочь,а получил предъяву..
Цитата (Winston @ 28.01.2012 - 16:55) |
PS: ссылки мне в личку нифиг бросать, я и так все увижу. |
окей!!!!
не фиг, так не фиг.
Спустя 3 минуты, 19 секунд (28.01.2012 - 20:03) Игорь_Vasinsky написал(а):
SELECT id_service FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_id;
SELECT period_month FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_period;
SELECT price FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_price;
а подобные конструкции нельзя JOINом переписать?
Спустя 9 минут, 47 секунд (28.01.2012 - 20:13) vitaly777 написал(а):
Цитата (Игорь_Vasinsky @ 28.01.2012 - 20:03) |
а подобные конструкции нельзя JOINом переписать? |
эээ.. сорри.. не понял..
JOIN это чтобы соединить таблицы по условиям..
А тут с одной таблицы собрал информацию в разные переменные ( для последущего
использования в INSERT )
или нет ?

Спустя 1 минута, 25 секунд (28.01.2012 - 20:14) Лена написал(а):
SELECT id_service,period_month, price FROM table_services
WHERE table_services.`service_name` = var_service
INTO @serv_id,@serv_period,@serv_price;
Ниже еще один кусок, который можно короче написать.
Спустя 30 секунд (28.01.2012 - 20:15) Игорь_Vasinsky написал(а):
опс..ссору, не видел cтока чистого SQL
Спустя 5 минут, 55 секунд (28.01.2012 - 20:21) vitaly777 написал(а):
Цитата (Лена @ 28.01.2012 - 20:14) |
Ниже еще один кусок, который можно короче написать. |
Класс!
Не знал, что в INTO можно через запятую записывать несколько переменных.
спасибо
Спустя 1 час, 29 минут, 37 секунд (28.01.2012 - 21:50) sergeiss написал(а):
В дополнение к тому, что тебе уже сказали. Вот эта часть не совсем понятна:
Цитата (vitaly777 @ 28.01.2012 - 19:53) |
SELECT status FROM table_customers WHERE table_customers.`id_customer` = var_customer INTO @custm_status; IF @custm_status = 'inactive' THEN UPDATE table_customers SET table_customers.`status` = 'active' WHERE table_customers.`id_customer` = var_customer; |
Зачем ты делаешь выборку и потом сравнение, если можно это же условие сразу поставить в условие внутри АПДЕЙТа? У тебя же всё происходит внутри одной таблицы. Твои 2 запроса можно заменить на один
UPDATE table_customers
SET table_customers.`status` = 'active'
WHERE table_customers.`id_customer` = var_customer AND table_customers.`status`='inactive';
Спустя 56 минут, 51 секунда (28.01.2012 - 22:47) vitaly777 написал(а):
Цитата (sergeiss @ 28.01.2012 - 21:50) |
Зачем ты делаешь выборку и потом сравнение, если можно это же условие сразу поставить в условие внутри АПДЕЙТа? У тебя же всё происходит внутри одной таблицы. Твои 2 запроса можно заменить на один |
согласен
спасибо!