Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103704021
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-03-24 21:29:02

二、创建存储过程
 
语法:

CREATE [DBA] PROCEDURE 过程名(参数[, 参数 [ ,...]]  )
                   RETURNING 子句
                        语句块
                  END   PROCEDURE 
                  document  子句
                  WITH   LISTING   IN 文件名

过程名说明创建的存储过程的名字
参数说明调用该存储过程所需的参数个数和类型
一个存储过程可以不返回任何值,或返回一个或多个值,也可返回多组值。
返回多组值的存储过程称之为游标式存储过程,对该类存储过程,相应调用函数需作一些特殊处理。
 

例子:
假设建立一个脚本名为proc1231.sql的文件,内容如下:
 
create procedure proc1231()
returning int;
return 2007;
end procedure
--end procedure后面不能加分号(;),否则会报语法错误
document
'this is a new procedure'
--这里也不能加分号(;),ducoment子句需加双引号或单引号。
with listing in '/export/home/user/pro.log';
--最后可以加分号(;),也可以不加
 
 
存储过程中的语句块由SPL语句和SQL语句组成,但不包含下面的SQL语句

CREATE DATABASE
DATEBASE
CLOSE DATEBASE
CHECK TABLE
REPAIR   INFO   OUTPUT   LOAD   UNLOAD
CREATE PROCEDURE
CREATE PROCEDURE FROM
 
document子句对存储过程做一些说明,可省略。
WITH LISTING IN 选项说明接受编译器输出信息的文件名,如省略, 则编译器不产生输出。
 

向存储过程中传递变量
create procedure procname(var_num integer default null)
delete from proctable where colno=var_num;
end procedure;

execute procedure procname(11);
 
 

return语句
从存储过程中返回0个或多个值
RETURN 语句说明的返回值的个数和类型必须与创建存储过程时说明的返回值的个数和类型一致,或者不返回任何值,在后一情形下,所有的返回值为空值。
WITH  RESUME子句将保证存储过程继续执行,所有的变量均保持原有的值。该子句用于返回多组值,比如循环语句中。
 
create procedure proc_new()
returning int,int;
define num1;
define num2;
.....
....
return num1,num2;
end procedure;
 
 

从SQL中调用存储过程
select * from users
where number=proc_new(23);
 
 

call语句
 
从一个存储过程中调用另一个存储过程
 
两种格式:
CALL 过程名(参数, ...) RETURNING 变量,...;
CALL 过程名(参数名=参数, ...) RETURNING 变量,...;
 
 
说明:
参数可以是SPL表达式或是SELECT语句,只要该语句返回单值,并且具有适当的类型和长度。
如果参数个数多于被调用的存储过程的参数,则返回错误。
如果参数个数少于被调用的存储过程的参数,则未说明的参数被初始化为其缺省值(该值在创建存储过程时说明)若无缺省值, 则返回错误。
RETURNING 子句说明的变量用于接收被调用存储过程的返回值,如无返回值, 则可省略。
 
 
例如:
define var_no1 int;
call proc_new(22)  returning var_no1;

阅读(1446) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~