2017-02-15 3 views
1

私はMySQLを初めて使っていて、いくつかのエラーでぶつかっていますが、これを除いて解決策を見つけることはできません。 。MySQLのプロシージャが間違った値を返す(INSERT SELECTが向いている)

変数 "ue"が1または0(複数のバリデーションが存在する)の場合、次のMySQLプロシージャは値を返します。検証部分(SET ue = EXISTS ...)は、残りのコードなしで動作します。問題はありません。しかし、INSERT INTO SELECTコマンドを実行すると、動作しません。応答が1のときは、常に0が返されます。これらの2つの行は、互いに対立しています。

INSERT INTO meetup_participation SELECT user_id、event_id FRU DUAL WHERE ue = 1;

SELECT ue AS応答;

手順はmeetup_participationに「ユーザID」と「イベントID」を追加し、「イベントが参加」インクリメントするその「ユーザID」と「ユーザの対応するユーザに対してで行を更新すべきです。また、この 'イベントID'を使用してイベントの参加を増やすように更新します。

私は、ユーザーが存在する場合、イベントが存在する場合、イベントの日付が有効な場合、およびユーザーがこのテーブルにまだ存在しない場合のようなものを検証するためにSET ueを使用しています。ですから、私はこの値をINSERT INTO meetup_participation [...] WHERE ue = 1にブール値として渡しています。その後、SELECT ueを実行して検証がtrueを返し、プロシージャが問題なく実行されたことを通知します。

以下は完全な手順です。

CREATE DEFINER=`user`@`localhost` PROCEDURE `join_event`(IN `user_id` BIGINT(64), IN `event_id` INT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER 

begin 

DECLARE ue INT; 
SET ue = EXISTS(SELECT 1 FROM users WHERE fb_uid=user_id) AND EXISTS(SELECT 1 FROM meetup WHERE meet_id=event_id) AND EXISTS(SELECT 1 FROM meetup WHERE date > NOW() AND meet_id = event_id) AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND participants <= max_participants) AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id); 

INSERT INTO meetup_participation SELECT user_id, event_id FROM DUAL WHERE ue=1; 

UPDATE users SET events_participated = events_participated + 1 WHERE fb_uid=user_id AND ue=1; 
UPDATE meetup SET participants = participants + 1 WHERE meet_id=event_id AND ue=1; 
SELECT ue AS response; 

end 

ありがとうございます。

+0

データベーステーブルから来ているフィールドとプロシージャに渡されるパラメータは、コードセグメントから分かりにくいです。これは、変数宣言でcreate procedure文を提供し、dbから来る列名の別名を付けることができれば役に立ちます。手順が長すぎない場合は、完全な手順を含めるように質問を編集します。また、私はこの2つの行が直面していることを意味していません、あなたが意味するものを記述する別の方法を見つけることができますか? –

+0

@ P.Salmon私は、「INSERT INTO SELECT」がなければ、理解を深めるためのコードを編集しました。それは、正しい値を返します。対峙は、英語で言う正しい方法ではないかもしれません。 –

+0

プロシージャーは機能します。SET events_participated = events_participated + 1およびSET参加者=参加者+ 1は、開始値nullを受け入れる必要があります。SET events_participated = ifnull(events_participated、0)+ 1 SET参加者= ifnull(参加者、0)+ 1 –

答えて

0

INSERTステートメントは、SET ue = ...ステートメントとは別に実行されます。あなたが何を達成しようとしているのか分かりませんが、コードは意味がありません。

usersテーブルの各レコードに適用されたEXISTSテストに基づいてmeetup_participationにレコードを追加する場合は、SELECTステートメントの各レコードにINSERTの一部としてテストを適用する必要があります。

また、コードには多数の構文/文法の問題があります。

この手順で達成しようとしていることについて説明できる場合は、誰かが手順をコーディングする正しい方法を提案する可能性があります。

+0

申し訳ありませんが、なぜそれが意味をなさないのかわかりません...私は質問を編集しました、おそらくそれは良いです...コードは(挿入、更新...)選択したINSERTコマンドを使用しないとselectコードが機能しません。文法/構文の問題は何ですか? PMAは私に警告しません... –

+0

ステートメントのそれぞれは、それ自身の上に立っています。セット後、ue = 1の場合、挿入の選択部分のすべてのレコードに対して1になります。 IOW、それはmeetup_participationにデュアルからのすべてのレコードを挿入します。デュアルでレコード間で変化することはありません。 2つの選択と同じです。あなたはset文の "formula"ではなく、返された値を使用しています。 –

0

ueを選択しても、手順がエラーなしで完了したかどうかはわかりません。 mysqlトランザクションとmysqlエラー処理について調べてください。 http://www.mysqltutorial.org/mysql-error-handling-in-stored-procedures/は良い出発点です。

あなたがエラーテーブルが、私はこれがあなたのサイトに適切なソリューションです示唆わけではない。この

CREATE TABLE `errors` (
    `msg` varchar(2000) DEFAULT NULL, 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 

ノートのように見えるこの

drop procedure if exists p; 
delimiter // 

CREATE DEFINER=`root`@`localhost` PROCEDURE `p`(
    IN `inue` int, 
    IN `user_id` BIGINT(64), 
    IN `event_id` INT 
) 
LANGUAGE SQL 
NOT DETERMINISTIC 
MODIFIES SQL DATA 
SQL SECURITY DEFINER 
COMMENT '' 
begin 

DECLARE ue INT; 
declare exit handler for sqlexception 
begin 
    rollback; 
    insert into errors (msg) select concat('error ' ,inue,',',user_id,',',event_id); 
end; 

set autocommit = 0; 
#set ue = inue; 
SET ue = EXISTS(SELECT 1 FROM users WHERE fb_uid=user_id) 
    AND EXISTS(SELECT 1 FROM meetup WHERE meet_id=event_id) 
    #AND EXISTS(SELECT 1 FROM meetup WHERE dt > NOW() AND meet_id = event_id) 
    AND EXISTS(SELECT 1 FROM meetup WHERE meet_id = event_id AND ifnull(participants,0) <= max_participants) 
    AND NOT EXISTS(SELECT 1 FROM meetup_participation WHERE fb_uid = user_id AND meet_id = event_id) 
    ; 
select ue; 

if ue = 1 then 

start transaction; 

INSERT INTO meetup_participation SELECT user_id, event_id,user_id, event_id; 
UPDATE users SET events_participated = ifnull(events_participated,0) + 1 WHERE fb_uid=user_id = user_id; 
UPDATE meetup SET participants = ifnull(participants,0) + 1 WHERE meet_id = event_id ; 

commit; 

end if; 

SELECT ue AS response; 

end // 

ようなもので終わるかもしれない、あなたは何をする必要があります研究とあなたのために最適なものを把握する。

関連する問題