Re: SP not seeing INSERTs within WHILE loop

2007-01-05 Thread ViSolve DB Team

Hi,
Your procedure returned correct numbers.
Does misrepresentation happens for all the runs or adhoc.

Thanks
ViSolve DB Team.

- Original Message - 
From: "brian stone" <[EMAIL PROTECTED]>

To: 
Sent: Wednesday, January 03, 2007 8:55 AM
Subject: SP not seeing INSERTs within WHILE loop


I have an issue where inserts are not being seen properly while in a SP. 
The goal is to track payments made by customers, payment distribution.  I 
narrowed down the issue to the below, so I was able to exclude many columns 
and other tables in hopes it is simple enough to get some help.


I have a payment table and a payment distribution table.  By joining the 
two, I can determine how much money is left for a payment.   I can then 
apply those monies to a customer charge.


I created a simple procedure that loops and distributes $1 5 times.

Problem:
the SELECT returns $10 twice in a row.  Unless I am missing something, it 
should be returning $9 on the second SELECT.  After the second select, it 
returns 8, then 7, etc...  For some reason, that second select is wrong?


CREATE TABLE payment
(
 payment_id INT PRIMARY KEY AUTO_INCREMENT,
 amount DECIMAL(15,5),
 date_dist DATETIME NULL DEFAULT NULL -- date fully distributed
);

CREATE TABLE payment_dist
(
 payment_id INT NOT NULL DEFAULT 0,
 amount DECIMAL(15,5)
);

-- make a $10 payment
INSERT INTO PAYMENT VALUES (DEFAULT, 10.00, DEFAULT);

DROP PROCEDURE p;
DROP FUNCTION safe_decimal;
delimiter //
CREATE FUNCTION safe_decimal(d DECIMAL(15,5))
RETURNS DECIMAL(15,5)
BEGIN
 IF d IS NULL THEN
   RETURN 0;
 END IF;
 RETURN d;
END;
//
delimiter ;

delimiter //
CREATE PROCEDURE p ()
BEGIN
 DECLARE count INT DEFAULT 0;

 WHILE count < 5 DO
   SELECT payment.payment_id AS payment_id,
 (payment.amount - SUM(safe_decimal(d.amount))) AS amount
 FROM payment LEFT JOIN payment_dist d
 ON payment.payment_id = d.payment_id
 WHERE payment.date_dist IS NULL GROUP BY 1 ORDER BY 1;

   SET count = count + 1;
   INSERT INTO payment_dist (payment_id, amount) VALUES (1, 1.00);
 END WHILE;
END;
//
delimiter ;
CALL p();

mysql> CALL p();
++--+
| payment_id | amount   |
++--+
|  1 | 10.0 |
++--+
1 row in set (0.00 sec)

++--+
| payment_id | amount   |
++--+
|  1 | 10.0 |
++--+
1 row in set (0.00 sec)

++-+
| payment_id | amount  |
++-+
|  1 | 8.0 |
++-+
1 row in set (0.00 sec)

++-+
| payment_id | amount  |
++-+
|  1 | 7.0 |
++-+
1 row in set (0.00 sec)

++-+
| payment_id | amount  |
++-+
|  1 | 6.0 |
++-+
1 row in set (0.00 sec)

Query OK, 1 row affected (0.00 sec)


mysql> SELECT payment.payment_id AS payment_id,
   -> (payment.amount - SUM(safe_decimal(d.amount))) AS amount
   -> FROM payment LEFT JOIN payment_dist d
   -> ON payment.payment_id = d.payment_id
   -> WHERE payment.date_dist IS NULL GROUP BY 1 ORDER BY 1;
++-+
| payment_id | amount  |
++-+
|  1 | 5.0 |
++-+
1 row in set (0.00 sec)

I end up with the correct number but am getting the wrong result after the 
first insert.


any ideas what is happening here?


__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around
http://mail.yahoo.com 



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



SP not seeing INSERTs within WHILE loop

2007-01-02 Thread brian stone
I have an issue where inserts are not being seen properly while in a SP.  The 
goal is to track payments made by customers, payment distribution.  I narrowed 
down the issue to the below, so I was able to exclude many columns and other 
tables in hopes it is simple enough to get some help. 

I have a payment table and a payment distribution table.  By joining the two, I 
can determine how much money is left for a payment.   I can then apply those 
monies to a customer charge.  

I created a simple procedure that loops and distributes $1 5 times.  

Problem: 
the SELECT returns $10 twice in a row.  Unless I am missing something, it 
should be returning $9 on the second SELECT.  After the second select, it 
returns 8, then 7, etc...  For some reason, that second select is wrong?

CREATE TABLE payment
(
  payment_id INT PRIMARY KEY AUTO_INCREMENT,
  amount DECIMAL(15,5),
  date_dist DATETIME NULL DEFAULT NULL -- date fully distributed
);

CREATE TABLE payment_dist
(
  payment_id INT NOT NULL DEFAULT 0,
  amount DECIMAL(15,5)
);

-- make a $10 payment
INSERT INTO PAYMENT VALUES (DEFAULT, 10.00, DEFAULT);

DROP PROCEDURE p;
DROP FUNCTION safe_decimal;
delimiter //
CREATE FUNCTION safe_decimal(d DECIMAL(15,5))
RETURNS DECIMAL(15,5)
BEGIN
  IF d IS NULL THEN
RETURN 0;
  END IF;
  RETURN d;
END;
//
delimiter ;

delimiter //
CREATE PROCEDURE p ()
BEGIN
  DECLARE count INT DEFAULT 0;

  WHILE count < 5 DO
SELECT payment.payment_id AS payment_id,
  (payment.amount - SUM(safe_decimal(d.amount))) AS amount
  FROM payment LEFT JOIN payment_dist d 
  ON payment.payment_id = d.payment_id
  WHERE payment.date_dist IS NULL GROUP BY 1 ORDER BY 1;
  
SET count = count + 1;
INSERT INTO payment_dist (payment_id, amount) VALUES (1, 1.00);
  END WHILE;
END;
//
delimiter ;
CALL p();

mysql> CALL p();
++--+
| payment_id | amount   |
++--+
|  1 | 10.0 | 
++--+
1 row in set (0.00 sec)

++--+
| payment_id | amount   |
++--+
|  1 | 10.0 | 
++--+
1 row in set (0.00 sec)

++-+
| payment_id | amount  |
++-+
|  1 | 8.0 | 
++-+
1 row in set (0.00 sec)

++-+
| payment_id | amount  |
++-+
|  1 | 7.0 | 
++-+
1 row in set (0.00 sec)

++-+
| payment_id | amount  |
++-+
|  1 | 6.0 | 
++-+
1 row in set (0.00 sec)

Query OK, 1 row affected (0.00 sec)


mysql> SELECT payment.payment_id AS payment_id,
-> (payment.amount - SUM(safe_decimal(d.amount))) AS amount
-> FROM payment LEFT JOIN payment_dist d 
-> ON payment.payment_id = d.payment_id
-> WHERE payment.date_dist IS NULL GROUP BY 1 ORDER BY 1;
++-+
| payment_id | amount  |
++-+
|  1 | 5.0 | 
++-+
1 row in set (0.00 sec)

I end up with the correct number but am getting the wrong result after the 
first insert.   

any ideas what is happening here?


 __
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com