表:student(学生表)
有三列,分别为:S_NAME(学生姓名),S_AGE(学生年龄),S_SEX(学生性别);
需求:查出给定年龄和性别的所有学生姓名,并用“;”拼接返回。
函数代码:
CREATE FUNCTION GET_ALL_NAME_BY_PARA(@SEX VARCHAR(32),@AGE int)
RETURNS VARCHAR(1000) AS
BEGIN
DECLARE @NAME VARCHAR(10)
DECLARE @OUTP_ARA varchar(1000)
DECLARE GET_NAME CURSOR FOR SELECT S_NAME FROM student WHERE S_SEX=@SEX AND S_AGE=@AGE
OPEN GET_NAME
FETCH GET_NAME INTO @NAME
WHILE @@sqlstatus != 2
BEGIN
SET @outPara=@outPara || ';' || @NAME
FETCH GET_NAME INTO @NAME
END
CLOSE GET_NAME
DEALLOCATE GET_NAME
IF(DATALENGTH(@NAME)>0)
BEGIN
SET @OUTP_ARA=SUBSTRING(@NAME,0,DATALENGTH(@NAME)-1)
END
RETURN @OUTP_ARA
END
解释:
1:所有的参数和变量都要以@开头;
2:所有的临时变量都要用declare来声明,包括有表;
3:变量的赋值用set和=号来实现;
4:返回结果,需要用return 来返回;
5:GET_ALL_NAME_BY_PARA为创建函数的名字;
6:@SEX和@AGE 分别为函数的两个输入参数;
7:@NAME和@OUTP_ARA为两个临时变量;
8:当从表中查询数据,并将返回值赋值给变量时,可能有几种情况。
A:可以保证一个查询SQL的结果只有一条数据的话。
可以用直接使用SELECT @NAME=S_NAME FROM student WHERE S_SEX=@SEX AND S_AGE=@AGE来查询并将结果赋值给临时变量。
B:查询结果有多条,但是只需要取其中的随便一条(这个例子中不太合理,实际中会有这样的需求)。
可以用 SELECT @NAME=TOP 1 S_NAME FROM student WHERE S_SEX=@SEX AND S_AGE=@AGE
C:循环查出所有的数据,这时候就要用到游标来实现循环。代码如示例中的。
显示声明创建游标
DECLARE 游标名称 CURSOR FOR 查询语句 //创建游标
OPEN GET_NAME //打开游标
FETCH 游标 名称 INTO @NAME //将结果赋值
WHILE @@sqlstatus != 2 //循环操作
BEGIN
SET @outPara=@outPara || ';' || @NAME
FETCH GET_NAME INTO @NAME
END
CLOSE GET_NAME //关闭游标
DEALLOCATE GET_NAME //销毁游标
本文通过一个示例介绍了如何在Sybase数据库中使用函数查询特定年龄和性别的学生姓名,并将结果用';'拼接。讨论了不同查询结果情况下的处理方式,包括直接赋值、选取第一条数据及使用游标进行循环查询。

4014

被折叠的 条评论
为什么被折叠?



