大家好,我是mysql 新学者,我写了一个function 编译总是提示语法错误,甚至我把全部行都注释掉也是错误,大家谁指点一下哪里错了?
CREATE DEFINER = CURRENT_USER FUNCTION `getCategoryPath`(
catid INTEGER
)
RETURNS VARCHAR(255)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare path varchar(255) ;
--if catid=0 then
-- set path='';
--else
-- declare catname varchar(255);
-- declare parentid INTEGER;
-- select cat_name INTO catname, parent_id into parentid
-- from 365mask_category where cat_id = catid;
-- set path=getCategoryPath(parentid)+'>'+catname;
--end if;
RETURN path;
END ;
CREATE DEFINER = CURRENT_USER FUNCTION `getCategoryPath`(
catid INTEGER
)
RETURNS VARCHAR(255)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare path varchar(255) ;
--if catid=0 then
-- set path='';
--else
-- declare catname varchar(255);
-- declare parentid INTEGER;
-- select cat_name INTO catname, parent_id into parentid
-- from 365mask_category where cat_id = catid;
-- set path=getCategoryPath(parentid)+'>'+catname;
--end if;
RETURN path;
END ;
解决方案 »
- mysql中eximstats这个数据库
- 利用游标更新表,效率问题,急!!!!
- 我一个MYSQL数据库,平均在线人数150人 13个小时锁表2113000 次
- 这个循环的sql怎么样能提高效率?
- 关于MYSQL触发器的使用
- left join 怎么排序 谁知道啊?详细问题见贴内
- 求一字符串中的最小值
- MySQL中连接不了,出现host 'localhost' is not allowed to connect to this MySQL server
- 如何使用LOAD DATA LOCAL INFILE ?
- 求大神帮我优化下改改mysql sql语句
- var字段存日期,如果改成INT会怎么样?
- mysql正则表达式替换html标签
CREATE FUNCTION `getCategoryPath`(
catid INTEGER
)
RETURNS VARCHAR(255)
BEGIN
DECLARE catname VARCHAR(255);
DECLARE parentid INTEGER;
DECLARE path VARCHAR(255) ;
IF catid=0 THEN
SET path='';
ELSE
SELECT cat_name , parent_id INTO catname,parentid
FROM 365mask_category WHERE cat_id = catid;
SET path=CONCAT(getCategoryPath(parentid),'>',catname);
END IF;
RETURN path;
END $$;
递归查询?
mysql> CREATE FUNCTION `getCategoryPath`(
-> catid INTEGER
-> )
-> RETURNS VARCHAR(255)
-> NOT DETERMINISTIC
-> CONTAINS SQL
-> SQL SECURITY DEFINER
-> COMMENT ''
-> BEGIN
-> declare path varchar(255) ;
-> -- if catid=0 then
-> -- set path='';
-> -- else
-> -- declare catname varchar(255);
-> -- declare parentid INTEGER;
-> -- select cat_name INTO catname, parent_id into par
entid
-> -- from 365mask_category where cat_id = catid;
-> -- set path=getCategoryPath(parentid)+'>'+catname;
-> -- end if;
-> RETURN path;
-> END //
Query OK, 0 rows affected (0.28 sec)mysql>
mysql> DELIMITER ;
mysql>
但是,创建成功后,运行函数,却得不到需要的结果,select getCategoryPath(0),可以得到空字符串,非0参数,总是没有任何返回值(数据没问题),我怀疑是递归的问题,但是没法确定。于是我把递归改成了循环,如下所示,但是也总是不能正确返回值。BEGIN
declare path varchar(255);
declare catname varchar(50);
set path='';
WHILE catid > 0 DO
select parent_id, CONCAT(catname,'>',path) into catid, path
from 365mask_category where cat_id = catid;
END WHILE; RETURN path;
END;这样改之后,同样返不回需要的值。郁闷死了,这个问题搞了快一天了。在MS sqlserver里,类似这样写没有任何问题的,在MYSQL里,不知道哪里错了
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
[ID] [int] IDENTITY(0,1) NOT NULL,
[CategoryName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[PID] [int] NULL CONSTRAINT [DF_Categories_PID] DEFAULT ((0)),
[Path] [nvarchar](1000) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]GO
USE [mytb]
GO
ALTER TABLE [dbo].[Categories] WITH CHECK ADD CONSTRAINT [FK_Categories_Categories] FOREIGN KEY([PID])
REFERENCES [dbo].[Categories] ([ID])GOInsert into Categories(CategoryName) values('Root')
insert into Categories(CategoryName,pid) values('Animals',0)
insert into Categories(CategoryName,pid) values('Cat',1)
insert into Categories(CategoryName,pid) values('Dog',1)
insert into Categories(CategoryName,pid) values('Plants',0)
insert into Categories(CategoryName,pid) values('Vegetables',4)
insert into Categories(CategoryName,pid) values('Tomato',5)goCREATE FUNCTION [dbo].[getCategoryPath]
(
-- Add the parameters for the function here
@id int
)
RETURNS nvarchar(1000)
AS
BEGIN
-- Declare the return variable here
DECLARE @path nvarchar(1000)
-- Add the T-SQL statements to compute the return value here
set @path=''while @id>0
begin
SELECT @id=pid,@path=categoryname+' > '+@path from Categories where id=@id
end
select @path=categoryname+' > '+@path from Categories where id=0return @path
END
goupdate categories set path=dbo.getCategoryPath(id)select * from categories-----------以下是表结果----------
-id------类名-------父ID----路径----------------
0 Root 0 Root >
1 Animals 0 Root > Animals >
2 Cat 1 Root > Animals > Cat >
3 Dog 1 Root > Animals > Dog >
4 Plants 0 Root > Plants >
5 Vegetables 4 Root > Plants > Vegetables >
6 Tomato 5 Root > Plants > Vegetables > Tomato >
原谅我的MYSQL语法不熟悉,写出同样的建表和填充数据语句有点困难,如果需要,你们可以用我上面的T-sqL稍改一下。我的MYSQL版本是5.1.
CREATE DEFINER = CURRENT_USER FUNCTION `getCategoryPath`(
catid INTEGER
)
RETURNS VARCHAR(255)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare path varchar(255) ;
-- if catid=0 then
-- set path='';
-- else
-- declare catname varchar(255);
-- declare parentid INTEGER;
-- select cat_name INTO catname, parent_id into parentid
-- from 365mask_category where cat_id = catid;
-- set path=getCategoryPath(parentid)+'>'+catname;
-- end if;
RETURN path;
END ;
用-- 注释的时候,后面要带一个空格。