【问题标题】:SQL - Procedure functionSQL - 过程函数
【发布时间】:2019-11-20 14:57:19
【问题描述】:

试图在employee_details 中创建一个过程来(插入、删除和更新)值。

CREATE DEFINER=`root`@`localhost` ALTER PROCEDURE `alter_employeedetails`(in employee_id int(11), employee_name VARCHAR(30), employee_join_date date, 
employee_desgination varchar(30), employee_salary bigint(20), employee_address varchar(30), 
employee_contact varchar(30), employee_email_id varchar(30)
BEGIN
IF @StatementType = 'Insert'
BEGIN
insert into employee_details values
(employee_id, employee_name, employee_join_date, employee_desgination, employee_salary, employee_address, employee_contact, employee_email_id)
END
IF @StatementType = 'Update'
BEGIN
UPDATE employee_details SET
(employee_name = @employee_name, employee_join_date = @employee_join_date, employee_designation = @employee_desgination, 
employee_salary = @employee_salary, employee_address = @employee_address, employee_contact = @employee_contact, employee_email_id = @employee_email_id)
WHERE employee_id = @employee_id
END 
else IF @StatementType = 'Delete'
BEGIN
DELETE FROM employee_details where employee_id = @employee_id
END
end

【问题讨论】:

  • 每个语句都必须终止,你不需要在 if 语句中开始 end 语句,每个 if 都必须有一个 THEN 和 END IF,CREATE 和 ALTER 不应该一起出现。错误的括号 set 语句(不应该是),Elseif 不是 else if。 - 请阅读手册。 (你可能没有设置分隔符)

标签: mysql sql procedure


【解决方案1】:

该代码中有不少错误...

  • 您忘记在所有参数前加上“@”符号。
  • 忘记包含“@StatementType”作为参数。
  • 更新有括号。
  • 您不能指定 int(11) (employee_id) 或 bigint(20) (薪水)。它是 int / bigint (您没有指定长度 对于 int/bigint 数据类型)。薪水和bigint一样正确吗? MSSQL有“钱” 数据类型,或者您可以使用 decimal(8,2) 或类似的东西。你 可能是将工资乘以 100 以移动小数位 我都知道吗?
  • 插入时,是否真的要插入员工 ID?这通常是一个自动递增的主键
  • 插入语句缺少您正在填充的字段。如果使用您指定的“值”关键字,则为必需。

希望这更接近你想要的。

ALTER PROCEDURE alter_employeedetails 
    (@StatementType as varchar(25), @employee_id int, @employee_name VARCHAR(30), @employee_join_date date, 
    @employee_designation varchar(30), @employee_salary bigint, @employee_address varchar(30), 
    @employee_contact varchar(30), @employee_email_id varchar(30)) 
AS
BEGIN
    IF @StatementType = 'Insert'
    BEGIN
        insert into employee_details 
        (employee_id, employee_name, employee_join_date, employee_designation, employee_salary, employee_address, employee_contact, employee_email_id)
        values
        (@employee_id, @employee_name, @employee_join_date, @employee_designation, @employee_salary, @employee_address, @employee_contact, @employee_email_id)
    END
    ELSE IF @StatementType = 'Update'
    BEGIN
        UPDATE employee_details 
        SET
            employee_name = @employee_name, 
            employee_join_date = @employee_join_date, 
            employee_designation = @employee_designation, 
            employee_salary = @employee_salary, 
            employee_address = @employee_address, 
            employee_contact = @employee_contact, 
            employee_email_id = @employee_email_id
        WHERE employee_id = @employee_id
    END 
    ELSE IF @StatementType = 'Delete'
    BEGIN
        DELETE FROM employee_details where employee_id = @employee_id
    END
END

【讨论】:

  • 该问题被标记为“mysql”,但您的回答似乎是 Microsoft SQL Server。 MySQL 在过程参数之前不使用@ sigil。
  • 公平点 - 我没有看到 MySql 标签!希望 Shreya 可以将他的 MySql 知识与我的答案结合起来,并得到一些工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多