[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Посмотреть SQL код..
vitaly777
Всем привет!



Имеется процедура по добавлению счетов. Всё работает.. вроде как :)
База данных будет не большая.. до 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 ? ohmy.gif
если да,то я чайник.. ph34r.gif


 ! 

М
Хватит флудить! Для этого есть раздел "Флейм"!
Winston

Спустя 7 минут, 24 секунды (28.01.2012 - 19:33) vitaly777 написал(а):
Цитата (bob marley @ 28.01.2012 - 19:25)
Это разве php ? ohmy.gif
если да,то я чайник.. ph34r.gif


рубрика SQL..

или низя тут такие вещи спрашивать ? ))

Спустя 4 минуты, 39 секунд (28.01.2012 - 19:37) bob marley написал(а):
vitaly777
рубрика php+sql !А это какой язык программирования?Так ради саморазвития!

Winston, я не флудил!Я задал человеку вопрос,на который ответ был отрицательный!Помоему не мне предупреждения требуется, а человеку который не в тот раздел написал mad.gif

Спустя 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)
Сильно ли я наговнокодил ? smile.gif

Как я определю если тут не 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 )


или нет ? smile.gif

Спустя 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)

        SELECT id_service,period_month, price FROM table_services       
        WHERE table_services.`service_name` = var_service       
        INTO @serv_id,@serv_period,@serv_price;

Ниже еще один кусок, который можно короче написать.

Класс!

Не знал, что в 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 запроса можно заменить на один


согласен

спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.