首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQLFiddle的存储过程和游标

使用SQLFiddle的存储过程和游标
EN

Stack Overflow用户
提问于 2014-04-29 15:54:07
回答 1查看 583关注 0票数 0

我已经开发了一个小过程,它实现了一个游标来根据部门员工的薪资更新部门的薪资。我想用SQLFiddle测试这个过程,只是因为它非常方便,但我似乎不知道怎么做。我已经将代码放在Create下面,并在Schema中插入了行。我还将查询终止符更改为双斜杠。它看起来如下:

代码语言:javascript
复制
DELIMITER //

CREATE PROCEDURE updateSalary()
BEGIN
  DECLARE emp_sal, eDno, dDno INT;
  DECLARE dep_cursor SELECT Dno FROM Department;
  DECLARE emp_cursor SELECT Dno, Salary FROM Employee;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

  open dep_cursor;
  department_loop: LOOP
    FETCH dep_cursor INTO dDno;
    IF finished = 1 THEN
      LEAVE department;
    END IF;

    open emp_cursor;

    DECLARE total_sum INT DEFAULT 0;
    employee_loop: LOOP
      FETCH emp_cursor INTO eDno, emp_sal;
      IF eDno = dDno THEN
        total_sum = total_sum + emp_sal;
      END IF;
      IF finished = 1 THEN
        update department SET total_sal WHERE department.dno = dDno;
        LEAVE employee_loop;
      END IF;
    END LOOP employee_loop;
    close emp_cursor;
  END LOOP department_loop;
  CLOSE dep_cursor;
END

DELIMITER//

我得到的错误是:

代码语言:javascript
复制
Schema Creation Failed: 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 'DELIMITER' at line 1: 

我的最后一个问题是,如何在SQLFiddle中调用这个存储过程?

谢谢

更新:这是整个模式,我已经编辑了它以使用一个斜杠来终止,并且我还更改了查询终止符。

代码语言:javascript
复制
CREATE TABLE Department (
  Dname varchar(80),
  Dno int primary key,
  Total_sal int,
  Manager_ssn int
)/


CREATE TABLE Employee (
  Name varchar(80),
  SSN int primary key,
  Salary int,
  Dno int references Department(Dno),
  Supervisor_ssn int references Employee(SSN)
)/

ALTER TABLE Department ADD FOREIGN KEY (Manager_ssn) REFERENCES Employee(SSN)/


INSERT INTO Employee VALUES ('John James', 555555555, 5000, NULL , NULL)/
INSERT INTO Department VALUES ('Finance', 20, 7000, 555555555)/
INSERT INTO Department VALUES ('Main', 30, 6000, 555555555)/
INSERT INTO Employee VALUES ('Tammy James', 222222222, 6000, 30, 555555555)/
INSERT INTO Department VALUES ('IT', 10, 3000, 222222222)/
INSERT INTO Employee VALUES ('John Jones', 111111111, 1000, 10, 222222222)/
INSERT INTO Employee VALUES ('Sally Smith', 333333333, 6000, 10, 222222222)/
INSERT INTO Employee VALUES ('Tom Jones', 444444444, 3000, 20, 555555555)/
INSERT INTO Employee VALUES ('Sue Smith', 666666666, 4000, 20, 555555555)/


CREATE PROCEDURE updateSalary()
BEGIN
  DECLARE emp_sal, eDno, dDno INT;
  DECLARE dep_cursor SELECT Dno FROM Department;
  DECLARE emp_cursor SELECT Dno, Salary FROM Employee;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

  open dep_cursor;
  department_loop: LOOP
    FETCH dep_cursor INTO dDno;
    IF finished = 1 THEN
      LEAVE department;
    END IF;

    open emp_cursor;

    DECLARE total_sum INT DEFAULT 0;
    employee_loop: LOOP
      FETCH emp_cursor INTO eDno, emp_sal;
      IF eDno = dDno THEN
        total_sum = total_sum + emp_sal;
      END IF;
      IF finished = 1 THEN
        update department SET total_sal WHERE department.dno = dDno;
        LEAVE employee_loop;
      END IF;
    END LOOP employee_loop;
    close emp_cursor;
  END LOOP department_loop;
  CLOSE dep_cursor;
END;
/

当我试图构建模式时,收到的新错误是:

代码语言:javascript
复制
Schema Creation Failed: 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 'SELECT Dno FROM Department;
  DECLARE emp_cursor SELECT Dno, Salary FROM Employe' at line 4: 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-29 16:55:55

使用;以外的查询终止符。

使用左边的第四个按钮选择它,旁边是Browser按钮。

请单击此链接查看如何在SqlFiddle:http://sqlfiddle.com/#!2/db743/1中创建和运行http://sqlfiddle.com/#!2/db743/1过程。

在这个演示中,我使用了/查询终止程序。

代码语言:javascript
复制
CREATE TABLE x( x int )/

INSERT INTO x VALUES(1),(2),(3)/

CREATE PROCEDURE update_salary()
BEGIN
  UPDATE x SET x = x + 100;
END;
/

==========编辑=================

我在处理语法错误时使用了以下过程:

消息说,错误发生在第4行:

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法使用“选择Department;在第4行:上声明emp_cursor选择Dno,来自雇主的薪资”

首先,我在程序中给行编号:

代码语言:javascript
复制
1. CREATE PROCEDURE updateSalary()
2. BEGIN
3.   DECLARE emp_sal, eDno, dDno INT;
4.   DECLARE dep_cursor SELECT Dno FROM Department;

这句话似乎是错的:DECLARE dep_cursor SELECT Dno FROM Department;

要检查这一行的语法,我使用以下检查工具:检查工具

这个工具向这里展示了正确的语法应该是:

代码语言:javascript
复制
DECLARE cursor_name CURSOR FOR select_statement

然后,我使用以下方法更正代码:

代码语言:javascript
复制
 4.   DECLARE dep_cursor CURSOR FOR SELECT Dno FROM Department;

并再次编译代码。

现在它显示了第5行中的下一个错误:

检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在第5行使用“SELECT Dno,Employee;END‘

所以我重复第5行的上述步骤.以此类推等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23369551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档