简单的存储过程实例
‘壹’ 急求!怎么建立oracle存储过程(实例)
create or replace PROCEDURE st_receipt(p_sheetid varchar2(16))
AS
BEGIN
insert into receipt select * from receipt0 where sheetid=p_sheetid ; --将 receipt0表中数据插入 receipt
update receipt set Flag=100 wheresheetid=p_sheetid; --更新receipt表中Flag值
insert into ReceiptItem select * from ReceiptItem0 where sheetid=p_sheetid ;
delete from ReceiptItem0 where sheetid=p_sheetid ;--删除ReceiptItem0表数据
delete from receipt0 where sheetid=p_sheetid ; --删除 receipt0表数据
end ;
exec st_receipt('ys141128')
‘贰’ 数据库中的存储过程到底是什么能不能举个详细的例子
存储过程,实际就是一段写在数据库中的代码。。
由于此段数据库操作代码由服务器完成,而客户端只是进行简单的参数提交,所以,可以有效的利用服务器的强劲而减小对客户机的负合。
如:你想插入一条数据到数据库。
虽然你的要求是,先检查表里面是否己存在该项。
如果不存在就Insert,如果存在就UPDATE。
这个时候,你就可以把这个判断用存储过程来写。
你的程序只要提示你想要保存到数据库里面的东西即可。
下面就是一个简单的存储过程。
CREATE
PROCEDURE
[insert_A_Employees]
(@fWorkNo
[int],
@fWorkName
[char](10),
@fDeptName
[varchar](20),
@fGroupName
[varchar](20),
@fRecordDate
[datetime])
AS
declare
@iCount
int
select
@iCount
=
count(*)
from
A_EMPLOYEES
where
@fWorkNo
=
fWORKNO
--统计该工号在数据库的数量赋值给
@iCount
if
@iCount
=
0
--如果数据库中不存在该工号
begin
INSERT
INTO
[CLKQ].[dbo].[A_Employees]
--则插入数据
(
[fWorkNo],
[fWorkName],
[fDeptName],
[fGroupName],
[fRecordDate])
VALUES
(
@fWorkNo,
@fWorkName,
@fDeptName,
@fGroupName,
@fRecordDate)
return
1
--返回一个标识
end
else
begin
--否则则更新数据
update
[CLKQ].[dbo].[A_Employees]
set
[fWorkName]=@fWorkName,
[fDeptName]=@fDeptName,
[fGroupName]=@fGroupName,
[fRecordDate]=@fRecordDate
where
[fWorkNo]=@fWorkNo
return
0
--返回一个标识
end
GO
此时你只要在客户端程序提供:
@fWorkNo
,
@fWorkName
,
@fDeptName
,
@fGroupName
,
@fRecordDate
这几个值就行了。。
其它处理过程就由服务器方处理了。
以上是以
sql
数据库为例。。。
ACCESS
等数据库没有此功能。
‘叁’ 求一个详细的mysql 存储过程例子,带写日志的那种,不要也不要太简单啊。
如果想带日志只有自己写了,可以使用row_count()返回改的的行数
例如
create procere p_a1(in p_id int,in p_name varchar(20),out p_out varchar(200))
begin
declare p_cm int;
set p_cm = 0;
insert into a1(id,name) values(p_id,p_name);
select row_count() into p_cm;
if (p_cm = 1)
then
set p_out = '成功';
else
set p_out = '不成功';
end if;
end;
mysql> call p_a1(5,'KK',@a2)//
Query OK, 1 row affected (0.01 sec)
mysql> select @a2//
+--------+
| @a2 |
+--------+
| 成功 |
+--------+
1 row in set (0.01 sec)
以上来自手打,希望对你有帮助!呵呵~
‘肆’ SQL存储过程实例
楼下的太麻烦了吧。emp员工表,输入任何部门号,返回部门的总工资,把总工资和部门好,分别放进emp2表里。
编写存储过程查询某部门员工的工资总和
create or replace procere my_text(v_deptno number)
is
cursor c is select* from emp;
v1 number:=0;
begin
for a in c loop
if(a.deptno=v_deptno) then
v1:=v1+a.sal;
end if;
end loop;
insert into emp2 values(v1,v_deptno);
end;
是不是很吊啊?楼主?
‘伍’ 求一些简单的存储过程实例
IF OBJECT_ID('proc_SearchEmpTest')IS NOT NULL
DROP PROC proc_SearchEmpTest
GO
CREATE PROC proc_SearchEmpTest
//这下面的你可以忽略,把你要的参数按照这个格式往里面写就可以了
@PageIndex INT, --页码
@PageSize INT, --分页大小
@StrSql NVARCHAR(1000)='' --传入sql查询语句
AS
//AS中的操作就是你想做的操作,比如select id form 标明 where name="",写多个Sql语句
DECLARE @SQL NVARCHAR(1000)
SET @SQL=@StrSql
--把符合的数据创建临时表
EXEC(@SQL)
--1.查询满足条件的信息
--EXEC SP_EXECUTESQL @SQL
// ##TabTmp是一个临时表,这个是我写的,你可以按照自己的来,临时表在有特殊需要时才用,你可以忽略这块
SELECT * FROM ##TabTmp WHERE A BETWEEN (@PageIndex-1)*(@PageSize)+1 AND (@PageIndex)* (@PageSize)
--2.记录满足条件的个数
DECLARE @count INT
SELECT @count=COUNT(*)FROM ##TabTmp
DROP TABLE ##TabTmp
print @count
--4.返回型参数,返回参数一般不需要,如果你要从一个存储中接受的一个返回值才有return这种操作
RETURN @count
go
//调用存储过程,你定义了多少个参数就是传多少个参数
exec proc_SearchEmpTest 2,15,'select row_number()over(order by id) as A,* into ##TabTmp from guojiadiqudata where 1=1 and name like %定西%'
‘陆’ 存储过程例子
???
补充:
可以执行,执行方法
EXECUTE 存储过程名 '参数值'
‘柒’ 存储过程的实例
数据库存储过程
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下:
CREATE PROC[EDURE] procere_name [;number]
[
{@parameter data_type} ][VARYING] [= default] [OUTPUT]
]
[,...n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE, ENCRYPTION
}
]
[FOR REPLICATION]
AS
sql_statement [...n]
[ ]内的内容是可选项,而()内的内容是必选项,
例:若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为:
Create Proc select_del As
Delete tmp
例:用户想查询tmp表中某年的数据的存储过程
create proc select_query @year int as
select * from tmp where year=@year
在这里@year是存储过程的参数
例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。
空:表示该结点为顶层结点
fjdid(父结点编号)
结点n 非空:表示该结点的父亲结点号
dwmc(单位名称) CREATEprocsearch_dwmc@dwidoldint,@dwmcresultvarchar(100)outputasdeclare@stopintdeclare@resultvarchar(80)declare@dwmcvarchar(80)declare@dwidintsetnocountonset@stop=1set@dwmc=""select@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidoldset@result=rtrim(@dwmc)if@dwid=0set@stop=0while(@stop=1)and(@dwid<>0)beginset@dwidold=@dwidselect@dwmc=dwmc,@dwid=convert(int,fjdid)fromjtdwwhereid=@dwidoldif@@rowcount=0set@dwmc=""elseset@result=@dwmc+@resultif(@dwid=0)or(@@rowcount=0)set@stop=0elsecontinueendset@dwmcresult=rtrim(@result)使用execpro-name[pram1pram2.....]SQL Server中存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出订单编号为1的订单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。
Oracle中的存储过程
1.创建过程
与其它的数据库系统一样,Oracle的存储过程是用PL/SQL语言编写的能完成一定处理功能的存储在数据库字典中的程序。
语法:
create [or replace] procere procere_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<类型.变量的说明>
(注:不用 declare语句 )
Begin
<执行部分>
exception
<可选的异常处理说明>
end;
1.1 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;
1.2 在存储过程内的参数只能指定参数类型;不能指定长度;
1.3 在AS或IS 后声明要用到的变量名称和变量类型及长度;
1.4 在AS或IS 后声明变量不要加declare 语句。
2.使用过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、Oracle开发工具或第三方开发工具来调用运行。Oracle 使用CALL 语句来实现对存储过程的调用。
语法:
call procere_name( parameter1, parameter2…);
3.开发过程
如今的几大数据库厂商提供的编写存储过程的工具都没有统一,虽然它们的编写风格有些相似,但由于没有标准,所以各家的开发调试过程也不一样。下面编写PL/SQL存储过程、函数、包及触发器的步骤如下:
3.1 编辑存储过程源码使用文字编辑处理软件编辑存储过程源码,要用类似WORD文字处理软件进行编辑时,要将源码存为文本格式。
3.2 对存储过程程序进行解释在SQLPLUS或用调试工具将 存储过程程序进行解释;
在SQL>下调试,可用start 或get 等Oracle命令来启动解释。如:
SQL>start c:stat1.sql
如果使用调试工具,可直接编辑和点击相应的按钮即可生成存储过程。
3.3 调试源码直到正确我们不能保证所写的存储过程达到一次就正确。所以这里的调试是每个程序员必须进行的工作之一。在SQLPLUS下来调试主要用的方法是:
1.使用 SHOW ERROR命令来提示源码的错误位置;
2.使用 USER_ERRORS数据字典来查看各存储过程的错误位置。
3.4 授权执行权给相关的用户或角色如果调试正确的存储过程没有进行授权,那就只有建立者本人才可以运行。所以作为应用系统的一部分的存储过程也必须进行授权才能达到要求。 在SQLPLUS下可以用GRANT命令来进行存储过程的运行授权。
语法:
GRANT system_privilege | role TO user | role | PUBLIC
[WITH ADMIN OPTION]
或
GRANT object_privilege | ALL column ON schema.object
TO user | role | PUBLIC WITH GRANT OPTION
其中
system_privilege: 系统权限
role: 角色名
user: 被授权的用户名
object_privilege: 所授予的权限名字,可以是
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
Column: 列名
schema: 模式名
object: 对象名
4.数据字典
USER_SOURCE 用户的存储过程、函数的源代码字典
DBA_SOURCE 整个系统所有用户的存储过程、函数的源代码字典
ALL_SOURCE 当前用户能使用的存储过程(包括其她用户授权)、函数的源代码字典
USER_ERRORS 用户的存储过程、函数的源代码存在错误的信息字典
临时表
(针对SQL2000/2005)
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。
SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)
如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。
除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
所有其它本地临时表在当前会话结束时自动除去。
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。
‘捌’ 给我个真正项目中的存储过程例子
存储过程调用深度为16层,存储过程的复杂度与设计时存储过程的整体框架相关,一般底层的存储过程简单一些,实现基本的功能,而上层的存储过程调用底层的过程,从而实现复杂的功能,供程序调用。
总而言之,存储过程像模块化编程一样,都是由小模块堆积起来的。因而楼主关注存储过程的复杂度,不如有空自己多写几个小存储过程;以前我们公司的存储过程长的大概在1000行左右,短的只有几行。
‘玖’ sql存储过程实例
CREATE OR REPLACE
procere procere_name
begin
for c in (select column_a_name from table_a_name)loop
update table_b_name set column_b_name=c.column_a_name where....
end loop;
end;