繁体   English   中英

我在以下 SQL 代码中做错了什么?

[英]What am I doing wrong in the following SQL code?

SQL> set serverout on
SQL> CREATE PROCEDURE find employees
  2  BEGIN
  3  if Department_ID < 50 from Employees
  4  THEN
  5  RETURN select Employee_ID, First_Name, Last_Name, Department_ID from Employees where Department_ID < 50;
  6  ELSE
  7  RETURN select Employee_ID, First_Name, Last_Name, Department_ID from Employees where Department_ID > 50;
  8  END IF;
  9  /
Warning: Procedure created with compilation errors.

这没有任何意义。

Return 只能返回整数,仅用于返回错误代码。

这也是两种不同方式对 If 的错误使用。 你从哪里得到 Department_id 的值? 并在您离开时查找 If 的语法。 当然,您在实际存储的过程中不会有行号。

用空格命名 proc 是一种糟糕的做法,不要这样做。

我可以看到许多问题(假设每个标签是 MS-SQL):

  1. 由于空间原因, find employees不是有效的过程名称。 要绝对强制它接受空格(警告:坏主意!!),您可以将其括在括号中,例如[find employees]但我肯定会推荐诸如find_employees东西。

  2. 你缺少一个END来表示你的过程结束。

  3. 您不在存储过程中使用RETURN ,只能在函数内部使用。 您是否试图将结果集传递给调用它的任何对象(在这种情况下,您需要一个“表值函数”)? 还是只显示结果?

  4. 你想传入Department_ID吗? 换句话说,每次运行时给它一个不同的Department_ID 在这种情况下,您将需要一个@Department_ID参数或其他东西。 或者它是从桌子上得到的?

  5. 我无法理解你的商业逻辑,这毫无意义。 为什么要返回两个不同的员工列表? 您是否要计算每个部门有多少员工? 这是某种“分页”逻辑(一次仅检索 50 名员工)吗?

  6. 您的IF语法已经过时了。 应该是IF @Department_ID < 50 (对于参数)或者IF (SELECT COUNT(*) FROM Employees WHERE Department_ID = @Department_ID) > 50东西,但同样,我很难弄清楚你想做什么。

  7. SQL 不使用END IF 查找单行 IF ELSE 语句和多行 IF ELSE 语句的语法。

警告:创建的过程有编译错误。

是的。

CREATE 语句没有 END ......没有 Department_id 的定义......没有为 IF 语句声明的参数可以处理......函数名称中有一个空格......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM