2013-04-05 36 views
10

Câu hỏi của tôi có thể đơn giản cho bạn, nếu bạn quen với MySQL. Tôi đã quen với PostgreSQL SGBD và tôi đang cố dịch một tập lệnh PL/PgSQL sang MySQL.Khai báo biến kích hoạt MySQL

Dưới đây là những gì tôi có:

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// 

Nhưng MySQL Workbench mang lại cho tôi một lỗi trên DECLARE m_projects_id. Tôi thực sự không hiểu vì tôi có cùng một hướng dẫn hai dòng ở trên ...

Bất kỳ gợi ý nào?

EDIT: neubert đã giải quyết lỗi này. Cảm ơn.

Nhưng chưa, khi tôi cố gắng để chèn vào người sử dụng:

Error Code: 1329. No data - zero rows fetched, selected, or processed 

Bạn có bất cứ ý tưởng? Hoặc tốt hơn, bạn có biết làm thế nào tôi có thể nhận được một thông báo lỗi tốt hơn?

+1

Hãy xem tại đây: http://dba.stackexchange.com/questions/25405/event-scheduler-no-data-zero-rows-fetched-selected-or-processed –

Trả lời

16

Tất cả các DECLARE cần phải ở trên cùng. I E.

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// 
+0

Phải! Điều đó thực sự giải quyết vấn đề của tôi (trong pgsql, bạn không thể 'DECLARE' trước' BEGIN', gần như giống nhau). Tôi đã gặp lỗi khác với tập lệnh này: 'Mã lỗi: 1415. Không được phép trả lại tập kết quả từ trình kích hoạt'. Tôi đã thay thế 'SELECT' đầu tiên và tôi đã giải quyết nó. Nhưng sau đó, nó vẫn không hoạt động. Nếu bạn muốn giúp tôi, tôi đã chỉnh sửa bài đăng của mình. – Arthur

+1

Thử thay thế 'SELECT @ m_user_team_id' bằng' SET @m_user_team_id: = '. Tôi đã cập nhật bài đăng của mình. – neubert

+0

chỉ cần lưu ý: "BEGIN DECLARE m_user_team_id integer;" -> để nhớ sử dụng DECLARE ở đầu mã –

1

Đồng ý với neubert về câu lệnh DECLARE, điều này sẽ khắc phục lỗi cú pháp. Nhưng tôi khuyên bạn nên tránh sử dụng con trỏ mở, chúng có thể chậm.

Đối với tác vụ của bạn: sử dụng lệnh INSERT ... SELECT sẽ giúp bạn sao chép dữ liệu từ bảng này sang bảng khác bằng cách sử dụng một truy vấn.

INSERT ... SELECT Syntax.