이 파일을 mysql promt로 리디렉션하여 저장 프로 시저를 추가합니다.
DROP PROCEDURE IF EXISTS make_transaction;
DELIMITER //
CREATE PROCEDURE make_transaction(IN v_quote_id INT, IN v_your_id INT)
BEGIN
DECLARE v_is_seller BOOLEAN;
DECLARE v_option_type BOOLEAN;
DECLARE v_trader_id INT;
DECLARE v_premium DOUBLE(18, 4);
DECLARE v_offer_expires DATETIME;
DECLARE v_instrument_id INT;
DECLARE v_pretend_now DATETIME;
DECLARE v_buyer_id INT;
DECLARE v_seller_id INT;
DECLARE v_buyer_total_balance DOUBLE(18, 4);
SELECT
instrument_id,
trader_type,
option_type,
trader_id,
premium,
offer_expires
INTO
v_instrument_id,
v_is_seller,
v_option_type,
v_trader_id,
v_premium,
v_offer_expires
FROM
option_quotes
WHERE
quote_id = v_quote_id;
IF v_is_seller THEN
SET v_seller_id = v_trader_id;
SET v_buyer_id = v_your_id;
ELSE
SET v_buyer_id = v_trader_id;
SET v_seller_id = v_your_id;
END IF;
-- Last STOCK_TRADE time is assumed to be the current time
SELECT DATE_TIME
INTO v_pretend_now
FROM STOCK_TRADE
WHERE INSTRUMENT_ID=v_instrument_id
ORDER BY DATE_TIME DESC
LIMIT 1;
SELECT total_balance
INTO v_buyer_total_balance
FROM traders
WHERE trader_id=v_buyer_id;
IF offer_expires <= v_pretend_now THEN
SELECT 'That offer has expired';
ELSE IF v_buyer_total_balance < v_premium THEN
SELECT 'You do not have enough money to transact on this offering';
ELSE
INSERT INTO option_transactions
(
transaction_time,
quote_id,
buyer_id,
seller_id,
buyer_gain,
seller_gain
)
VALUES
(
v_pretend_now,
v_quote_id,
v_buyer_id,
v_seller_id,
NULL, -- line 85
NULL
);
END IF;
END //
DELIMITER ;
db에 저장 프로 시저를 입력하려고 시도하는 중 오류가 발생했습니다.
ERROR 1064 (42000) at line 5: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 85
option_transactions 테이블은 다음과 같습니다.
+------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| quote_id | int(11) | NO | MUL | NULL | |
| buyer_id | int(11) | NO | MUL | NULL | |
| seller_id | int(11) | NO | MUL | NULL | |
| transaction_time | datetime | NO | | NULL | |
| buyer_gain | double(18,4) | YES | | NULL | |
| seller_gain | double(18,4) | YES | | NULL | |
+------------------+--------------+------+-----+---------+-------+
나는 mySQL을 처음 접했지만 85 줄 근처의 명령에 대한 삽입이 나에게 구문에서 올바르게 보이지만 문제가 어디에 있는지 확실하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?
(mysql 서버 버전 5.5.42)
85 행은 INSERT 문의 중간이 아니라 CREATE PROCEDURE 문의 끝에 있습니다. 코드를 vim에 붙여넣고 :se nu
행 번호를 표시 한 다음 CREATE PROCEDURE 전에 초기 행을 삭제하면 마지막 행은 85 행입니다.
84 END IF;
85 END //
86
87 DELIMITER ;
따라서 오류의 줄 번호는 SQL 스크립트 파일의 첫 번째 줄이 아니라 명령문의 첫 번째 줄부터 계산됩니다.
그런 다음 불균형 블록을 찾았습니다.
IF offer_expires <= v_pretend_now THEN
ELSE IF v_buyer_total_balance < v_premium THEN
ELSE
END IF;
IF/THEN/ELSE/END IF
내부 에 중첩 된 ELSE
. 따라서 실제로 두 개의 IF
문이 있지만 END IF
.
이 문제를 해결하려면 두 가지 옵션이 있습니다.
다음 IF
과 같이 하나의 진술을 작성하십시오 ELSIF
.
IF offer_expires <= v_pretend_now THEN
ELSEIF v_buyer_total_balance < v_premium THEN
ELSE
END IF;
의 구문에 대한 문서는 https://dev.mysql.com/doc/refman/5.7/en/if.html 을 참조 하십시오IF/THEN/ELSIF/ELSE/END IF
.
두 IF
진술을 모두 완료하십시오 .
IF offer_expires <= v_pretend_now THEN
ELSE
IF v_buyer_total_balance < v_premium THEN
ELSE
END IF;
END IF;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다