创建存储过程

创建存储过程
创建存储过程

创建存储过程。存储过程是已保存的Transact-SQL 语句集合,或对Microsoft .NET Framework 公共语言运行时(CLR) 方法的引用,

可接收并返回用户提供的参数。可以创建过程供永久使用,或在一个会话(局部临时过程)中临时使用,或在所有会话(全局临时过程)中临时使用。

启动SQL Server 的一个实例时,也可以创建并自动运行存储过程。Transact-SQL 语法约定

语法

CREATE { PROC | PROCEDURE } [schema_name.]

procedure_name [ ;number ]

[ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ =default ] [ OUT | OUTPUT ]

] [ ,...n ]

[ WITH [ ,...n ] ]

[ FOR REPLICATION ]

AS { [;][ ...n ] | } [;]

::=

[ ENCRYPTION ]

[ RECOMPILE ]

[ EXECUTE_AS_Clause ]

::=

{ [ BEGIN ] statements [ END ] }

::=

EXTERNAL NAME assembly_name.class_name.method_name

参数

schema_name

过程所属架构的名称。

procedure_name

新存储过程的名称。过程名称必须遵循有关标识符的规则,并且在架构中必须唯一。

极力建议不在过程名称中使用前缀sp_。此前缀由SQL

Server 使用,以指定系统存储过程。有关详细信息,请参阅创建存储过程(数据库引擎)。

可在procedure_name前面使用一个数字符号(#)

(#procedure_name) 来创建局部临时过程,使用两个数字符号(##procedure_name) 来创建全局临时过程。对于CLR 存储过程,不能指定临时名称。

存储过程或全局临时存储过程的完整名称(包括##)不能超过128 个字符。局部临时存储过程的完整名称(包括#)不能超过116 个字符。

;number

是可选整数,用于对同名的过程分组。使用一个DROP

PROCEDURE 语句可将这些分组过程一起删除。例如,称为

orders的应用程序可能使用名为orderproc;1、

orderproc;2等的过程。DROP PROCEDURE orderproc

语句将删除整个组。如果名称中包含分隔标识符,则数字不应包

含在标识符中;只应在procedure_name前后使用适当的分隔

符。

带编号的存储过程有以下限制:

?不能使用xml或CLR 用户定义类型作为数据类型。

?不能对带编号的存储过程创建计划指南。

注意:

@parameter

过程中的参数。在CREATE PROCEDURE 语句中可以声明一个

或多个参数。除非定义了参数的默认值或者将参数设置为等于另

一个参数,否则用户必须在调用过程时为每个声明的参数提供值。

存储过程最多可以有2,100 个参数。

通过将at 符号(@) 用作第一个字符来指定参数名称。参数名

称必须符合有关标识符的规则。每个过程的参数仅用于该过程本

身;其他过程中可以使用相同的参数名称。默认情况下,参数只

能代替常量表达式,而不能用于代替表名、列名或其他数据库对

象的名称。有关详细信息,请参阅EXECUTE (Transact-SQL)。

如果指定了FOR REPLICATION,则无法声明参数。

[ type_schema_name. ] data_type

参数以及所属架构的数据类型。除table之外的其他所有数据类型均可以用作Transact-SQL 存储过程的参数。但是,cursor数据类型只能用于OUTPUT 参数。如果指定了cursor数据类型,则还必须指定VARYING 和OUTPUT 关键字。可以为cursor数据类型指定多个输出参数。

对于CLR 存储过程,不能指定char、varchar、text、ntext、image、cursor和table作为参数。有关CLR 类型与SQL Server 系统数据类型之间关系的详细信息,请参阅SQL Server Data Types and Their .NET Framework Equivalents。有关SQL Server 系统数据类型及其语法的详细信息,请参阅数据类型(Transact-SQL)。

如果参数的数据类型为CLR 用户定义类型,则必须对此类型有EXECUTE 权限。

如果未指定type_schema_name,则SQL Server 2005 数据库引擎将按以下顺序引用type_name:

?SQL Server 系统数据类型。

?当前数据库中当前用户的默认架构。

?当前数据库中的dbo架构。

对于带编号的存储过程,数据类型不能为xml或CLR 用户定义类型。

VARYING

指定作为输出参数支持的结果集。该参数由存储过程动态构造,其内容可能发生改变。仅适用于cursor参数。

default

参数的默认值。如果定义了default值,则无需指定此参数的值即可执行过程。默认值必须是常量或NULL。如果过程使用带

LIKE 关键字的参数,则可包含下列通配符:%、_、[] 和[^]。

注意:

OUTPUT

指示参数是输出参数。此选项的值可以返回给调用EXECUTE

的语句。使用OUTPUT 参数将值返回给过程的调用方。除非是CLR 过程,否则text、ntext和image参数不能用作

OUTPUT 参数。使用OUTPUT 关键字的输出参数可以为游标

占位符,CLR 过程除外。

RECOMPILE

指示数据库引擎不缓存该过程的计划,该过程在运行时编译。如果指定了FOR REPLICATION,则不能使用此选项。对于CLR 存储过程,不能指定RECOMPILE。

若要指示数据库引擎放弃存储过程内单个查询的计划,请使用

RECOMPILE 查询提示。有关详细信息,请参阅查询提示

(Transact-SQL)。如果非典型值或临时值仅用于属于存储过程

的查询子集,则使用RECOMPILE 查询提示。ENCRYPTION

指示SQL Server 将CREATE PROCEDURE 语句的原始文本

转换为模糊格式。模糊代码的输出在SQL Server 2005 的任何

目录视图中都不能直接显示。对系统表或数据库文件没有访问权

限的用户不能检索模糊文本。但是,可以通过DAC 端口访问系

统表的特权用户或直接访问数据文件的特权用户可以使用此文本。

此外,能够向服务器进程附加调试器的用户可在运行时从内存中

检索已解密的过程。有关访问系统元数据的详细信息,请参阅元

数据可见性配置。

该选项对于CLR 存储过程无效。

使用此选项创建的过程不能在SQL Server 复制过程中发布。EXECUTE AS

指定在其中执行存储过程的安全上下文。

有关详细信息,请参阅EXECUTE AS 子句(Transact-SQL)。FOR REPLICATION

指定不能在订阅服务器上执行为复制创建的存储过程。使用FOR

REPLICATION 选项创建的存储过程可用作存储过程筛选器,且

只能在复制过程中执行。如果指定了FOR REPLICATION,则

无法声明参数。对于CLR 存储过程,不能指定FOR

REPLICATION。对于使用FOR REPLICATION 创建的过程,

忽略RECOMPILE 选项。

FOR REPLICATION 过程将在sys.objects和

sys.procedures中包含RF对象类型。

要包含在过程中的一个或多个Transact-SQL 语句。有关某些

适用的限制的信息,请参阅“备注”部分。

EXTERNAL NAME assembly_name.class_name.method_name 指定 .NET Framework 程序集的方法,以便CLR 存储过程引

用。class_name必须为有效的SQL Server 标识符,并且该

类必须存在于程序集中。如果类包含一个使用句点(.) 分隔命名

空间各部分的限定命名空间的名称,则必须使用方括号([]) 或

引号("") 将类名称分隔开。指定的方法必须为该类的静态方法。

注意:

备注

存储过程没有预定义的最大大小。

只能在当前数据库中创建用户定义存储过程。临时过程对此是个例外,因为它们总是在tempdb中创建。如果未指定架构名称,则使用创建过程的用户的默认架构。有关架构的详细信息,请参阅用户架构分离。在单个批处理中,CREATE PROCEDURE 语句不能与其他Transact-SQL 语句组合使用。

默认情况下,参数可为空值。如果传递NULL 参数值并且在CREATE 或ALTER TABLE 语句中使用该参数,而该语句中被引用列又不允许使用空值,则数据库引擎会产生一个错误。若要阻止向不允许使用空值的列传递NULL,请为过程添加编程逻辑,或使用CREATE TABLE 或ALTER TABLE 的DEFAULT 关键字,以便对该列使用默认值。

建议对于临时表中的每列,显式指定NULL 或NOT NULL。如果在CREATE TABLE 或ALTER TABLE 语句中未进行指定,则

ANSI_DFLT_ON 和ANSI_DFLT_OFF 选项将控制数据库引擎为列指派NULL 或NOT NULL 属性的方式。如果某个连接执行的存储过程对这些选项的设置与创建该过程的连接的设置不同,则为第二个连接

创建的表列可能会有不同的为空性,并且显示出不同的行为。如果为每个列显式声明了NULL 或NOT NULL,那么将对所有执行该存储过程的连接使用相同的为空性创建临时表。

使用SET 选项

在创建或修改Transact-SQL 存储过程时,数据库引擎将保存SET QUOTED_IDENTIFIER 和SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的SET QUOTED_IDENTIFIER 和SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在创建或更改存储过程时不保存其他SET 选项(例如SET ARITHABORT、SET ANSI_WARNINGS 或SET

ANSI_PADDINGS)。如果存储过程的逻辑取决于特定的设置,则应在过程开头添加一条SET 语句,以确保设置正确。从存储过程中执行SET 语句时,该设置只在存储过程完成之前有效。之后,设置将还原为调用存储过程时的值。这样一来,单个客户端就可以设置所需的选项,而不会影响存储过程的逻辑。

注意:

使用CLR 存储过程的参数

CLR 存储过程的参数可以是标量SQL Server 系统数据类型的任何一种。

为了使数据库引擎在 .NET Framework 中被重载时引用正确的方法, 中指示的方法必须具有下列特征:

?声明为静态方法。

?接收的参数个数与过程的参数个数相同。

?不能是类的构造函数或析构函数。

?使用的参数类型与SQL Server 过程的相应参数的数据类型兼容。

有关将SQL Server 数据类型与 .NET Framework 数据类型匹配的信息,请参阅SQL Server Data Types and Their .NET

Framework Equivalents。

?返回void,或者返回类型为SQLInt32、SQLInt16、System.Int32或System.Int16的值。

?如果对于任何特定的参数声明都指定了OUTPUT,则按照引用返回它的参数,而不是按照值返回。

获得有关存储过程的信息

若要显示Transact-SQL 存储过程的定义,请使用该过程所在的数据库中的sys.sql_modules目录视图。

例如:

复制代码

sys.objects.object_id AND TYPE = 'P';

注意:

若要获取有关某过程引用的对象的报表,请查询

sys.sql_dependencies目录视图或使用sp_depends。

sp_depends不返回有关CLR 存储过程引用的对象的信息。若要显示有关CLR 存储过程的信息,请使用该过程所在的数据库中的sys.assembly_modules目录视图。

若要显示有关存储过程中定义的参数的信息,请使用该过程所在的数据库中的sys.parameters目录视图。

延迟名称解析

可以创建引用尚不存在的表的存储过程。在创建时,只进行语法检查。直到第一次执行该存储过程时才对其进行编译。只有在编译过程中才解

析存储过程中引用的所有对象。因此,如果语法正确的存储过程引用了不存在的表,则仍可以成功创建;但如果引用的表不存在,则存储过程将在运行时失败。有关详细信息,请参阅延迟名称解析和编译。

执行存储过程

当执行用户定义的存储过程时,无论是在批中还是在模块(例如用户定义的存储过程或函数)内,极力建议使用架构名称来限定存储过程名。如果存储过程编写为可以接受参数值,则可以提供参数值。该值必须是常量或变量。不能指定函数名作为参数值。变量可以是用户定义变量或系统变量,例如@@SPID。

有关详细信息,请参阅执行存储过程(数据库引擎)。

第一次执行某个过程时,将编译该过程以确定检索数据的最优访问计划。如果已经生成的计划仍保留在数据库引擎计划缓存中,则存储过程随后执行的操作可能重新使用该计划。有关详细信息,请参阅执行计划的缓存和重新使用。

使用cursor 数据类型的参数

Transact-SQL 存储过程只能将cursor数据类型用于OUTPUT

参数。如果为某个参数指定了cursor数据类型,则还需要VARYING 和OUTPUT 参数。如果为某个参数指定了VARYING 关键字,则数

据类型必须是cursor,并且必须指定OUTPUT 关键字。有关详细信息,请参阅在OUTPUT 参数中使用cursor 数据类型。

临时存储过程

数据库引擎支持两种临时过程:局部临时过程和全局临时过程。局部临时过程只对创建该过程的连接可见。全局临时过程则可由所有连接使用。局部临时过程在当前会话结束时将被自动删除。全局临时过程在使用该过程的最后一个会话结束时被删除。有关详细信息,请参阅创建存储过程(数据库引擎)。

自动执行存储过程

SQL Server 启动时可以自动执行一个或多个存储过程。这些存储过程必须由系统管理员在master数据库中创建,并以sysadmin固定服务器角色作为后台进程执行。这些过程不能有任何输入或输出参数。有关详细信息,请参阅自动执行存储过程。

存储过程嵌套

存储过程可以被嵌套。这表示一个存储过程可以调用另一个存储过程。在被调用过程开始运行时,嵌套级将增加,在被调用过程运行结束后,嵌套级将减少。存储过程最多可以嵌套32 级。有关详细信息,请参

阅嵌套存储过程。

若要估计编译后的存储过程大小,请使用下列性能监视器计数器。

* 各种类别的缓存对象均可以使用这些计数器,包括即席sql、准备好的sql、过程、触发器等。

有关详细信息,请参阅SQL Server Plan Cache 对象。

限制

可以在存储过程中指定除了SET SHOWPLAN_TEXT 和SET SHOWPLAN_ALL 以外的任何SET 语句。这些语句在批处理中必须唯一。选择的SET 选项在存储过程执行过程中有效,之后恢复为原来的设置。

如果用户不是存储过程所有者,则在使用存储过程时,必须使用对象架构名称对存储过程内所有数据定义语言(DDL) 语句(例如CREATE、ALTER 或DROP 语句、DBCC 语句、EXECUTE 和动态SQL 语句)中使用的对象名进行限定。有关详细信息,请参阅设计存储过程(数据库引擎)。

权限

需要在数据库中有CREATE PROCEDURE 权限,对在其中创建过程的架构有ALTER 权限。

对于CLR 存储过程,需要对 中引用的程序集的所有权,或拥有对该程序集的REFERENCES 权限。

示例

A. 使用简单过程

以下存储过程将从视图中返回所有雇员(提供姓和名)、职务以及部门名称。此存储过程不使用任何参数。

复制代码

USE AdventureWorks;

GO

IF OBJECT_ID ( 'https://www.360docs.net/doc/4d14755811.html,pGetAllEmployees', 'P' ) IS NOT NULL

DROP PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetAllEmployees; GO

CREATE PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetAllEmployees AS

SELECT LastName, FirstName, JobTitle, Department FROM HumanResources.vEmployeeDepartment;

GO

uspGetEmployees存储过程可通过以下方式执行:

复制代码

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetAllEmployees;

GO

-- Or

EXEC https://www.360docs.net/doc/4d14755811.html,pGetAllEmployees;

GO

-- Or, if this procedure is the first statement within a batch:

https://www.360docs.net/doc/4d14755811.html,pGetAllEmployees;

B. 使用带有参数的简单过程

下面的存储过程只从视图中返回指定的雇员(提供名和姓)及其职务和部门名称。此存储过程接受与传递的参数精确匹配的值。

复制代码

USE AdventureWorks;

GO

IF OBJECT_ID ( 'https://www.360docs.net/doc/4d14755811.html,pGetEmployees', 'P' ) IS NOT NULL

DROP PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetEmployees; GO

CREATE PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetEmployees

@LastName nvarchar(50),

@FirstName nvarchar(50)

AS

SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment

WHERE FirstName = @FirstName AND LastName =

@LastName;

GO

uspGetEmployees存储过程可通过以下方式执行:

复制代码

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees N'Ackerman', N'Pilar';

-- Or

EXEC https://www.360docs.net/doc/4d14755811.html,pGetEmployees @LastName =

N'Ackerman', @FirstName = N'Pilar';

GO

-- Or

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman';

GO

-- Or, if this procedure is the first statement within a batch:

https://www.360docs.net/doc/4d14755811.html,pGetEmployees N'Ackerman',

N'Pilar';

C. 使用带有通配符参数的简单过程

以下存储过程只从视图中返回指定的一些雇员(提供名和姓)及其职务和部门名称。此存储过程模式与所传递的参数相匹配;或者,如果未提供参数,则使用预设的默认值(以字母D打头的姓)。

复制代码

USE AdventureWorks;

GO

IF OBJECT_ID ( 'https://www.360docs.net/doc/4d14755811.html,pGetEmployees2',

'P' ) IS NOT NULL

DROP PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2; GO

CREATE PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2

@LastName nvarchar(50) = N'D%',

@FirstName nvarchar(50) = N'%'

AS

SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment

WHERE FirstName LIKE @FirstName

AND LastName LIKE @LastName;

GO

uspGetEmployees2存储过程可使用多种组合执行。下面只显示了几个组合:

复制代码

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2;

-- Or

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2 N'Wi%';

-- Or

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2 @FirstNname = N'%';

-- Or

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2

N'[CK]ars[OE]n';

-- Or

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2 N'Hesse',

N'Stefen';

-- Or

EXECUTE https://www.360docs.net/doc/4d14755811.html,pGetEmployees2 N'H%', N'S%';

D. 使用OUTPUT 参数

以下示例将创建uspGetList存储过程。此过程将返回价格不超过指定数值的产品的列表。此示例显示如何使用多个SELECT语句和多个OUTPUT参数。OUTPUT 参数允许外部过程、批处理或多条Transact-SQL 语句在过程执行期间访问设置的某个值。

复制代码

USE AdventureWorks;

GO

IF OBJECT_ID ( 'https://www.360docs.net/doc/4d14755811.html,pGetList', 'P' ) IS NOT NULL

DROP PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetList;

GO

CREATE PROCEDURE https://www.360docs.net/doc/4d14755811.html,pGetList @Product varchar(40)

, @MaxPrice money

, @ComparePrice money OUTPUT

, @ListPrice money OUT

AS

SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'

FROM Production.Product AS p

JOIN Production.ProductSubcategory AS s

ON p.ProductSubcategoryID =

s.ProductSubcategoryID

WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;

-- Populate the output variable @ListPprice.

SET @ListPrice = (SELECT MAX(p.ListPrice)

FROM Production.Product AS p

JOIN Production.ProductSubcategory AS s

ON p.ProductSubcategoryID =

s.ProductSubcategoryID

WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);

-- Populate the output variable @compareprice.

SET @ComparePrice = @MaxPrice;

GO

执行uspGetList,返回价格低于$700的Adventure Works 产品(自行车)的列表。OUTPUT参数@Cost和@ComparePrices用于流控制语言,以便在“消息”窗口中返回消息。

注意:

复制代码

下面是部分结果集:

复制代码

Product List Price

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

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

Road-750 Black, 58 539.99 Mountain-500 Silver, 40 564.99 Mountain-500 Silver, 42 564.99 ...

Road-750 Black, 48 539.99 Road-750 Black, 52 539.99 (14 row(s) affected)

These items can be purchased for less than $700.00.

E. 使用WITH RECOMPILE 选项

如果为过程提供的参数不是典型的参数,并且新的执行计划不应被缓存或存储在内存中,则WITH RECOMPILE子句会很有用。

复制代码

USE AdventureWorks;

GO

IF OBJECT_ID ( 'https://www.360docs.net/doc/4d14755811.html,pproduct_by_vendor', 'P' ) IS NOT NULL

DROP PROCEDURE https://www.360docs.net/doc/4d14755811.html,pProductByVendor;

GO

CREATE PROCEDURE https://www.360docs.net/doc/4d14755811.html,pProductByVendor @Name varchar(30) = '%'

WITH RECOMPILE

AS

SELECT https://www.360docs.net/doc/4d14755811.html, AS 'Vendor name', https://www.360docs.net/doc/4d14755811.html, AS 'Product name'

FROM Purchasing.Vendor AS v

JOIN Purchasing.ProductVendor AS pv

ON v.VendorID = pv.VendorID

JOIN Production.Product AS p

ON pv.ProductID = p.ProductID

WHERE https://www.360docs.net/doc/4d14755811.html, LIKE @Name;

GO

F. 使用WITH ENCRYPTION 选项

存储过程与触发器实验

第一章存储过程与触发器实验 实验目的 1.理解存储过程的工作原理和作用。 2.掌握存储过程设置和程序设计过程。 3.理解触发器的工作原理和作用。 4.掌握触发器编写方法。 实验环境 采用IBM DB2或Sybase数据库管理系统作为实验平台。其中,DB2可以采用DB2 Express-C或DB2 V8 Enterprise。 实验完成人:李肇臻,谢锦 实验内容 一、存储过程实验 1.针对下面2个完整性约束条件,建立存储过程,实现当数据导入或更新时,可以自动修改拥塞率、半速率话务量比例 (1)拥塞率=拥塞数量/呼叫数量 (2)半速率话务量比例=半速率话务量/全速率话务量 在DB2CMD中运行,win7用管理员权限。 create procedure M() language SQL begin update CALLDATA set "callcongs"="congsnum"/"callnum" where "congsnum"<>0 and "callnum"<>0; update CALLDATA set "rate"="thtraff"/"traff" where "thtraff"<>0 and "traff"<>0; end @ 2.将存储过程添加到数据库服务器上

3.在客户端编写调用存储过程的主程序 4.运行客户端程序,调用存储过程,观察存储过程执行过程和数据更新情况;调用就用db2 CALL M() 二、触发器实验 1. 针对下列约束条件,分别建立1个触发器: 1)每个小区/扇区最多占用14个TCH频点,合法频点范围在[1,60]之间。当向小区中新加入频点时,如果小区中现有频点数目已达到14个,则用新加入的频点替换现有频点中的最小频点;当修改或新加入频点时,如果发现频点不在合法范围内,则输出提示信息,并拒绝该操作。 create trigger first_1 after insert on FREQUENCY

数据库原理课程设计实验[创建存储过程与触发器]

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、 星 期五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。

假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地 址、联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主 键,可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、 管理员编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为 超期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后 再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管 理员级别等……。 6.职工档案表表。作用:记录职工档案。至少包括: 职工编号、姓名、性别、单 位、职称、职务、出生日期、学历、……其它字段自拟。

ORACLE存储过程

ORACLE提供了四种类型的可存储的程序: 函数, 过程. 包,触发器 一.声明部分(Declarationsection) (1)声明部分包含了变量和常量的数据类型和初始值 (2)这个部分是由关键字DECLARE开始 (3)如果不需要声明变量或常量,那么可以忽略这一部分; 二.执行部分(Executablesection) (1)执行部分是PL/SQL块中的指令部分, (2)由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 三.异常处理部分(Exceptionsection) 这一部分是可选的,在这一部分中处理异常或错误。 过程存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用。 1.创建存储过程 CREATE[ORREPLACE]PROCEDURE过程名 (参数1{IN/OUT/INOUT}类型, 参数2{IN/OUT/INOUT}类型, …….

参数N{IN/OUT/INOUT}类型, )IS/AS 过程体 BEGIN END存储过程名字 说明: (1)ORREPLACE关键字可选,但一般会使用,功能为如果同名的过程已存在,则删除同名过程,然后重建,以此来实现修改过程的目的。 (2)过程可以包括多个参数,参数模式有IN/OUT/INOUT三种,默认为IN,也可以没参数。 (3)IS/AS键字也等价 (4)过程体为该过程的代码部分,是一个含有声明部分,执行部分和异常处理部分的PL/SQL块。但需要注意的是,在过程的声明体中不能使用DECLARE关键字,由IS或AS来代替。 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 2.查看过程

测验答案-第13章存储过程的创建与管理

测验 填空题 (1) 在SQL Server 2005中,3种基本存储过程的类型分别是、和。 答案:用户自定义存储过程,系统存储过程,扩展存储过程 (2) 在SQL Server 2005中,用户既可以使用语言编写存储过程,也可以使用方式创建存储过程。 答案:Transact-SQL,CLR (3) 如果在存储过程中定义了输出参数,则必须使用关键词说明。 答案:OUTPUT 选择题 (1) 可以使用哪个系统目录视图查看存储过程定义的文本。 A. B. C. D. 答案:C (2) 通过下列哪个系统存储过程可以查看存储过程与其他数据库对象的依赖关系。 A. sp_help B. sp_rename C. sp_depend D. sp_depends 答案:D (3) 下列哪种方式不能重新编译存储过程。 A. 使用sp_recompile系统存储过程 B. 在CREATE PROCEDURE语句中使用WITH RECOMPILE C. 在EXECUTE语句中使用WITH RECOMPILE子句 D. 使用系统存储过程sp_depends 答案:D (4) 下列哪个命令可以在存储过程的定义中使用。 A. CREATE VIEW B. CREATE TABLE C. CREATE DEFAULT D. CREATE RULE 答案:B 判断题 (1) 可以使用其他.NET架构下的语言,如C#编写存储过程并部署到SQL Server 2005。 答案:√ (2) 创建存储过程的命令关键词CREATE PROCEDURE不可以缩写。 答案:× (3) 数据库BlueSkyDB中的存储过程PrcDeleteBook用于删除Books表中的记录,如果用

oracle自定义函数和存储过程

oracle自定义函数和存储过程 oracle自定义函数和存储过程(转)2008-07-23 10:43--过程(PROCEDURE)--------------------------------------------------// --创建表 CREATE TABLE user_info ( id VARCHAR2(4), name VARCHAR2(15), pwd VARCHAR2(15), address VARCHAR2(30) ); --插入数据 INSERT INTO user_info VALUES('u001','zhao','zhao','shanghai'); --如要经常执行插入,Oracle每次都要进行编译,并判断语法正确性,因此执行速度可想而知, --所以我们要创建一个过程来实现 CREATE OR REPLACE PROCEDURE AddNewUser ( n_id user_info.id%TYPE, n_name user_https://www.360docs.net/doc/4d14755811.html,%TYPE, n_pwd user_info.pwd%TYPE, n_address user_info.address%TYPE ) AS BEGIN --向表中插入数据 INSERT INTO user_info(id,name,pwd,address) VALUES(n_id,n_name,n_pwd,n_address); END AddNewUser; / --下面我们利用PL/SQL匿名块调用该过程 DECLARE --描述新用户的变量 v_id user_info.id%TYPE := 'u002'; v_name user_https://www.360docs.net/doc/4d14755811.html,%TYPE := 'wish'; v_pwd user_info.pwd%TYPE := 'history'; v_add user_info.address%TYPE := 'shanghai'; BEGIN --调用过程,添加wish用户到数据库

存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器 班级:惠普测试142 学号:1408090213 姓名:闫伟明 日期:2016-11-14

1 实验目的: 1)掌握SQL进行存储过程创建和调用的方法; 2)掌握SQL进行触发器定义的方法,理解触发器的工作原理; 3)掌握触发器禁用和重新启用的方法。 2 实验平台: 操作系统:Windows xp。 实验环境:SQL Server 2000以上版本。 3 实验内容与步骤 利用实验一创建的sch_id数据库完成下列实验内容。 1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。 存储过程定义代码: CREATE PROCEDURE JSXX_PROC AS SELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND https://www.360docs.net/doc/4d14755811.html,o=https://www.360docs.net/doc/4d14755811.html,o 存储过程执行语句与执行结果截图: EXECUTE JSXX_PROC 2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、 所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。 存储过程定义代码:

CREATE PROCEDURE XM_PROC @sname VARCHAR(100) AS BEGIN IF EXISTS(SELECT NULL FROM S WHERE sn=@sname) SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE https://www.360docs.net/doc/4d14755811.html,o=https://www.360docs.net/doc/4d14755811.html,o AND SC.sno=S.sno AND S.sn=@sname ELSE PRINT'无该姓名的同学。' END 运行截图: 3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业), 统计并显示该专业各年龄段男、女生人数。如果没有该专业,则显示“无此专业”。 存储过程定义代码: CREATE PROCEDURE XBNL_PROC @departName VARCHAR(30)='计算机', @begin INT, @end INT AS

ORACLE存储过程开发基础语法

ORACLE存储过程开发基础语法 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名变量类型) begin --储备过程的执行体 end test; 打印出输入的时刻信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd')); end test; 2、变量赋值 变量名:= 值; E.g: create or replace procedure test(workDate in Date) is x number(4,2); begin x := 1; end test; 3、判定语句:

if 比较式then begin end; end if; E.g create or replace procedure test(x in number) is begin if x >0 then begin x := 0 - x; end; end if; if x = 0 then begin x: = 1; end; end if; end test; 4、For 循环 For ... in ... LOOP --执行语句 end LOOP; (1)循环遍历游标 create or replace procedure test() as Cursor cursor is select name from student; name varchar(20);

实验六 存储过程和触发器

实验六存储过程与触发器 一、目的与要求 1.掌握编写数据库存储过程的方法。 2.掌握建立数据库触发器的方法,通过实验观察触发器的作用与触发条件设置 等相关操作。 二、实验准备 1.了解编写存储过程与调用的T-SQL语法; 2.了解触发器的作用; 3.了解编写触发器的T-SQL语法。 三、实验内容 (一)存储过程 在studentdb数据库中建立存储过程getPractice,查询指定院系(名称)(作为存储过程的输入参数)中参与“实践”课程学习的所有学生学号、姓名、所学课程编号与课程名称,若院系不存在,返回提示信息。 提示:D_Info表中存储了院系代码D_ID,而St_Info表中学号字段St_ID的前两位与之对应,则D_Info表与St_Info表之间的联系通过这两个字段的运算构成连接条件。 1.分别执行存储过程getPractice,查询“法学院”与“材料科学与工程学院” 的学生中参与“实践”课程的所有学生学号、姓名、所学课程编号与课程名称。 create procedure getPractice @D_Name varchar(30) output as begin if not exists (select * from D_Info where D_Name= @D_Name ) print '对不起,该院系不存在' else select st_info、St_ID,C_Info、C_No,C_Name from s_c_info inner join st_info on st_info、St_ID=s_c_info、st_id inner join C_Info on s_c_info、c_no=C_Info、C_No where st_info、St_ID in ( select St_ID from st_info join D_Info on D_Info、D_ID =left(st_info、St_ID,2) where C_Info、C_Type='实践' and D_Info、D_Name= @D_Name ) end go

实验6 数据库实验——存储过程和触发器

实验6 存储过程与触发器 一、实验目的 1、加深与巩固对存储过程与触发器概念的理解。 2、掌握触发器的简单应用。 3、掌握存储过程的简单应用。 二、实验内容 一)存储过程: 1、创建一存储过程,求l+2+3+…+n,并打印结果。 CREATE PROCEDURE addresult AS DECLARE @n int=10,/*最后一个数*/ @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。EXEC addresult

3、修改上述存储过程为addresult1,使得@n为输入参数,其具体值由用户调用此存储过程时指定。 CREATE PROCEDURE addresult1 @n int=10 /*最后一个数*/ AS DECLARE @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 4、调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。 EXEC addresult1 100 5.修改上述存储过程为addresult2,将@n参数设定默认值为10,并改设@sum为输出参数,让主程序能够接收计算结果。

实验六管理存储过程11页word

实验六存储过程与触发器一、存储过程 【创建存储过程】: CREATE PROCEDURE [OWNER].[PROCEDURE NAME] AS 如:Use pubs Go Create procedure author_information As select au_lname,au_fname,title,pub_name from authors a join titleauthor ta on a.au_id=ta.au_id join titles t on t.title_id=ta.title_id join publishers p on t.pub_id=p.pub_id Go 【管理存储过程】: ?可以使用sp_helptext命令查看创建存储过程的文本信息。 Use pubs Go Sp_helptext author_information

Go ?可以用sp_help查看存储过程的一般信息。 Use pubs Go Sp_help author_information Go ?可以使用系统存储过程sp_rename修改存储过程的名字。 Use pubs Go Sp_rename author_information ,authors_information Go ?也可以使用企业管理浏览存储过程的信息,具体方法是: ?从树型结构上选中存储过程所在的数据库节点,展开该节点; ?选中数据库节点下的〖存储过程〗节点,则右边的列表列出了数据库中目前所 有的存储过程; ?选中存储过程,右击,执行〖属性〗命令, 则系统将弹出如图所示对话框。 ?可以在对话框中修改存储过程内容,并保 存修改。 ?如果想知道某个表被存储过程引用的情 况,可以使用sp_depends, Sp_depends authors

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) ,

存储过程与触发器 实验报告

信息工程学院实验报告 课程名称:《数据库原理》 实验项目名称:存储过程与触发器 一、实验目的: (1)了解存储过程的概念 (2)掌握创建、执行存储过程的方法 (3)了解查看、修改和删除存储过程的方法 (4)了解触发器的概念 (5)掌握创建触发器的方法 (6)掌握查看、修改、删除触发器信息的方法 二、实验设备与器件 Win7 +Sql server 2008 三、实验内容与步骤 (一)存储过程 运行实验四附录中的SQL语句,准备实验数据。然后创建下列存储过程,并调试运行存储过程,查看运行结果。 1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。 CREATE PROCEDURE StuInfo AS SELECT SNO AS学号, SNAME AS姓名, SSEX AS性别, SAGE AS年龄, DNO AS系号 FROM student WHERE DNO='D2' 结果: stuinfo 2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。

use mydb --查询是否已存在此存储过程,如果存在,就删除它 if exists(select name from sysobjects where name='StuScoreInfo'and type='P') drop procedure StuScoreInfo go --创建存储过程 CREATE PROCEDURE StuScoreInfo as select student.sno as学号, sname as姓名, ssex as性别, https://www.360docs.net/doc/4d14755811.html,ame as课程名称, study.grade as考试分数 from student,course,study where student.sno=study.sno and https://www.360docs.net/doc/4d14755811.html,o=https://www.360docs.net/doc/4d14755811.html,o 结果: StuScoreInfo 3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。 if exists(select name from sysobjects where name='stu_info'and type='P') drop procedure stu_info go --创建存储过程 create procedure stu_info @sno varchar(8) as select sno as学号, sname as姓名, ssex as性别, sage as年龄, dno as年级

第二章 数据库的创建与管理1

第二章数据库的创建与管理 2.1 SQL Server数据库 2.1.1 数据库的结构 2.1.2 系统数据库 2..2 使用企业管理器创建数据库 2.2.1企业管理器的工作界面 2.2.2企业管理器创建用户数据库 2.2.3向导创建用户数据库 2.3使用T-SQL语句创建数据库 2.3.1查询分析器 2.3.2 用T-SQL语句创建数据库 2.4 修改和删除数据库 2.4.1 修改数据库 2.4.2 删除数据库 2..5 数据库迁移 2.5.1分离和附加数据库 2.5.2 导入和导出数据

2.1 SQL Server数据库 2.1.1 数据库的结构 2.1数据库的存储结构 数据库的存储结构分为逻辑存储结构和物理存储结构两种。 数据库的逻辑存储结构指的是,SQL Server的数据库是由诸如表、视图、索引等各种不同的数据库对象所组成。 数据库的物理存储结构是讨论数据库文件是如何在磁盘上存储的,数据库在磁盘上是以文件为单位存储的,由数据库文件和事务日志文件组成,一个数据库至少应该包含一个数据库文件和一个事务日志文件。 一、数据库文件 1.主数据库文件(Primary Database File) 一个数据库可以有一个或多个数据库文件,一个数据库文件只能属于一个数据库。当有多个数据库文件时,有一个文件被定义为主数据库文件(简称为主文件),其扩展名为mdf 主数据库文件用来存储数据库的启动信息以及部分或者全部数据,是所有数据库文件的起点,包含指向其它数据库文件的指针。一个数据库只能有一个主数据库文件。 2.次数据库文件(Secondary Database File) 用于存储主数据库文件中未存储的剩余数据和数据库对象,一个数据库可以没有次数据库文件,但也可以同时拥有多个辅助数据库文件。 次数据库文件的扩展名为ndf(简称为辅助文件)。 3.事务日志文件 存储数据库的更新情况等事务日志信息,当数据库损坏时,管理员使用事务日志恢复数据库。 每一个数据库至少必须拥有一个事务日志文件,而且允许拥有多个日志文件。事务日志文件的扩展名为ldf,日志文件的大小至少是512KB。 SQL Server事务日志采用提前写入的方式 SQL Server 2000的文件拥有两个名称,即逻辑文件名和物理文件名。当使用Transact-SQL 命令语句访问某一个文件时,必须使用该文件的逻辑名。 物理文件名是文件实际存储在磁盘上的文件名,而且可包含完整的磁盘目录路径。 SQL Server 2000用文件来存放数据库,数据库文件有三类。 1.主数据库文件(Primary):(1)存储数据库的启动信息,是所有数据库文件的起点,包含 指向其它数据库文件的指针 (2)存放数据,每个数据库都必须有一个主数据文件。 2.次要数据文件(Secondary):存放数据,一个数据库可以没有也可以有多个Secondary 文件。 3.事务日志文件(Transaction Log):存放事务日志,每个数据库至少有一个或多个日志文 件。

用ORACLE存储过程创建成简单的报表

用ORACLE存储过程创建成简单的报表 第一步:CREATE OR REPLACE PROCEDURE xxxxxxxxxxx(errormsg OUT VARCHAR2, errorcode OUT VARCHAR2, p_to_class_input IN VARCHAR2, p_segment1_input IN VARCHAR2 ) IS BEGIN /*dbms_output.put_line(*/ fnd_file.put_line(fnd_file.output, '物料' || CHR(9) || '物料说明' || CHR(9) || '目标基本单位' || CHR(9) || '目标分类' || CHR(9) || ); FOR cur1 IN (SELECT DISTINCT msi.SEGMENT1 物料, msi.DESCRIPTION 物料说明, mucc.TO_UNIT_OF_MEASURE 目标基本单位, mucc.TO_UOM_CLASS 目标分类, FROM a mucc, b msi, c fu, FND_USER fu1, mtl_categories mtl, mtl_item_categories mic WHERE1 = 1 AND mucc.INVENTORY_ITEM_ID = msi.INVENTORY_ITEM_ID AND msi.INVENTORY_ITEM_ID = mic.INVENTORY_ITEM_ID AND mucc.INVENTORY_ITEM_ID = mic.INVENTORY_ITEM_ID AND mucc.CREATED_BY = https://www.360docs.net/doc/4d14755811.html,ER_ID AND https://www.360docs.net/doc/4d14755811.html,ST_UPDATED_BY = https://www.360docs.net/doc/4d14755811.html,ER_ID AND https://www.360docs.net/doc/4d14755811.html,ANIZATION_ID = https://www.360docs.net/doc/4d14755811.html,ANIZATION_ID AND mtl.CATEGORY_ID = mic.CATEGORY_ID AND mtl.SEGMENT1 = 'RA' AND mtl.SEGMENT2 = nvl(P_TO_CLASS_INPUT, mtl.SEGMENT2) AND msi.SEGMENT1 = NVL(P_SEGMENT1_INPUT, msi.SEGMENT1) ) LOOP

实验2 数据库的创建和管理

实验2 数据库的创建和管理 学号: 2011193158 姓名:韩江玲 一、实验目的: 1、掌握使用企业管理器创建SQL Server数据库的方法; 2、掌握使用T-SQL语言创建SQL Server数据库的方法; 3、掌握附加和分离数据库的方法; 4、掌握使用企业管理器或存储过程查看SQL数据库属性的方法; 5、熟悉数据库的收缩、更名和删除; 6、掌握使用企业管理器或sp_dboption存储过程修改数据库选项的方法。 二、实验内容和步骤: 本次实验所创建数据库(包括数据库文件和事务日志)存放位置都为“D:\TestDB”。因此首先在D盘下新建文件夹TestDB。 1. 数据库的创建 创建数据库的过程实际上就是为数据库设计名称、设计所占用的存储空间和文件存放位置的过程。 实验内容1:使用SQL Server企业管理器创建一个数据库,具体要求如下: 1)数据库名称为Test1。 2)主要数据文件:逻辑文件名为Test1_Data1,物理文件名为Test1_Data1.mdf,初始容量为1MB,最大容量为10MB,递增量为1MB。 3)次要数据文件:逻辑文件名为Test1_Data2,物理文件名为Test1_Data2.ndf,初始容量为1MB,最大容量为10MB,递增量为1MB。 4)事务日志文件:逻辑文件名为Test1_Log,物理文件名为Test1_Log.ldf,初始容量为1MB,大容量为5MB,递增量为1MB。其他选项为默认值。

注:我在创建数据库的时候,系统要求主文件(Test1_data1和Test1_data2)的大小不能小于3MB,所以在本例中我设置的主文件的初始大小均为3MB 实验内容2:用Transact-SQL(T-SQL)语句创建数据库,实验步骤:启动“查询分析器”,在编辑窗口输入SQL语句。 用T-SQL语句创建一个名为teach的数据库,它由5MB的主数据文件、2MB 的次数据文件和1MB的日志文件组成。并且主数据文件以2MB的增长速度增长,其最大容量为15MB;次数据文件以10%的增长速度增长,其最大容量为10MB;事务日志文件以1MB增长速度增长,其最大日志文件大小为10MB。运行完语句后,仔细查看结果框中的消息。 提示:在查询分析器中输入如下SQL语句。 CREATE DATABASE teach On (name= teach_data1, filename= 'd:\TestDB\teach_data1.mdf ', size=5,

如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程 (详解) 一、如何缔造java存储过程? 通常有三种步骤来缔造java存储过程。 1. 使用oracle的sql语句来缔造: e.g. 使用create or replace and compile java source named "" as 后边跟上java源程序。要求类的步骤必须是public static的,威力用于存储过程。 1.SQL> create or replace and compile java source named "javademo1 " 2. as 3. import java.sql.*; 4. public class JavaDemo1 5. { 6. public static void main(String[] argv) 7. { 8. System.out.println("hello, java demo1"); 9. } 10. } 11. / 12. 13.Java 已 14. 15.缔造。 16. 17.SQL> show errors java source "javademo1" 18.没有 19. 20.舛误。 21. 22.SQL> create or replace procedure javademo1 23. 2 as 24.3 language java name JavaDemo1.main(https://www.360docs.net/doc/4d14755811.html,ng.String[]); 25. 4 / 26. 27.过程已 28.

30. 31.SQL> set serveroutput on 32.SQL> call javademo1(); 33. 34.调用 35.实现。 36. 37.SQL> call dbms_java.set_output(5000); 38. 39.调用 40.实现。 41. 42.SQL> call javademo1(); 43.hello, java demo1 44. 45.调用 46.实现。 47. 48.SQL> call javademo1(); 49.hello, java demo1 50.调用 51.实现。 2. 使用外部class文件来装载缔造 e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。 1.public class OracleJavaProc 2.{ 3. public static void main(String[] argv) 4. { 5. System.out.println("Its a Java Oracle procedure."); 6. } 7.} 8. 9. 10.SQL> grant create any directory to scott; 11. 12.授权 13.顺利。 14. 15.SQL> conn scott/tiger@iihero.oracledb

《SQL Server 数据库》数据库存储过程、触发器的创建于管理实验报告

北华航天工业学院《数据库系统管理》 实验报告 报告题目: 存储过程、触发器的创建于管理 所在系部:计算机科学与工程系 所在专业:网络工程专业 学号: 姓名: 教师姓名: 完成时间:2011 年10 月19 日 北华航天工业学院教务处制

存储过程、触发器的创建与管理 一、实验目的 1、掌握存储过程的概念、优点、特点及用途; 2、掌握创建、执行、查看、修改和删除存储过程的方法; 3、了解触发器和一般存储过程的区别、概念及优点; 4、掌握创建、查看、修改和删除触发器的方法。 二、实验内容 (一)附加上次实验所创建的数据库“db_Library”,并回顾该数据库的数据表信息。 (二)练习创建和管理存储过程 1、使用管理控制台创建一个名为“计算机系借阅信息_PROC”的无参存储过程,要求显示计算机系读者2011-1-1以后借阅的图书信息,包括“读者姓名”、“图书编号”和“借阅日期”三个字段,并执行该存储过程,查看显示结果。 2、使用T-SQL语句创建一个名为“读者借阅信息_PROC”的带参数的存储过程,要求根据输入的读者的编号显示读者的所有借阅信息,包括“读者编号”、“姓名”、“系部”、“图书编号”、“图书名称”和“借阅日期”等字段,并执行该存储过程,查看显示结果。 create proc读者借阅信息_PROC1 @dzbh char(10) as begin select tb_reader.读者编号,姓名,系部, tb_book.图书编号,书名,借阅日期 from tb_book,tb_reader,tb_borrow where tb_book.图书编号=tb_borrow.图书编号 and tb_reader.读者编号=tb_borrow.读者编号 and tb_reader.读者编号=@dzbh end -- declare @srcs char(10),@fhzt int set @srcs='R10009' exec @fhzt=读者借阅信息_PROC1 @srcs print'执行状态值为'+cast(@fhzt as varchar(10)) 3、使用T-SQL语句创建一个名为“图书借阅信息_PROC”的带参数的存储过程,要求根据输入的图书编号计算该图书的借阅数量,并根据程序执行结果返回不同的值,执行成功返回0,不成

数据库存储过程与触发器实验报告

南昌航空大学实验报告 二00 年月日 课程名称:数据库概论实验名称:数据库存储过程与触发器 班级:122031 姓名:同组人: 指导教师评定:签名: 一、实验环境 1.Windows2000或以上版本; 2.SQLServer 2005。 二、实验目的 熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。 三、实验要求 完成实验指导书中p115-7和p132 -4。 四、实验步骤及参考源代码 1.创建与执行存储过程 create procedure C_P_Proc as select distinct https://www.360docs.net/doc/4d14755811.html,o,cna,pna,num from paper,customer,cp where https://www.360docs.net/doc/4d14755811.html,o=https://www.360docs.net/doc/4d14755811.html,o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' go execute C_P_Proc 2.删除存储过程 drop procedure C_P_Proc 3.创建插入触发器 create trigger TR_PAPER_I ON PAKER12203125 FOR INSERT AS DECLARE @appr float DECLARE @apno int SELECT @appr=ppr,@apno=pno from inserted begin if @appr<0 or @appr is null begin

raiserror('报纸的单价为空或小于!',16,1) update paper set ppr=10 where paper.pno=@apno end end 4.创建删除触发器 create Trigger TR_PAPER_D on PAKER12203125 after delete as declare @ipno char(6) declare @icount int; select @icount= count(*) from deleted,cp where deleted.pno=cp.pno if @icount>=1 begin select @ipno=pno from deleted raiserror('级联删除cp表中的数据',16,1) delete from cp where cp.pno=@ipno end 5.创建修改触发器 create trigger TR_PAPER_U ON PAKER12203125 for update as declare @ippr float select @ippr=ppr from inserted if @ippr<0 or @ippr is null begin raiserror('输入单价不正确',16,1) rollback transaction end 6. 分别对PAKER12203125表进行插入、修改、删除操作 insert into PAKER12203125 (pno,pna,ppr)values('000006','江西日报','1') insert into PAKER12203125 (pno,pna,ppr)values('000007','江南都市报','15.5') delete from PAKER12203125 where pno='000001' update PAKER12203125 set ppr=12.5 where pno='000002' update PAKER12203125 set ppr=-2 where pno='000004' 五、实验结果

相关文档
最新文档