MySQLに慣れている場合、私の質問は簡単かもしれません。私はPostgreSQL SGBDに慣れており、PL/PgSQLスクリプトをMySQLに変換しようとしています。
ここに私が持っているものがあります:
delimiter //
CREATE TRIGGER pgl_new_user
AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE m_user_team_id integer;
SELECT id INTO m_user_team_id FROM user_teams WHERE name = "pgl_reporters";
DECLARE m_projects_id integer;
DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id;
OPEN cur;
ins_loop: LOOP
FETCH cur INTO m_projects_id;
IF done THEN
LEAVE ins_loop;
END IF;
INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access)
VALUES (NEW.id, m_projects_id, now(), now(), 20);
END LOOP;
CLOSE cur;
END//
しかし、MySQL WorkbenchはDECLARE m_projects_id
。上記の2行と同じ命令を使用しているため、実際には理解できません...
ヒントはありますか?
編集:ノイバートはこのエラーを解決しました。ありがとう。
しかし、まだ、ユーザーに挿入しようとすると:
Error Code: 1329. No data - zero rows fetched, selected, or processed
アイデアはありますか?または、より良いエラーメッセージを取得する方法を知っていますか?
すべての宣言は最上位にある必要があります。すなわち。
delimiter //
CREATE TRIGGER pgl_new_user
AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE m_user_team_id integer;
DECLARE m_projects_id integer;
DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id;
SET @m_user_team_id := (SELECT id FROM user_teams WHERE name = "pgl_reporters");
OPEN cur;
ins_loop: LOOP
FETCH cur INTO m_projects_id;
IF done THEN
LEAVE ins_loop;
END IF;
INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access)
VALUES (NEW.id, m_projects_id, now(), now(), 20);
END LOOP;
CLOSE cur;
END//
DECLAREステートメントについてneubertに同意すると、構文エラーが修正されます。ただし、オープンカーソルの使用を避けることをお勧めします。カーソルが遅い可能性があります。
タスクの場合:INSERT ... SELECTステートメントを使用すると、1つのクエリのみを使用して、あるテーブルから別のテーブルにデータをコピーできます。