当前位置: 首页 > 知识库问答 >
问题:

创建存储过程MySQL时出错

高英彦
2023-03-14

我想使用phpmyadmin在MySQL数据库中进行存储过程。

几分钟后,我在“创建过程”对话框中键入并按下GO,我的语法出现了错误。

我在谷歌上搜索过哪一个是错的,但仍然没有找到。请任何人给我一些建议如何解决这个问题。

这是我的MySQL存储过程查询。

DELIMITER $$
BEGIN
IF cek=1 THEN
    SELECT a.NIK AS NIK
            , a.EmployeeName AS EmployeeName
            , a.Position AS Position
            , b.TypeName AS EmployeeType
            , TIME(c.EventTime) AS Datang
            , (CASE WHEN a.TypeID=3 THEN 
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM MST_Shift 
                    WHERE ShiftID=(SELECT ShiftID FROM SCH_Shifting WHERE NIK=a.NIK AND DATE(ShiftDate)=DATE(sdate)
                    AND IsActive=1 AND IsDeleted=0))
                    THEN 'Late' ELSE 'On Time' END)
              WHEN a.TypeID=1 OR a.TypeID=2 THEN
                    (CASE WHEN TIME(c.EventTime)>'08:15:00' THEN 'Late' ELSE 'On Time' END)
              WHEN a.TypeID=6 OR a.TypeID=7 THEN
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM MST_Shift
                    WHERE TypeID=a.TypeID LIMIT 1) THEN 'Late' ELSE 'On Time' END)
              WHEN a.TypeID=5 THEN
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM MST_Shift
                    WHERE ShiftID=(CASE WHEN DAYOFWEEK(sdate)=7 THEN 12 ELSE 11 END)) THEN 'Late' ELSE 'OnTime' END)
              WHEN a.TypeID=4 THEN
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM SCH_Special
                    WHERE NIK=a.NIK AND DATE(AbsenceDate)=DATE(sdate) AND IsDeleted=0) THEN 'Late' ELSE 'OnTime' END)
              ELSE 'Undefined' END) AS Description
    FROM MST_Employee a
    INNER JOIN MST_EmployeeType b ON b.TypeID=a.TypeID
    INNER JOIN VW_AttendanceIN c ON a.NIK=c.NIK
    WHERE DATE(c.EventTime)=DATE(sdate)
    GROUP BY b.TypeName
            , a.Position
            , a.EmployeeName;
ELSE
    SELECT a.NIK AS NIK
            , a.EmployeeName AS EmployeeName
            , a.Position AS Posisi
            , b.TypeName AS Tipe
            , TIME(c.EventTime) AS Datang
            , (CASE WHEN a.TypeID=3 THEN 
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM MST_Shift 
                    WHERE ShiftID=(SELECT ShiftID FROM SCH_Shifting WHERE NIK=a.NIK AND DATE(ShiftDate)=DATE(sdate)
                    AND IsActive=1 AND IsDeleted=0))
                    THEN 'Late' ELSE 'On Time' END)
              WHEN a.TypeID=1 OR a.TypeID=2 THEN
                    (CASE WHEN TIME(c.EventTime)>'08:15:00' THEN 'Late' ELSE 'On Time' END)
              WHEN a.TypeID=6 OR a.TypeID=7 THEN
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM MST_Shift
                    WHERE TypeID=a.TypeID LIMIT 1) THEN 'Late' ELSE 'On Time' END)
              WHEN a.TypeID=5 THEN
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM MST_Shift
                    WHERE ShiftID=(CASE WHEN DAYOFWEEK(sdate)=7 THEN 12 ELSE 11 END)) THEN 'Late' ELSE 'OnTime' END)
              WHEN a.TypeID=4 THEN
                    (CASE WHEN TIME(c.EventTime)>(SELECT TimeIn FROM SCH_Special
                    WHERE NIK=a.NIK AND DATE(AbsenceDate)=DATE(sdate) AND IsDeleted=0) THEN 'Late' ELSE 'OnTime' END)
              ELSE 'Undefined' END) AS Description
    FROM MST_Employee a
    INNER JOIN MST_EmployeeType b ON b.TypeID=a.TypeID
    INNER JOIN VW_AttendanceIN c ON a.NIK=c.NIK
    WHERE DATE(c.EventTime)=DATE(sdate)
    AND b.TypeID=type
    AND (a.NIK LIKE '%'+search+'%' OR a.EmployeeName LIKE '%'+key+'%')
    GROUP BY b.TypeName
            , a.Position
            , a.EmployeeName;
END IF;
END$$

我有这样的错误

处理您的请求:

以下查询失败:"CREATE DEFINER=root@%PROCEDUREUSP_SelectAttendance(INcekBIT(1), INtypeINT, INsdateDATETIME, INsearchVARCHAR(100))Not DETERMINISTIC CONTAINSSQLSQL安全定义......

MySQL说:#1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以在'$BEGIN IF cek=1附近使用正确的语法,然后选择a. NIK AS NIK, a.员工姓名AS'在第1行

此外,当我在SQL中运行“SELECT”查询时,它可以正常工作。

错误出现在存储过程创建中。

PS:我为糟糕的英语感到抱歉

共有1个答案

柳高卓
2023-03-14

改变:

...
AND (a.NIK LIKE '%'+search+'%' OR a.EmployeeName LIKE '%'+key+'%')
...

通过:

...
AND (a.NIK LIKE CONCAT('%',search,'%') OR a.EmployeeName LIKE CONCAT('%',`key`,'%'))
...

SQL小提琴演示

 类似资料:
  • 我正试图在MySQL中创建一个存储过程,但我一直收到错误消息 #1064年的今天,您的SQL语法出现错误;查看与您的MariaDB服务器版本对应的手册,以了解第1行“DELIMITER”附近使用的正确语法 预期分隔符。(在位置10的“”附近) 我做错了什么?编辑:去掉错误后,现在我的程序只是插入空值,知道为什么吗?

  • MySQL 存储过程是一些 SQL 语句的集合,比如有时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。 编写存储过程并不是件简单的事情,但是使用存储过程可以简化操作,且减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此应该尽可能的学会使用存储过程。 下面主要介绍如何创建存储过程。 可以使用

  • 问题内容: 这让我发疯。 还给我 那将是线 怎么了 我尝试了一些小的更改,但总是收到相同的错误。我检查了文档,但看不到语法错误。我知道这是一个愚蠢的错误,但是我坚持了大约半个小时。是一个游标,它迭代每一行并为每一行执行一个存储过程;我已经用存储函数完成了它(它的工作原理很像魅力),但是在服务器上发布时,我看到我的共享主机不支持存储函数,只支持存储过程:(因此,这是我最好的方法我发现了。 问题答案:

  • 我试图创建一个存储过程,但不断出现错误: #1064年的今天,您的SQL语法出现错误;查看与您的MySQL服务器版本对应的手册,以了解第3行“NOT DETERMINISTIC CONTAINS SQL SECURITY DEFINER COMMENT”“B”附近使用的正确语法 我的SQL如下: 我尝试过包含分隔符,但没有结果。我想问题可能出在引号里。有人能给我指出解决办法吗?谢谢 MySQL 5

  • 我正在尝试使用文本文件的内容在MySQL数据库中创建存储过程: 我使用本机查询执行SQL: 但是它在DROP PROCEDURE上得到一个错误我注释了DROP PROCEDURE,然后它在DELIMITER上得到一个错误基本上,它在第一个分号之后的任何一行上都得到一个错误。 似乎JPA hibernate正在解析我的查询并告诉我它有问题,而不是将纯文本传递到MySQL。 sql在MySQL中运行,

  • 为了解决MySql中的问题,即某些语句只允许在我试图创建的存储过程中运行,然后在JdbcTem板提交的sql中删除存储过程。一个简单的例子是(这恰好是在Spring引导中): cript.sql在哪里 在mySql workbench中运行它可以很好地工作,但是由JdbcTemplate提交时会出现错误 据我所知,这是因为JdbcTemplate不允许使用那些