第12章 存储过程

第12章 存储过程
第12章 存储过程

第12章存储过程

12.1 存储过程概述

存储过程是一种命名PL/SQL程序块,它将一些相关的SQL语句,流程控制语句组合在一起,用于执行某些特定的操作或者任务。将经常需要执行的特定的操作写成过程,通过过程名,就可以多次调用过程,从而实现程序的模块化设计,这种方式提高了程序的效率,节省了用户的时间。

存储过程具有以下特点:

●存储过程在服务器端运行,执行速度快。

●存储过程增强了数据库的安全性。

●存储过程允许模块化程序设计。

●存储过程可以提高系统性能。

12.2 存储过程的创建和调用

12.2.1 创建存储过程

1. 通过PL/SQL 语句创建存储过程

PL/SQL创建存储过程使用的语句是CREATE PROCEDURE。

语法格式:

CREATE [OR REPLACE] PROCEDURE <过程名> /*定义过程名*/

[ (<参数名> <参数类型> <数据类型> [ DEFAULT <默认值>] [, …n])]

/*定义参数类型及属性*/

{ IS | AS }

[<变量声明>] /*变量声明部分*/

BEGIN

<过程体> /*PL/SQL过程体*/

END [<过程名>][;]

说明:

(1)OR REPLACE:如果指定的过程已存在,则覆盖同名的存储过程。

(2)过程名:定义的存储过程的名称。

(3)参数名:存储过程的参数名必须符合有关标识符的规则,存储过程中的参数称为形式参数(简称形参),可以声明一个或多个形参,调用带参数的存储过程则应提供相应的实际参数(简称实参)。

(4)参数类型:存储过程的参数类型有IN、OUT和IN OUT 三种模式,默认的模式是IN模式。

●IN:向存储过程传递参数,只能将实参的值传递给形参,在存储过程内部只能读不能写,对应IN模式的实参可以是常量或变量。

●OUT:从存储过程输出参数,存储过程结束时形参的值会赋给实参,在存储过程内部可以读或写,对应OUT模式的实参必须是变量。

●IN OUT:具有前面两种模式的特性,调用时,实参的值传递给形参,结束时,形参的值传递给实参,对应IN OUT模式的实参必须是变量。

(5)DEFAULT:指定IN参数的默认值,默认值必须是常量。

(6)过程体:包含在过程中的PL/SQL 语句。

存储过程可以带参数,也可以不带参数。

【例12.1】创建一个不带参数的存储过程spTest,输出Hello Oracle。

CREATE OR REPLACE PROCEDURE spTest /*创建不带参数的存储过程*/

AS

BEGIN

DBMS_OUTPUT.PUT_LINE('Hello Oracle');

END;

【例12.2】创建一个带参数的存储过程spTc,查询指定学号学生的总学分。

CREATE OR REPLACE PROCEDURE spTc(p_sno IN CHAR)

/*创建带参数的存储过程, p_sno参数为IN模式*/

AS

credit number;

BEGIN

SELECT tc INTO credit

FROM student

WHERE sno=p_sno;

DBMS_OUTPUT.PUT_LINE(credit);

END;

2. 通过SQL Developer图形界面方式创建存储过程

【例12.3】通过图形界面方式创建存储过程spTc,用于求102课程的平均分。

(1)启动”SQL Developer”,在”连接”节点下打开数据库连接”sys_stsys”,选择并展开“过程”节点,右单击该节点,在弹出的快捷菜单中选择”创建过程”命令,出现”创建PL/SQL 过程”对话框,如图12.1所示。

(2)在“名称”文本框中输入存储过程的名称,这里是spTc,单击“+”按钮添加一个参数,在“Name”栏输入参数名称p_sno,在“Type”栏选择参数的类型CHAR,在“Mode”栏选择参数的模式IN

(3)单击“确定”按钮,在spTc过程的编辑框中编写PL/SQL语句,完成后单击“编译”按钮完成过程的创建。

12.2.2 存储过程的调用

存储过程的调用可采用PL/SQL语句,通过EXECUTE(或EXEC)语句可以调用一个已定义的存储过程。

语法格式:

[ { EXEC | EXECUTE } ] <过程名>

[ ( [<参数名> =>] <实参> | @<实参变量> [,…n]) ] [;]

12.2.2 存储过程的调用

说明:

(1)可以使用EXECUTE(或EXEC)语句调用已定义的存储过程。但在PL/SQL块中,可以直接使用过程名调用。

(2)对于带参数的存储过程,有以下三种调用方式:

●名称表示法:调用时按形参的名称和实参的名称对应调用。

●位置表示法:调用时按形参的排列顺序调用。

●混合表示法:将名称表示法和位置表示法混合使用。

1)使用EXECUTE语句调用和使用PL/SQL语句块调用存储过程

【例12.4】调用存储过程spTest。

(1)使用EXECUTE语句调用

EXECUTE spTest;

运行结果:

Hello Oracle

(2)使用PL/SQL语句块调用

BEGIN

sptest;

END;

运行结果:

Hello Oracle

2)在带参数的存储过程中,使用位置表示法调用和使用名称表示法调用

【例12.5】调用带参数的存储过程sptc。

(1)使用位置表示法调用带参数的存储过程

EXECUTE spTc('121001');

该语句使用位置表示法调用带参数的存储过程spTc,省略了”<参数名>=>”格式,但后面的实参顺序必须和过程定义时的形参顺序一致。

运行结果:

52

(2)使用名称表示法调用带参数的存储过程

EXECUTE spTc(p_sno=>'121001');

该语句使用名称表示法调用带参数的存储过程spTc,使用了”<参数名>=><实参>”格式。

运行结果:

52

12.2.3 存储过程的删除

语法格式:

DROP PROCEDURE [<用户方案名>.] <过程名>;

【例12.6】删除存储过程spTc。

DROP PROCEDURE spTc;

12.3 存储过程的参数

12.3.1 带输入参数存储过程的使用

【例12.7】创建一个带输入参数存储过程spCourseMax,输出指定学号学生的所有课程中的最高分。

(1)创建存储过程

CREATE OR REPLACE PROCEDURE spCourseMax (p_sno IN CHAR)

/*创建存储过程spCourseMax, 参数p_sno是输入参数*/

AS

v_max number;

BEGIN

SELECT MAX(c.grade) INTO v_max

FROM student a, course b, score c

WHERE a.sno=c.sno AND https://www.360docs.net/doc/1111641530.html,o=https://www.360docs.net/doc/1111641530.html,o AND a.sno=p_sno

GROUP BY a.sno;

DBMS_OUTPUT.PUT_LINE(p_sno||'学生的最高分是'||v_max);

END;

12.3.1 带输入参数存储过程的使用

(2)调用存储过程

EXECUTE spCourseMax ('121001');

在调用存储过程时,采用按位置传递参数,将实参值’121001’传递给输入参数p_sno并输出该学号学生的所有课程中的最高分。

运行结果:

121001学生的最高分是94

【例12.8】设st2表结构已创建,含有4列stno、stname、stage、stsex,创建一个带输入参数存储过程spInsert,为输入参数设置默认值,在st2表中添加学号1001~1008。

(1)创建存储过程

CREATE OR REPLACE PROCEDURE spInsert(p_low IN INT:=1001,p_high IN INT:=1008)

/*创建存储过程spInsert, 输入参数p_low设置默认值1001, 输入参数p_ high设置默认值1008*/

AS

v_n int;

BEGIN

v_n:=p_low;

WHILE v_n<=p_high

LOOP

INSERT INTO st2(stno) VALUES(v_n);

v_n:=v_n+1;

END LOOP;

COMMIT;

END;

(2)调用存储过程

EXECUTE spInsert;

在调用存储过程时未指定实参值,自动用输入参数p_low、p_ high对应的默认值代替,并在st2表中添加学号1001~1008。

使用SELECT语句进行测试:

SELECT *

FROM st2;

运行结果:

STNO STNAME STAGE STSEX

----------------------------------------------

1001

1002

1003

1004

1005

1006

1007

1008

12.3.2 带输出参数存储过程的使用

【例12.9】创建一个带输出参数的存储过程spNumber,查找指定专业的学生人数。

(1)创建存储过程

CREATE OR REPLACE PROCEDURE spNumber(p_speciality IN char, p_num OUT number)

/*创建存储过程spNumber, 参数p_speciality是输入参数, 参数p_num是输出参数*/

AS

BEGIN

SELECT COUNT(speciality) INTO p_num

FROM student

WHERE speciality=p_speciality;

END;

(2)调用存储过程

DECLARE

v_num number;

BEGIN

spnumber('计算机', v_num);

DBMS_OUTPUT.PUT_LINE('计算机专业的学生人数是:'||v_num);

END;

在调用存储过程时,将实参值'计算机'传递给输入参数p_speciality;在过程体中,使用SELECT-INTO语句将查询结果存入输出参数p_num;结束时,将输出参数p_num的值传递给实参v_num并输出计算机专业的学生人数。

运行结果:

计算机专业的学生人数是:3

12.3.3 带输入输出参数存储过程的使用

【例12.10】创建一个存储过程spSwap,交换两个变量的值。

(1)创建存储过程

CREATE OR REPLACE PROCEDURE spSwap(p_t1 IN OUT NUMBER, p_t2 IN OUT NUMBER)

/*创建存储过程spSwap, 参数p_t1和p_t2都是输入输出参数*/

AS

v_temp number;

BEGIN

v_temp:=p_t1;

p_t1:=p_t2;

p_t2:=v_temp;

END;

(2)调用存储过程

DECLARE

v_1 number:=70;

v_2 number:=90;

BEGIN

spSwap(v_1,v_2);

DBMS_OUTPUT.PUT_LINE('v_1='||v_1);

DBMS_OUTPUT.PUT_LINE('v_2='||v_2);

END;

在调用存储过程时,将实参的值传递给输入输出参数p_t1和p_t2。在过程体中,

p_t1的值和p_t2的值进行了交换。结束时,已交换值的输入输出参数p_t1和p_t2,分别将它们的值传递给实参,完成两个变量(实参)的值的交换。

运行结果:

v_1=90

v_2=70

12.4 应用举例

【例12.11】创建一个存储过程spAvgGrade,输入学生姓名后,将查询出的平均分存人输出参数内。

(1)创建存储过程

题目分析:

将学生姓名设置为输入参数、平均分设置为输出参数,在过程体中设置SELECT-INTO语句。编写程序:

CREATE OR REPLACE PROCEDURE spAvgGrade (p_sname IN CHAR, p_avg OUT NUMBER)

/*创建存储过程spAvgGrade, 参数p_sname是输入参数, 参数p_avg是输出参数*/

AS

BEGIN

SELECT AVG(grade) INTO p_avg

FROM student a, score b

WHERE a.sno=b.sno AND a.sname=p_sname;

END;

程序分析:

姓名设置为输入参数p_sname、平均分设置为输出参数p_avg。

在过程体中通过SELECT-INTO语句,将查询结果存入输出参数p_avg。

(2)调用存储过程

DECLARE

v_avg number;

BEGIN

spAvgGrade ('徐良成', v_avg);

DBMS_OUTPUT.PUT_LINE('徐良成的平均分是:'||v_avg);

END;

调用存储过程时,将实参值’徐良成’传递给输入参数p_sname;在过程体中,通过SELECT-INTO语句将查询结果存入输出参数p_avg;调用结束时,将输出参数p_avg的值传递给实参v_avg并输出徐良成的平均分。

运行结果:

徐良成的平均分是:86.33333333333333333333333333333333333333

【例12.12】创建一个存储过程spNumberAvg,输入学号后,将该生所选课程数和平均分存人输出参数内。

(1)创建存储过程

题目分析:

将学号设置为输入参数、所选课程数和平均分分别设置为输出参数,在过程体中设置两个SELECT-INTO语句。

编写程序:

CREATE OR REPLACE PROCEDURE spNumberAvg(p_sno IN CHAR, p_num OUT NUMBER, p_avg OUT NUMBER)

/*创建存储过程spNumberAvg, 参数p_sno是输入参数, 参数p_num和p_avg是输出参数*/

AS

BEGIN

SELECT COUNT(cno) INTO p_num

FROM score

WHERE sno =p_sno;

SELECT AVG(grade) INTO p_avg

FROM score

WHERE sno =p_sno;

END;

程序分析:

学号设置为输入参数p_sno、所选课程数和平均分分别设置为输出参数p_num和p_avg。在过程体中通过第一个SELECT-INTO语句,将查询结果存入输出参数p_num,通过第二个SELECT-INTO语句,将查询结果存入输出参数p_avg。

(2)调用存储过程

DECLARE

v_num number;

v_avg number;

BEGIN

spNumberAvg('121002', v_num, v_avg);

DBMS_OUTPUT.PUT_LINE('学号121002的学生的选课数是:'||v_num||', 平均分是:'||v_avg);

END;

调用存储过程时,将实参’121002’传递给输入参数p_sno;在过程体中,使用两条SELECT-INTO 语句分别将查询结果存入输出参数p_num和p_avg;调用结束时,将p_num和p_avg的值分别传递给实参v_num和v_avg并输出结果。

运行结果:

学号121002的学生的选课数是:3, 平均分是:86.66666666666666666666666666666666666667

【例12.13】创建一个存储过程spNumMax,输入学号后,将该生姓名、最高分存人输出参数内。

(1)创建存储过程

题目分析:

将学号设置为输入参数、姓名和最高分分别设置为输出参数,在过程体中设置两个SELECT-INTO语句。

编写程序:

CREATE OR REPLACE PROCEDURE spNumberMax(p_sno IN student.sno%TYPE, p_sname OUT student.sname%TYPE, p_max OUT NUMBER)

/*创建存储过程spNumberMax, 参数p_sno是输入参数, 参数p_sname和p_max是输出参数*/

AS

BEGIN

SELECT sname INTO p_sname

FROM student

WHERE sno=p_sno;

SELECT MAX(grade) INTO p_max

FROM student a, score b

WHERE a.sno=b.sno AND a.sno=p_sno;

END;

程序分析:

学号设置为输入参数p_sno、姓名和最高分分别设置为输出参数p_sname和p_max。

在过程体中通过第一个SELECT-INTO语句,将查询结果存入输出参数p_sname,通过第二个SELECT-INTO语句,将查询结果存入输出参数p_max。

(2)调用存储过程

DECLARE

v_sname student.sname%TYPE;

v_max number;

BEGIN

spNumberMax('121002', v_sname, v_max);

DBMS_OUTPUT.PUT_LINE('学号124001的学生姓名是:'||v_sname||' 最高分是:'||v_max);

END;

调用存储过程时,将实参’121002’传递给输入参数p_sno;在过程体中,使用两条SELECT-INTO 语句分别将查询结果存入输出参数p_sname和p_max;调用结束时,将输出参数p_sname 和p_max的值分别传递给实参v_sname和v_max并输出结果

运行结果:

学号124001的学生姓名是:李佳慧最高分是:88

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

第9章 存储过程与存储函数

第9章存储过程与存储函数 一、选择题 1.MySQL中存储过程的建立以关键字()开始,后面仅跟存储过程的名称和参数。A.CREATE FUNCTION B.CREATE TRIGGER C.CREATE PROCEDURE D.CREATE VIEW 2.下列关于存储过程名描述错误的是()。 A.MySQL的存储过程名称不区分大小写。 B.MySQL的存储过程名称区分大小写。 C.存储过程名不能与MySQL数据库中的内置函数重名。 D.存储过程的参数名不要跟字段名一样。 3.下面声明变量正确的是()。 A.DECLARE x char(10) DEFAULT 'outer ' B.DECLARE x char DEFAULT 'outer ' C.DECLARE x char(10) DEFAULT outer D.DECLARE x DEFAULT 'outer ' 4.从tb_sutdent表中将名称为mrsoft的用户赋值给host,以下SQL语句正确的是()。A.SELECT host INTO name FROM tb_sutdent WHERE name ='mrsoft'; B.SELECT name INTO host FROM tb_sutdent WHERE name= 'LeonSK '; C.SELECT name INTO host FROM tb_sutdent WHERE name='mrsoft'; D.SELECT name INTO host FROM tb_sutdent WHERE name=‘mrsoft’; 5.光标的一般使用步骤,以下正确的是()。 A.声明光标使用光标打开光标关闭光标 B.打开光标声明光标使用光标关闭光标 C.声明光标打开光标选择光标关闭光标 D.声明光标打开光标使用光标关闭光标 6.下列控制流程语句中,MySQL存储过程不支持()。 A.WHILE B.FOR C.LOOP D.REPEAT 25

oracle存储过程中事务的管理

1.存储过程中的commit与rollback create table A ( A VARCHAR2(46) not null, primary key (A) ) create table B ( A VARCHAR2(46) ) create table C ( A VARCHAR2(46) ) 表B中插入值 Insert into B(A) valus(‘a’); Insert into B(A) valus(‘b’); Insert into B(A) valus(‘b’); Insert into B(A) valus(‘c’); 1. create or replace procedure test as begin for v_cur in (select a from b) loop insert into c(a)values(v_cur.a) ; insert into a(a)values(v_cur.a) ; end loop; end; 执行结果:A、C表中均无记录。系统启动隐式事务,在遇到异常时自动回滚。 2. create or replace procedure test as begin for v_cur in (select a from b) loop insert into C(a)values(v_cur.a) ; end loop; end; 执行结果:C表中无记录。系统启动隐式事务,但等待提交或回滚。Commit后C表中可查询到插入的4条数据。 3 create or replace procedure test as

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.360docs.net/doc/1111641530.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

数据库第8-11章习题

第8章数据库编程 一、选择题 1、修改存储过程使用的语句是()。 A. ALTER PROCEDURE B. DROP PROCEDURE C. INSERT PROCEDUE D. DELETE PROCEDUE 2、创建存储过程的语句是()。 A. ALTER PROCEDURE B. DROP PROCEDURE C. CREATE PROCEDUE D. INSERT PROCEDUE 3、下面()组命令,将变量count值赋值为1。 A.DECLARE @count SELECT @count=1 B.DIM count=1 C.DECLARE count SELECT count=1 D.DIM @count SELECT @count=1 4、在SQL Server 中删除存储过程用()。 A.ROLLBACK B. DROP PROC C.DELALLOCATE D. DELETE PROC 10.在SQL Server 编程中,可使用()将多个语句捆绑。 A.{} B. BEGIN-END C.( ) D. [ ] 二、填空题 1、在T-SQL编程语句中,WHILE结构可以根据条件多次重复执行一条语句或一个语句块,还可以使用()和CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。 2、存储过程是存放在()上的预先定义并编译好的T-SQL语句。 3、游标是系统为用户开设的一个(),存放SQL语句的执行结果 第9章关系查询处理和查询优化 课后作业:P275,2题答案:

1 2、事务的原子性是指。 A.事务中包括的所有操作要么都做,要么都不做 B.事务一旦提交,对数据库的改变是永久的 C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的 D.事务必须是使数据库从一个一致性状态变到另一个一致性状态 3、事务的一致性是指。 A.事务中包括的所有操作要么都做,要么都不做 B.事务一旦提交,对数据为的改变是永久的 C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的 D.事务必须是使数据库从一个一致性状态变到另一个一致性状态 4、事务的隔离性是指。 A.事务中包括的所有操作要么都做,要么都不做 B.事务一旦提交,对数据库的改变是永久的 C.一个事务内部的操作及使用的数据对并发的其他事务是隔离的 D.事务必须是使数据库从一个一致性状态变到另一个一致性状态 5、事务的持续性是指。 A.事务中包括的所有操作要么都做,要么都不做

第10章 存储过程、函数和包

第10章存储过程、函数和包 存储过程(PROCEDURE)、函数(FUNCTION)和包(PAKAGE)是以编译的形式存储在数据库中的数据库的对象,并成为数据库的一部分,可作为数据库的对象通过名字被调用和访问。 存储过程通常是实现一定功能的模块;函数通常用于计算,并返回计算结果;包分为包头和包体;用于捆绑存放相关的存储过程和函数,起到对模块归类打包的作用。 存储过程、函数和包是数据库应用程序开发的重要方法,三者既有区别,也有联系。 ?存储过程和存储函数。 ?过程的参数和调用。 ?包和包的应用。 10.1 存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。 10.1.1 认识存储过程和函数 和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: ·存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。 ·存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。 ·存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL 程序)。一个重复使用的功能,可以设计成为存储过程,比如:显示一张工资统计表,可以设计成为存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。 ·像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。 存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。

第11章 数据库备份

第十一章数据库的备份 11.1 概述 数据库的备份和恢复是数据库管理员的重要职责之一。 不管数据库系统如何精心设计、配置和优化,它们都难免出现系统或硬件故障,从而引起数据库中的数据遭到破坏,当数据库中的数据遭到破坏时,数据库管理员必须尽快从数据备份中恢复数据,从而将损失减少到最小,保证用户的正常使用。数据库的备份对成功恢复数据是非常关键的,数据库管理员必须根据企业的需要,制定出良好的备份和恢复策略,并认真实施它。 11.1.1 Oracle备份的概念 数据库的备份是数据库的拷贝。当原来的数据丢失时,可以使用备份重建丢失的信息(组成Oracle数据库的物理文件)。该拷贝包括数据库的重要部分,如控制文件、存档日志和数据文件等。 备份包括物理备份和逻辑备份,物理备份是所采用的最主要的备份方式,是物理数据库文件的拷贝。如果发生物理数据库丢失或崩溃,物理备份用于保证数据库在最小的数据丢失或没有数据丢失的情况下得到恢复。它实际上进行上的是物理文件的拷贝,包含拷贝构成数据库的文件而不管其逻辑内容,进行物理备份可以采用两种方法: ?使用恢复管理器(Recovery Manager,简称RMAN)程序; ?操作系统文件备份命令,也叫做文件系统备份。Oracle 支持两种不同类型的物理文件备份:脱机备份(offline backup)和联机备份(online backup)。 相应的逻辑备份用于实现数据库对象(比如数据库表或存储过程)的恢复并且它是一个全面备份策略的必要的组成部分,它通常采用Oracle的Export程序将逻辑数据导出并以二进制的方式存储。一般来说我们使用逻辑备份作为物理备份的必要补充。 11.1.2 Oracle数据库系统故障类型 不管数据库系统如何精心设计、配置和优化,它们都难免出现系统或硬件故障,语句和进程故障。这些故障大致可以分为以下几大类: 1. 介质故障 在读或写要求操作数据库的文件时可能会出现错误,这种故障就叫做介质故障,因为在读或写存储介质上的文件时会出现物理问题。一个常见的介质故障的例子是磁头的碰撞会引起磁盘驱动器上所有文件的丢失。介质故障是数据库数据的最大威胁。介质问题主要有:?磁盘磁头故障使磁盘驱动器上所有文件丢失。 ?数据文件、控制文件、联机或归档重做日志文件被意外删除、覆盖或损坏。 从介质故障中恢复的合适策略取决于受到影响的文件。介质故障是备份与恢复策略所需

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

第十一章 活动目录的维护

第十一章活动目录的维护 内容摘要 本章重点介绍Windows2000活动目录数据的存储过程和维护方法。重点包括: ? 活动目录数据的备份和恢复 ? 活动目录数据的优化 ? 活动目录的维护程序 考点提示 ? 活动目录的授权恢复和非授权恢复 ? 管理活动目录对象移动的程序:Movetree ? Ntdsutil.exe的应用 11.1 活动目录维护简介 造成Windows2000活动目录故障的原因很多,后果也不完全相同,如系统不能启动,不能登录,网络访问和网络验证出现故障等。当活动目录出现故障时,首先应查找可能引起故障的原因,然后根据掌握的资源情况,制定修复策略,对活动目录进行修复。 11.2 活动目录数据的维护 Windows2000活动目录将数据存储在一个事物数据库和日志文件中,对活动目录数据进行维护可以在系统出现故障时,如硬盘损坏或者软件系统崩溃而导致数据丢失时,对数据进行有效的恢复。活动目录数据维护的关键在于对活动目录数据库和日志文件进行有效的维护。 Windows2000服务器对活动目录数据提供如下的维护方法: ? 备份和恢复。使用Windows2000自带的备份工具可以对活动目录数据库进行备份和恢复。活动目录数据库在Windows2000中是整个系统数据的一部分。 ? 移动。Windows2000服务器支持将活动目录数据库从一个地方移动到另一个地方,注意移动一个活动目录数据库文件后,原文件并不会自动删除,而是继续存在,这儿的移动和复制有一些相似。 ? 碎片整理。频繁的数据库访问会造成磁盘空间利用率下降。碎片整理可以重新排列数据库中的数据,回收可以利用的磁盘空间。 11.2.1 活动目录数据的存储过程 Windows2000活动目录使用可扩展的存储引擎(ESE)对数据进行存储。ESE应用事务和日志的概念将数据存储在数据库和事务日志文件中。所谓事务(Transaction),是指系统作为一个不可分割的整体进行处理的更改、添加、删除等操作的集合。 活动目录数据存储的基本过程如下: 1、为数据库更改创建一个事务 2、向日志文件中写入事务 3、将事务写入内存缓冲区 4、将更改在系统空闲的时候写入数据库 5、更改指向日志中未写入数据库的数据项的指针。

存储过程的作用和意义

存储过程的作用和意义 随着唐山公司开发部的成立,针对各项生产经营活动的系统支撑逐步到位,在开发过程中,数据库存储过程应用逐渐广泛,这里我来简要介绍下存储过程。 一、什么是存储过程: 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 二、为什么要用存储过程呢? 存储过程真的那么重要吗,它到底有什么好处呢?存储过程说白了就是一堆SQL 的合并。中间加了点逻辑控制。 1.存储过程处理比较复杂的业务时比较实用。具体分为两个方面:(一)、响应时间上来说有优势:如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话,就只有一次。存储过程可以给我们带来运行效率提高的好处;(二)、从安全上使用了存储过程的系统更加稳定:程序容易出现BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。 2.数据量小的项目不用存储过程也可以正常运作。 三、那么什么时候才需要用存储过程? 存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其优势主要体现在: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。 3.存储过程可以重复使用,可减少数据库开发人员的工作量。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 5.更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。 6.分布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。 一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。 四、系统开发中存储过程使用的优势和劣势 优点如下: 1.执行效率高。 2.安全性能好。 3.对于一些场合非常容易实现需求。 缺点如下: 1.可维护性比较差。 2.可读性也差。

SQL存储过程实例

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。 2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 建表语句

第12章 存储过程

第12章存储过程 12.1 存储过程概述 存储过程是一种命名PL/SQL程序块,它将一些相关的SQL语句,流程控制语句组合在一起,用于执行某些特定的操作或者任务。将经常需要执行的特定的操作写成过程,通过过程名,就可以多次调用过程,从而实现程序的模块化设计,这种方式提高了程序的效率,节省了用户的时间。 存储过程具有以下特点: ●存储过程在服务器端运行,执行速度快。 ●存储过程增强了数据库的安全性。 ●存储过程允许模块化程序设计。 ●存储过程可以提高系统性能。 12.2 存储过程的创建和调用 12.2.1 创建存储过程 1. 通过PL/SQL 语句创建存储过程 PL/SQL创建存储过程使用的语句是CREATE PROCEDURE。 语法格式: CREATE [OR REPLACE] PROCEDURE <过程名> /*定义过程名*/ [ (<参数名> <参数类型> <数据类型> [ DEFAULT <默认值>] [, …n])] /*定义参数类型及属性*/ { IS | AS } [<变量声明>] /*变量声明部分*/ BEGIN <过程体> /*PL/SQL过程体*/ END [<过程名>][;] 说明: (1)OR REPLACE:如果指定的过程已存在,则覆盖同名的存储过程。 (2)过程名:定义的存储过程的名称。 (3)参数名:存储过程的参数名必须符合有关标识符的规则,存储过程中的参数称为形式参数(简称形参),可以声明一个或多个形参,调用带参数的存储过程则应提供相应的实际参数(简称实参)。 (4)参数类型:存储过程的参数类型有IN、OUT和IN OUT 三种模式,默认的模式是IN模式。 ●IN:向存储过程传递参数,只能将实参的值传递给形参,在存储过程内部只能读不能写,对应IN模式的实参可以是常量或变量。 ●OUT:从存储过程输出参数,存储过程结束时形参的值会赋给实参,在存储过程内部可以读或写,对应OUT模式的实参必须是变量。 ●IN OUT:具有前面两种模式的特性,调用时,实参的值传递给形参,结束时,形参的值传递给实参,对应IN OUT模式的实参必须是变量。 (5)DEFAULT:指定IN参数的默认值,默认值必须是常量。 (6)过程体:包含在过程中的PL/SQL 语句。 存储过程可以带参数,也可以不带参数。 【例12.1】创建一个不带参数的存储过程spTest,输出Hello Oracle。 CREATE OR REPLACE PROCEDURE spTest /*创建不带参数的存储过程*/

第11章 项目采购管理

第十一章项目采购管理 1.下列哪项是用于征求潜在卖方的建议书? A.采购文件 B.卖方建议书 C.需求文件 D.合作协议 2.合同比其他项目文件需要经过更多审批的原因在于: A.合同更重要 B.合同涉及双方的利益 C.合同更复杂 D.合同具有法律约束力 3.审批过程的主要目标是_____。 A.降低风险 B.将风险转移给其他人 C.确保以清晰的合同语言来描述产品、服务或成果,以便满足既定的项目需要 D.确保项目成员都能了解合同 4.在合同收尾前,经双方共同协商,我们可以根据下列哪项对合同进行修改? A.合同的变更控制条款 B.合同终止条款 C.替代争议解决 D.采购管理计划 5.作为制定进度计划的输出,项目进度计划也是下述哪项的输入? A.规划采购 B.实施采购 C.管理采购 D.结束采购 6.采购审计发生在下列哪个过程中? A.规划采购 B.实施采购 C.管理采购 D.结束采购 7.一个项目经理第一次编制采购文件,他向你请教有关采购文件的相关知识。你可以提供给他下列建议, 除了____。 A.买方拟订的采购文件应便于潜在卖方做出准确、完整的应答 B.采购文件的复杂和详细程度应与采购的价值和风险水平相适应 C.采购文件必须严格,不允许卖方提建议 D.买方拟订的采购文件要便于对卖方应答进行评价 8.供方选择标准在下列哪个过程中产生? A.规划采购 B.实施采购 C.管理采购 D.结束采购 9.有争议的变更也可被称为下列各项,除了___。 A.索赔 B.争议 C.诉求 D.问题 10.下列哪项内容描述了如何管理从制定采购文件直到合同收尾的各个采购过程? A.成本绩效基准 B.采购管理计划 C.自制或外购决策 D.采购文件

SqlServer存储过程的事务模式编写

SQL Server在存储过程中编写事务处理代码的三种方法 SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran 这样编写的SQL存在很大隐患。请看下面的例子: create table demo(id int not null) go begin tran insert into demo values (null) insert into demo values (2) commit tran go 执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。这是什么原因呢? 原来SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。 如何避免这样的问题呢? 有三种方法:

1. 在事务语句最前面加上set xact_abort on set xact_abort on begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran go 当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。 2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。 begin tran update statement 1 ... if@@error<>0 begin rollback tran goto labend end delete statement 2 ... if@@error<>0 begin rollback tran goto labend end commit tran labend: go 3. 在SQL Server 2005中,可利用try...catch 异常处理机制。

事务处理的过程

https://www.360docs.net/doc/1111641530.html,事务处理 一事务处理介绍 事务是这样一种机制,它确保多个SQL语句被当作单个工作单元来处理。事务具有以下的作用: * 一致性:同时进行的查询和更新彼此不会发生冲突,其他 用户不会看到发生了变化但尚未提交的数据。 * 可恢复性:一旦系统故障,数据库会自动地完全恢复未完 成的事务。 二事务与一致性 事务是完整性的单位,一个事务的执行是把数据库从一个一 致的状态转换成另一个一致的状态。因此,如果事务孤立执行时是正确的,但如果多个事务并发交错地执行,就可能相互干扰,造成数据库状态的不一致。在多用户环境中,数据库必须避免同时进行的查询和更新发生冲突。这一点是很重要的,如果正在被处理的数据能够在该处理正在运行时被另一用户的修改所改变,那么该处理结果是不明确的。 不加控制的并发存取会产生以下几种错误: 1 丢失修改(lost updates) 当多个事务并发修改一个数据时,不加控制会得出错误的结 果,一个修改会覆盖掉另一个修改。 2 读的不可重复性 当多个事务按某种时间顺序存取若干数据时,如果对并发存 取不加控制,也会产生错误。 3 脏读(DIRDY DATA),读的不一致性 4 光标带来的当前值的混乱 事务在执行过程中它在某个表上的当前查找位置是由光标表 示的。光标指向当前正处理的记录。当处理完该条记录后,则指向下一条记录。在多个事务并发执行时,某一事务的修改可能产生负作用,使与这些光标有关的事务出错。 5 未释放修改造成连锁退出 一个事务在进行修改操作的过程中可能会发生故障,这时需 要将已做的修改回退(Rollback)。如果在已进行过或已发现错误尚未复原之前允许其它事务读已做过修改(脏读),则会导致连锁退出。 6 一事务在对一表更新时,另外的事务却修改或删除此表的 定义。 数据库会为每个事务自动地设置适当级别的锁定。对于前面 讲述的问题:脏读、未释放修改造成的连锁退出、一事务在对一表更新时另外的事务却修改或删除此表的定义,数据库都会自动解决。而另外的三个问题则需要在编程过程中人为地定义事务或加锁来解决。 三事务和恢复 数据库本身肩负着管理事务的责任。事务是最小的逻辑工作

DB2存储过程简单例子

DB2存储过程简单例子 客户在进行短信服务这个业务申请时,需要填写一些基本信息,然后根据这些信息判断这个用户是否已经存在于业务系统中。因为网上服务和业务系统两个项目物理隔离,而且网上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。 解决方式是通过存储过程,以前也了解过存储过程,但没使用到项目中。不过经过一番努力最后还是完成了,期间遇到了一些困难,特写此文让对DB2存储过程还不熟悉的童鞋避免一些无谓的错误。 DROP PROCEDURE "PLName" @ CREATE PROCEDURE "PLName"(--存储过程名字 IN IN_ID BIGINT , --以下全是输入参数 IN IN_ENTNAME VARCHAR(200) , IN IN_REGNO VARCHAR(50), IN IN_PASSWORD VARCHAR(20), IN IN_LEREP VARCHAR(300), IN IN_CERTYPE CHARACTER(1), IN IN_CERNO VARCHAR(50), IN IN_LINKMAN VARCHAR(50), IN IN_SEX CHARACTER(1), IN IN_MOBTEL VARCHAR(30), IN IN_REQDATE TIMESTAMP, IN IN_REMITEM VARCHAR(300), IN IN_STATE CHARACTER(1), IN IN_TIMESTAMP TIMESTAMP ) BEGIN declare V_RESULT BIGINT; --声明变量 DELETE FROM TableNameA WHERE ID = IN_ID;

第10章 存储过程

第10章存储过程 存储过程是SQL语句和可选控制流语句的预编译集合,它以一个名称存储并作为一个单元处理。本章介绍存储过程的创建、执行、修改和删除等。 10.1 概述 存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。存储过程可以使对数据库的管理,以及显示关于数据库及其用户信息的工作容易得多。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列SQL语句。 可以从自己的存储过程内引用其他存储过程,这可以简化一 系列复杂语句。 存储过程在创建时即在服务器上进行编译,所以执行起来比 单个SQL语句快,且能减少网络通信的负担。 10.2创建存储过程 要使用存储过程,首先要创建一个存储过程。可以使用Transact-SQL 语言的CREATE PROCEDURE语句,也可以使用企业管理器或者存储过程创建向导来完成。 1.使用CREATE PROCEDURE语句创建存储过程 CREATE PROCEDURE语句的语法格式为: CREATE PROC[EDURE ] procedure_name [; number] [ {@parameter data_type} [VARYING ][ = default][OUTPUT] ][,…n] [WITH

{RECOMPILE | ENCRYPTION | RECOMPILE,ENCRYPTION}] [FOR REPLICATION] AS sql_statement […n ] 其中各参数含义如下: procedure_name新存储过程的名称。 number 是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE语句即可将同组的过程一起除去。例 如,名为orders的应用程序使用的过程可以命名为 orderproc;1、orderproc;2等。DROP PROCEDURE orderproc语 句将除去整个组。如果名称中包含定界标识符,则数字不应 包含在标识符中,只应在“procedure_name”前后使用适当的定 界符。 @parameter 过程中的参数。在CREATE PROCEDURE语句中 可以声明一个或多个参数。用户必须在执行过程时提供每个 所声明参数的值(除非定义了该参数的默认值)。存储过程最 多可以有2100个参数。 data_type 参数的数据类型。所有数据类型(包括text、ntext和 image)均可以用作存储过程的参数。不过,cursor数据类型只 能用于OUTPUT参数。如果指定的数据类型为cursor,也必须 同时指定VARYING和OUTPUT关键字。 VARYING 指定作为输出参数支持的结果集(由存储过程动态 构造,内容可以变化)。仅适用于游标参数。 default 参数的默认值。如果定义了默认值,不必指定该参数 的值即可执行过程。默认值必须是常量或NULL。 OUTPUT 表明参数是返回参数。该选项的值可以返回给 EXE[UTE]。使用OUTPUT参数可将信息返回给调用过程。 {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} RECOMPILE表明SQL Server不会缓存该过 程的计划,该过程将在运行时重新编译。ENCRYPTION表示 SQL Server加密syscomments表中包含CREATE PROCEDURE 语句文本的条目。 FOR REPLICATION 指定不能在订阅服务器上执行为复制创 建的存储过程。 sql_statement 过程中要包含的任意数目和类型的Transact- SQL语句。但有一些限制。 【例10.1】下面创建一个简单的存储过程stud_degree ,用于检索所有学生的成绩记录: USE school --判断stud_degree存储过程是否存在,若存在,则删除 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'stud_degree' AND type ='P')

MySQL存储过程实例教程2

MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。 2.关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。 3.MySQL存储过程的创建 (1). 格式

Oracle 存储过程中的事务处理

Oracle存储过程中的事务处理 当在SQL*Plus中进行操作时,用户可以使用COMMIT语句将在事务中的所有操作“保存”到数据库中。如果用户需要撤销所有的操作,则可以使用ROLLBACK语句回退事务中未提交的操作,使数据库返回到事务处理开始前的状态。在PL/SQL过程中,不仅可以包括插入和更新这类的DML操作,还可以包括事务处理语句COMMIT和ROLLBACK。 Oracle支持事务的嵌套,即在事务处理中进行事务处理。在嵌套的事务处理过程中,子事务可以独立于父事务处理进行提交和回滚。对于过程而言,每个过程就相当于一个子事务,用户可以在自己事务处理的任何地方调用该过程,并且无论父事务是提交还是回滚,用户都可以确保过程中的子事务被执行。 下面通过一个示例演示过程中的事务处理。 (1)以用户SCOTT身份连接到数据库,并建立两个表TEMP和LOG_TABLE。 SQL> create table temp(n number); 表已创建。 SQL> create table log_table( 2 username varchar2(20), 3 message varchar2(4000)); 表已创建。 (2)建立一个存储过程INSERT_INTO_LOG,用于向表LOG_TABLE添加记录。 SQL> create or replace procedure insert_into_log(msg_param varchar2) is 2 pragma autonomous_transaction; 3 begin 4 insert into log_table(username,message) 5 values(user,msg_param); 6 commit; 7 end insert_into_log; 8 / 过程已创建。 其中,PRAGMA AUTONOMOUS_TRANSACTION语句表示自动开始一个自治事务,实际上该语句也可以省略。 (3)在匿名程序块中调用INSERT_INTO_LOG过程向LOG_TABLE表中添加数据,并使用INSERT语句向表TEMP添加数据。 SQL> begin 2 insert_into_log('添加数据到TEMP表之前调用'); 3 insert into temp 4 values(1); 5 insert_into_log('添加数据到TEMP表之后调用'); 6 rollback;

相关文档
最新文档