2016-05-04 8 views
0

現在エラーをのMySQL手順エラー1292自動減算2年

20時45分54秒コールbook_rental(1、5、2、50.00、2,2、5.00、3、4、2.00、4を得ます 2、10.00、 '2016-01-01'、 '2016-01-01'、 '2016-01-05')エラーコード:1292. 日付時刻の値が正しくない: '1'列の 'date'列が '2014' 0.265 sec

ここにコードがあります。助けてください!

DROP PROCEDURE IF EXISTS book_rental; 

DELIMITER // 
CREATE PROCEDURE book_rental(customer_id_param MEDIUMINT, item1_id TINYINT, item1_qty SMALLINT, item1_price DECIMAL(9,2), item2_id TINYINT, item2_qty SMALLINT, item2_price DECIMAL(9,2), item3_id TINYINT, item3_qty SMALLINT, item3_price DECIMAL(9,2), item4_id TINYINT, item4_qty SMALLINT, item4_price DECIMAL(9,2), payment_type ENUM('cash', 'check', 'credit'), pickup_date DATE, return_date DATE) 
BEGIN 
    DECLARE invdate DATE; 
    SET invdate := pickup_date; 
    SET @item1inv = CONCAT('UPDATE running_inventory SET `', item1_id, '` = `', item1_id, '` - ', item1_qty, ' WHERE date = ', invdate); 
    SET @item2inv = CONCAT('UPDATE running_inventory SET `', item2_id, '` = `', item2_id, '` - ', item2_qty, ' WHERE date = ', invdate); 
    SET @item3inv = CONCAT('UPDATE running_inventory SET `', item3_id, '` = `', item3_id, '` - ', item3_qty, ' WHERE date = ', invdate); 
    SET @item4inv = CONCAT('UPDATE running_inventory SET `', item4_id, '` = `', item4_id, '` - ', item4_qty, ' WHERE date = ', invdate); 

    PREPARE upd1 FROM @item1inv; 
    PREPARE upd2 FROM @item2inv; 
    PREPARE upd3 FROM @item3inv; 
    PREPARE upd4 FROM @item4inv; 

    INSERT INTO invoices (customer_id, invoice_date, invoice_total, payment_type) VALUES (customer_id_param, NOW(), 1.07 * ((item1_qty * item1_price) + (item2_qty * item2_price) + (item3_qty * item3_price) + (item4_qty * item4_price)), payment_type); 
    INSERT INTO invoice_line_items (invoice_sequence, item_id, item_qty, price_per) VALUES (1, item1_id, item1_qty, item1_price); 
    INSERT INTO invoice_line_items (invoice_sequence, item_id, item_qty, price_per) VALUES (2, item2_id, item2_qty, item2_price); 
    INSERT INTO invoice_line_items (invoice_sequence, item_id, item_qty, price_per) VALUES (3, item3_id, item3_qty, item3_price); 
    INSERT INTO invoice_line_items (invoice_sequence, item_id, item_qty, price_per) VALUES (4, item4_id, item4_qty, item4_price); 

    REPEAT 
     EXECUTE upd1; 
     EXECUTE upd2; 
     EXECUTE upd3; 
     EXECUTE upd4; 
     SET invdate = DATE_ADD(invdate, INTERVAL 1 DAY); 
    UNTIL invdate = DATE_SUB(return_date, INTERVAL 1 DAY) 
    END REPEAT; 

    DEALLOCATE PREPARE upd1; 
    DEALLOCATE PREPARE upd2; 
    DEALLOCATE PREPARE upd3; 
    DEALLOCATE PREPARE upd4; 
END// 

答えて

0

プリペアドステートメントに値を渡すときは、パラメータを使用する必要があります。しかし、そうでなければ、日付は一重引用符で囲む必要があります。だから、代わりに:

SET @item1inv = CONCAT('UPDATE running_inventory SET `', item1_id, '` = `', item1_id, '` - ', item1_qty, ' WHERE date = ', invdate); 

それは次のようになります。

SET @item1inv = CONCAT('UPDATE running_inventory SET `', item1_id, '` = `', item1_id, '` - ', item1_qty, ' WHERE date = ''', invdate, ''''); 
+1

あなたは私たちが3時間のためにそれに取り組んできました..... 2分以内に我々の問題を解決しました。ありがとうございました! – AndrewCC

+0

@AndrewCC。 。 。文字列を直接クエリに入れるのではなく、パラメータを使用して調べる必要があります。 'execute'に関するドキュメントはこれをかなりうまくカバーしています。 –