2014-10-02 8 views
1

Я создал хранимую процедуру в MySQL для работы дебетовой следующим образом:MySQL хранимые процедуры выполнения Ошибка

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `debit`(IN snnno INT, IN amt INT, OUT bal INT, OUT msg VARCHAR(50)) 
BEGIN 
     DECLARE cid INT; 
     DECLARE actno INT; 
     DECLARE existbal INT; 
     SELECT customerid INTO cid FROM customer WHERE [email protected]; 
     SELECT accountno INTO actno FROM customeraccounts WHERE [email protected]; 
     SELECT balance INTO existbal FROM account WHERE [email protected]; 
     IF @exisbal < @amt THEN 
       SET msg = 'You dont have suficient balance'; 
     ELSE 
       UPDATE account SET account.balance = account.balance - amt WHERE account.accountno = @actno; 
       INSERT INTO transactions VALUES(NULL, @actno, 'debit', amt); 
       SELECT balance INTO bal FROM account WHERE account.accountno = @actno; 
     END IF; 
END $$ 

Таблицы следующим образом:

mysql> select * from customeraccounts; 
+------------+-----------+-------------------+ 
| customerid | accountno | accounttype  | 
+------------+-----------+-------------------+ 
|   1 |  101 | Savings   | 
|   2 |  102 | Savings   | 
|   3 |  103 | Current   | 
|   4 |  104 | Fixed Deposit  | 
|   5 |  105 | Recurring Deposit | 
+------------+-----------+-------------------+ 
5 rows in set (0.00 sec) 

mysql> select * from customer; 
+------------+--------------+------------------+--------------+------+ 
| customerid | customername | customerstreet | customercity | ssn | 
+------------+--------------+------------------+--------------+------+ 
|   1 | Amy   | Ping Ting Road | Hong Kong | 2532 | 
|   2 | Bob   | Texaco Road  | Hong Kong | 8073 | 
|   3 | Carson  | Deerfoot Trail | Calgary  | 6667 | 
|   4 | David  | University Drive | Calgary  | 4724 | 
|   5 | John   | Ogden Road  | Calgary  | 3880 | 
+------------+--------------+------------------+--------------+------+ 
5 rows in set (0.00 sec) 

mysql> select * from account; 
+-----------+---------+-------------+ 
| accountno | balance | credit_card | 
+-----------+---------+-------------+ 
|  101 |  700 |  2000 | 
|  102 | 2500 |  1000 | 
|  103 | 2700 |  1200 | 
|  104 | 4000 |  2500 | 
|  105 | 4500 |  NULL | 
+-----------+---------+-------------+ 
5 rows in set (0.00 sec) 

Теперь, когда я исполняю хранимая процедура с вводом как ssnno = 2532 и amt = 100, я получаю ошибку SQL, поскольку столбец «accountno» не может быть нулевым.

Когда я ссылаюсь, причиной этой ошибки должно быть то, что столбец должен быть объявлен как NOT NULL. Поэтому я тоже это изменил.

mysql> desc account; 
+-------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+-------------+---------+------+-----+---------+-------+ 
| accountno | int(11) | NO | PRI | NULL |  | 
| balance  | int(11) | NO |  | NULL |  | 
| credit_card | int(11) | YES |  | NULL |  | 
+-------------+---------+------+-----+---------+-------+ 
3 rows in set (0.01 sec) 

В чем проблема? Я не могу понять? Правильно ли моя процедура?

ответ

0

Получил ответ. Я не инициализировал переменные. Ниже приводится обновленная процедура:

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `debit`(IN ssnno INT, IN amt INT, OUT bal INT, OUT msg VARCHAR(45)) 
BEGIN 
     DECLARE actno INT DEFAULT 0; 
     DECLARE cid INT DEFAULT 0; 
     DECLARE currentbal INT DEFAULT 0; 
     SELECT customerid INTO cid FROM customer WHERE ssn = ssnno; 
     SELECT accountno INTO actno FROM customeraccounts WHERE customerid = cid; 
     SELECT balance INTO currentbal FROM account WHERE accountno = actno; 
     IF currentbal > amt THEN 
     UPDATE account SET account.balance = account.balance - amt WHERE account.accountno = actno; 
     INSERT INTO transactions VALUES(NULL, actno, 'debit', amt); 
     SELECT balance INTO bal FROM account WHERE account.accountno = actno; 
     SET msg = 'Successfully Debited'; 
     ELSE 
      SET msg = 'No Sufficient Balance'; 
      SET bal = currentbal; 
     END IF; 
END 
Смежные вопросы