存储过程。
一、概述。存储过程(stored procedure)应用在大型数据库系统中,是sql语句和流程控制语句的集合,经编译后存储在数据库系统中,用户通过指定存储过程的名字并给出参数(如果带有参数的话)来执行,类似高级语言中的函数。在创建时编译一次,以后执行时运行很快。
存储过程的种类:
1系统存储过程,以sp_开头,用来进行系统的各项设定,取得信息及相关管理工作如 sp_help就是取得指定对象的相关信息。
2本地存储过程,由用户创建的存储过程,一般所说的存储过程就是指本地存储过程。
3扩展存储过程,以xp_开头,用户可以使用外部程序语言编写的存储过程,用来调用操作系统提供的功能。
存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般sql语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行update,insert,query,delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
存储过程的缺点:
1. 调试麻烦。
2. 移植问题,与具体数据库相关,需要考虑移植问题。在梅安森项目中需要考虑从sql server到postgresql移植工作。
3. 如果在应用程序中大量使用存储过程时,到程序交付给客户的时候,需要考虑系统的相关问题,维护代价大。
二、存储过程的常用格式:
-创建存储过程,create proc or procedure sp_name
[参数名][类型],@参数名][类型][output]
with]as
beginsql_statement
end-调用存储过程。
exec sp_name[参数名]
-删除存储过程。
drop procedure sp_name
解释: output:表示此参数是可传回的。
with recompile:表示每次执行此存储过程时都重新编译一次。
encryption:所创建的存储过程的内容会被加密。
三、各种常见数据库对存储过程的支持。
大多数常用数据都支持存储过程,但是各类数据库都有自己的过程语言或者语法格式,也就是访问不同类型的数据库,需要考虑移植问题。下面简单描述了各种常见数据库中使用存储过程的语法格式。
mysql:
1.创建存储过程,create procedure ******proc (out param1 int),参数类型(in、out、 inout)
2.调用存储过程,call ******proc
sql server: sql server数据库提供的过程语言是transact-sql,简称t-sql。
1.创建语法。
create proc | procedure pro_name
[ [默认值] [output], 默认值] [output],.
[ with ]
assql_statements
2.调用、执行, exec pro_name
oracle: oracle数据库提供工程语言pl/sql来构建存储过程。
1.创建存储过程语法:
create [or replace] procedure procedure_name
([arg1 [ in | out | in out ]]type1 [default value1],[arg2 [ in | out | in out ]]type2 [default value1]],argn [ in | out | in out ]]typen [default valuen])
authid definer | current_user ]
《声明部分》
begin《执行部分》
exception
《可选的异常错误处理程序》
end procedure_name;
2.调用存储过程, execute | exec procedure_name(param1,param2);
postgresql: postgresql数据库提供多种过程语言,pl/pgsql, pl/tcl, pl/perl, pl/python,下面是pl/gpsql过程语言的一个示例。
--创建表。
create table test(id int,name text);
--创建存储过程。
create function ins_data_test1(int,text) returns bool as'
declare
id alias for $1;
name alias for $2;
begininsert into test values(id,name);
return true;
end;'language 'plpgsql'
--执行存储过程。
select ins_data_test1(1,'shengch');
四、postgresql的存储过程及示例。
4.1 介绍。
在oracle数据库中,存储过程和函数统称为pl/sql子程序,他们的唯一区别是函数总向调用者返回数据,而过程则不返回数据,过程的参数可以有三种模式(in、out、in out),而函数只有一种(in)。
而在postgresql数据库中不区分函数和存储过程,或者说它把存储过程当做函数来处理,因此在用pl/gpsql创建的存储过程中,必须返回数据,类型可以为void。
4.2 示例。
需求:给出如下条件进行批处理编排。
- 开始日期时间。
- 重复间隔(分钟)
- 重复次数。
要求在档期内重复安排节目播出, 比如: 2003.01.01 08:00 开始每隔240分钟。
播出一次, 一共播出100次, 或者用户自行设定的其他时间。
数据库**(co_schedule)
n_progid int
dt_starttime timestamp
dt_endtime timestamp
-创建表。create table co_schedule(n_progid int,dt_starttime timestamp,dt_endtime timestamp);
-创建函数(存储过程)
create function add_program_time(int4,timestamp,int4,int4,int4) returns bool as '
declare
prog_id alias for $1;
duration_min alias for $3;
period_min alias for $4;
repeat_times alias for $5;
i int;
starttime timestamp;
ins_starttime timestamp;
ins_endtime timestamp;
beginstarttime :=2;
i :=0;
while i ins_starttime :=starttime;
ins_endtime :=timestamp_pl_interval(ins_starttime, cast(duration_min ||mins'' as interval));
starttime :=timestamp_pl_interval(ins_starttime, cast(period_min ||mins'' as interval));
insert into co_schedule values(prog_id,ins_starttime,ins_endtime);
i :=i+1;
end loop;
if i return false;
elsereturn true;
end if;
end;language 'plpgsql';
-执行存储过程。
select add_program_time(1,'2002-10-20 0:0:0','5','120','5');
五、pl/pgsql概述。
pl/pgsql 是 postgresql 数据库系统的一个可加载的过程语言。pl/pgsql 的设计目标是创建一种可加载的过程语言,可以。
用于创建函数和触发器过程。
为 sql 语言增加控制结构。
执行复杂的计算。
继承所有用户定义类型、函数、操作符。
定义为被服务器信任的语言。
容易使用。具体的语法规则请参看postgresql的用户手册。
存储过程格式
过程的命名,一般是目标表名前加p 比如目标表是table 01,则过程名字是p table 01。一个过程可以有若干个插入语句,插入语句之后,不要忘记commit.我们只拿一个的举例子。过程中用到的表都是提前建好的。一般不在过程中建表。表名也可以。作为输入参数,如果表名作为输入参数,则对该表的操作,...
Oracle高级编程 存储过程
存储过程 pl sql提供了三种判断语句。1 if then 2 if then else 3 if then else if else 编写一个存储过程输入员工号,如果该员工初始的工资小于1200,则给其增加10 j a程序调用procedure 循环语句 1 loop是pl sql中最简单的循环...
存储过程语法集锦 经典
1 create or replace procedure 存储过程名。2 is3 begin 4 null 5 end 行1 create or replace procedure 是一个sql语句通知oracle数据库去创建一个叫做skeleton存储过程,如果存在就覆盖它 行2 is关键词表明...