当前位置:首页 » 存储配置 » 存储过程示例

存储过程示例

发布时间: 2022-10-14 21:41:24

Ⅰ 如何创建存储过程 (sql Server Management Studio) (转)

创建存储过程在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。展开“数据库”、存储过程所属的数据库以及“可编程性”。右键单击“存储过程”,再单击“新建存储过程”。在“查询”菜单上,单击“指定模板参数的值”。在“指定模板参数的值”对话框中,“值”列包含参数的建议值。接受这些值或将其替换为新值,再单击“确定”。在查询编辑器中,使用过程语句替换 SELECT 语句。若要测试语法,请在“查询”菜单上,单击“分析”。若要创建存储过程,请在“查询”菜单上,单击“执行”。若要保存脚本,请在“文件”菜单上,单击“保存”。接受该文件名或将其替换为新的名称,再单击“保存”。安全说明验证所有用户的输入。验证前请勿连接用户输入。绝对不要执行根据尚未验证的用户输入构造的命令。有关详细信息,请参阅SQL 注入。创建存储过程的示例在对象资源管理器中,连接到某个数据库引擎实例,再展开该实例。依次展开“数据库”、AdventureWorks2008R2 数据库和“可编程性”。右键单击“存储过程”,再单击“新建存储过程”。在“查询”菜单上,单击“指定模板参数的值”。在“指定模板参数的值”对话框中,输入下列所示的参数值。 参数值Author您的姓名Create Date今天的日期Description返回雇员数据。Procere_nameHumanResources.uspGetEmployees@Param1@LastName@Datatype_For_Param1nvarchar(50)Default_Value_For_Param1NULL@Param2@FirstName@Datatype_For_Param2nvarchar(50)Default_Value_For_Param2NULL单击“确定”。在查询编辑器中,使用以下语句替换 SELECT 语句: SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName = @FirstName AND LastName = @LastName;若要测试语法,请在“查询”菜单上,单击“分析”。如果返回错误消息,则请将这些语句与上述信息进行比较,并视需要进行更正。若要创建存储过程,请在“查询”菜单上,单击“执行”。若要保存脚本,请在“文件”菜单上,单击“保存”。输入新的文件名,再单击“保存”。若要运行存储过程,请在工具栏上单击“新建查询”。

Ⅱ oracle存储过程,如何获得详细的错误信息

create or replace procere proc_test( strAge in string, strName in string, ret_code out string, v_error_message out string) is
begin
declare
strsql varcchar(1024);
v_error_desc varcchar(1024);
begin
v_error_desc :='student';
strsql :='select name from student where age=100';
execute immediate strsql using strAge ;

v_error_desc :='teacher';
strsql :='select age from teacher where name=jill';
execute immediate strsql using strName ;

ret_code:=0;
v_error_desc :='OK';
v_error_message:='OK';
EXCEPTION
WHEN OTHERS THEN
ret_code := sqlcode;
v_error_desc := '错误位置:' || v_error_desc;
v_error_message := sqlerrm;
rollback;

end;
end proc_cancel_digital_id;

Ⅲ 如何编写存储过程

设计存储过程
几乎任何可写成批处理的 Transact-SQL 代码都可用于创建存储过程。

存储过程的设计规则
存储过程的设计规则包括:

CREATE PROCEDURE 定义本身可包括除下列 CREATE 语句以外的任何数量和类型的 SQL 语句,存储过程中的任意地方都不能使用下列语句: CREATE DEFAULT CREATE TRIGGER
CREATE PROCEDURE CREATE VIEW
CREATE RULE

可在存储过程中创建其它数据库对象。可以引用在同一存储过程中创建的对象,前提是在创建对象后再引用对象。

可以在存储过程内引用临时表。

如果在存储过程内创建本地临时表,则该临时表仅为该存储过程而存在;退出该存储过程后,临时表即会消失。

如果执行调用其它存储过程的存储过程,那么被调用存储过程可以访问由第一个存储过程创建的、包括临时表在内的所有对象。

如果执行在远程 Microsoft® SQL Server™ 2000 实例上进行更改的远程存储过程,则不能回滚这些更改。远程存储过程不参与事务处理。

存储过程中参数的最大数目为 2100。

存储过程中局部变量的最大数目仅受可用内存的限制。

根据可用内存的不同,存储过程的最大大小可达 128 MB。
有关创建存储过程的规则的更多信息,请参见 CREATE PROCEDURE。

限定存储过程内的名称
在存储过程内部,如果用于诸如 SELECT 或 INSERT 这样的语句的对象名没有限定用户,那么用户将默认为该存储过程的所有者。在存储过程内部,如果创建存储过程的用户没有限定 SELECT、INSERT、UPDATE 或 DELETE 语句中引用的表名,那么通过该存储过程对这些表进行的访问将默认地受到该过程的创建者权限的限制。

如果有其他用户要使用存储过程,则用于语句 ALTER TABLE、CREATE TABLE、DROP TABLE、TRUNCATE TABLE、CREATE INDEX、DROP INDEX、UPDATE STATISTICS 和 DBCC 的对象名必须用该对象所有者的名称限定。例如,Mary 拥有表 marytab,如果她希望其他用户能够执行使用该表的存储过程,必须在该表用于上述某一条语句时对其表名进行限定。

此规则是必需的,因为运行存储过程时将解析对象的名称。如果未限定 marytab,而 John 试图执行该过程,SQL Server 将查找 John 所拥有的名为 marytab 的表。

加密过程定义
如果要创建存储过程,并且希望确保其他用户无法查看该过程的定义,那么可以使用 WITH ENCRYPTION 子句。这样,过程定义将以不可读的形式存储。

存储过程一旦加密其定义即无法解密,任何人(包括存储过程的所有者或系统管理员)都将无法查看存储过程定义。

SET 语句选项
当 ODBC 应用程序与 SQL Server 连接时,服务器将自动设置会话的下列选项:

SET QUOTED_IDENTIFIER ON

SET TEXTSIZE 2147483647

SET ANSI_DEFAULTS ON

SET CURSOR_CLOSE_ON_COMMIT OFF

SET IMPLICIT_TRANSACTIONS OFF
这些设置将提高 ODBC 应用程序的可移植性。由于基于 DB-Library 的应用程序通常不设置这些选项,所以应在上述所列 SET 选项打开和关闭的情况下都对存储过程进行测试。这样可确保存储过程始终能正确工作,而不管特定的连接在唤醒调用该存储过程时可能设置的选项。需要特别设置其中一个选项的存储过程,应在开始该存储过程时发出一条 SET 语句。此 SET 语句将只对该存储过程的执行保持有效,当该存储过程结束时,将恢复原设置。

示例
A. 创建使用参数的存储过程
下例创建一个在 pubs 数据库中很有用的存储过程。给出一个作者的姓和名,该存储过程将显示该作者的每本书的标题和出版商。

CREATE PROC au_info @lastname varchar(40), @firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
JOIN publishers ON titles.pub_id = publishers.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO

将出现一条说明该命令未返回任何数据也未返回任何行的消息,这表示已创建该存储过程。

现在执行 au_info 存储过程:

EXECUTE au_info Ringer, Anne
GO

下面是结果集:

au_lname au_fname title pub_name
--------- --------- --------------------- ----------------
Ringer Anne The Gourmet Microwave Binnet & Hardley
Ringer Anne Is Anger the Enemy? New Moon Books

(2 row(s) affected)

B. 创建使用参数默认值的存储过程
下例创建一个存储过程 pub_info2,该存储过程显示作为参数给出的出版商所出版的某本书的作者姓名。如果未提供出版商的名称,该存储过程将显示由 Algodata Infosystems 出版的书籍的作者。

CREATE PROC pub_info2 @pubname varchar(40) = 'Algodata Infosystems'
AS
SELECT au_lname, au_fname, pub_name
FROM authors a INNER JOIN titleauthor ta ON a.au_id = ta.au_id
JOIN titles t ON ta.title_id = t.title_id
JOIN publishers p ON t.pub_id = p.pub_id
WHERE @pubname = p.pub_name

执行未指定参数的 pub_info2:

EXECUTE pub_info2
GO

下面是结果集:

au_lname au_fname pub_name
---------------- ---------------- --------------------
Green Marjorie Algodata Infosystems
Bennet Abraham Algodata Infosystems
O'Leary Michael Algodata Infosystems
MacFeather Stearns Algodata Infosystems
Straight Dean Algodata Infosystems
Carson Cheryl Algodata Infosystems
Dull Ann Algodata Infosystems
Hunter Sheryl Algodata Infosystems
Locksley Charlene Algodata Infosystems

(9 row(s) affected)

C. 执行用显式值替代参数默认值的存储过程
在下例中,存储过程 showind2 的 @table 参数默认值是 titles。

CREATE PROC showind2 @table varchar(30) = 'titles'
AS
SELECT TABLE_NAME = sysobjects.name,
INDEX_NAME = sysindexes.name, INDEX_ID = indid
FROM sysindexes INNER JOIN sysobjects ON sysobjects.id = sysindexes.id
WHERE sysobjects.name = @table

列标题(例如,TABLE_NAME)可使结果更具可读性。下面是该存储过程显示的 authors 表的情况:

EXECUTE showind2 authors
GO

TABLE_NAME INDEX_NAME INDEX_ID
---------- ---------- ----------
authors UPKCL_auidind 1
authors aunmind 2

(2 row(s) affected)

如果用户未提供值,则 SQL Server 将使用默认表 titles:

EXECUTE showind2
GO

下面是结果集:

TABLE_NAME INDEX_NAME INDEX_ID
---------- ---------- ----------
titles UPKCL_titleidind 1
titles titleind 2

(2 row(s) affected)

D. 使用参数默认值 NULL 创建存储过程
参数默认值可以是 NULL 值。在这种情况下,如果未提供参数,则 SQL Server 将根据存储过程的其它语句执行存储过程。不会显示错误信息。

过程定义还可指定当不给出参数时要采取的其它某种措施。例如:

CREATE PROC showind3 @table varchar(30) = NULL
AS IF @table IS NULL
PRINT 'Give a table name'
ELSE
SELECT TABLE_NAME = sysobjects.name,
INDEX_NAME = sysindexes.name, INDEX_ID = indid
FROM sysindexes INNER JOIN sysobjects
ON sysobjects.id = sysindexes.id
WHERE sysobjects.name = @table

E. 使用包含通配符的参数默认值创建存储过程
如果存储过程将参数用于 LIKE 关键字,那么默认值可包括通配符(%、_、[] 和 [^])。例如,可将 showind 修改为当不提供参数时显示有关系统表的信息:

CREATE PROC showind4 @table varchar(30) = 'sys%'
AS SELECT TABLE_NAME = sysobjects.name,
INDEX_NAME = sysindexes.name, INDEX_ID = indid
FROM sysindexes INNER JOIN sysobjects
ON sysobjects.id = sysindexes.id
WHERE sysobjects.name LIKE @table

在存储过程 au_info 的下列变化形式中,两个参数都有带通配符的默认值:

CREATE PROC au_info2 @lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
JOIN publishers ON titles.pub_id = publishers.pub_id
WHERE au_fname LIKE @firstname
AND au_lname LIKE @lastname

如果执行 au_info2 时不指定参数,将显示姓以字母 D 开头的所有作者:

EXECUTE au_info2
GO

下面是结果集:

au_lname au_fname title pub_name
-------- -------- --------------------- -------------------
Dull Ann Secrets of Silicon Val Algodata Infosystems
del Castillo Innes Silicon Val Gastrono Binnet & Hardley
DeFrance Michel The Gourmet Microwave Binnet & Hardley

(3 row(s) affected)

下例在两个参数的默认值已定义的情况下,省略了第二个参数,因此可找到姓为 Ringer 的所有作者的书和出版商:

EXECUTE au_info2 Ringer
GO

au_lname au_fname title pub_name
--------- --------- ---------------------- ----------------
Ringer Anne The Gourmet Microwave Binnet & Hardley
Ringer Anne Is Anger the Enemy? New Moon Books
Ringer Albert Is Anger the Enemy? New Moon Books
Ringer Albert Life Without Fear New Moon Books

(4 row(s) affected)

Ⅳ 存储过程如何把一个结果集放在一张表里面并返回来

结果集有必要放在表里面返回来,直接返回游标就可以了,结果集也可以看作是张表的。

DB2的的解决方案:
1.声明存储过程的时候,在声明之后添加 RESULT SETS 1,表示返回一个结果集,示例如下:
CREATE PROCEDURE YOUPRO(IN P_UserId INTEGER)
LANGUAGE SQL
RESULT SETS 1
------------------------------------------------------------------------
-- SQL 存储过程(获取用户信息)
------------------------------------------------------------------------
P1: BEGIN
--声明会使用到的参数
.... ....
... .....
2.在存储过程中声明一个游标,然后返回,示例如下:
DECLARE C1 CURSOR WITH RETURN FOR SELECT *FROM TABLE;
OPEN C1;

Oracle的解决方案:
1.先定义一个包,示例如下:
create or replace package CursorPackage as
type my_cursor is ref cursor;
end CursorPackage;
2.在存储过程返回参数使用这个定义的参数,示例如下:
create or replace procere YOUPRO(P_UserId IN NUMBER, C_Return OUT CursorPackage.my_cursor)IS ... ... ..
3.存储过程中,给返回参数赋值,示例如下:
OPEN C_Return FOR SELECT * FROM TABLE;

Sql Server的解决方案

直接返回SELECT * FROM TABLE,SqlServer中可以直接返回结果。

希望对你有帮助!

Ⅳ SQL Server存储过程中使用表值作为输入参数示例

在2008之前如果我们想要将表作为输入参数传递给SQL
Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入。
在2008中提供了表值参数。使用表值参数,可以不必创建临时表或许多参数,即可向
Transact-SQL
语句或例程(如存储过程或函数)发送多行数据,这样可以省去很多自定义的代码。这样的操作对于存储过程内基于表函数的操作变得非常容易操作。
表值参数是使用用户定义的表类型来声明的。所以使用之前要先定义表类型。
/*
创建表类型.*/
CREATE
TYPE
LocationTableType
AS
TABLE
(
LocationName
VARCHAR(50)
,
CostRate
INT
);
GO
/*
创建一个存储过程以表值参数作为输入.
*/
CREATE
PROCEDURE
dbo.
usp_InsertProctionLocation
@TVP
LocationTableType
READONLY
AS
SET
NOCOUNT
ON
INSERT
INTO
Proction.Location
(Name
,CostRate
,Availability
,ModifiedDate)
SELECT
*,
0,
GETDATE()
FROM
@TVP;
GO
/*
声明表值参数变量.*/
DECLARE
@LocationTVP
ASLocationTableType;
/*
将数据插入表值变量*/
INSERT
INTO
@LocationTVP(LocationName,
CostRate)
SELECT
Name,
0.00
FROM
Person.StateProvince;
/*
将变量传递给存储过程*/
EXEC
usp_InsertProctionLocation@LocationTVP;
GO
查询表Proction.Location可以看到数据已经插入了。

Ⅵ 何为存储过程,举例说明

存储过程,实际就是一段写在数据库中的代码。。

由于此段数据库操作代码由服务器完成,而客户端只是进行简单的参数提交,所以,可以有效的利用服务器的强劲而减小对客户机的负合。

如:你想插入一条数据到数据库。

虽然你的要求是,先检查表里面是否己存在该项。

如果不存在就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 等数据库没有此功能。

Ⅶ 什么是存储过程,access里可以弄存储过程吗

存储过程是一组为了完成特定功能的SQL语句集。
是利用数据库所提供的扩展-SQL语言所编写的程序。
编译后存储在数据库。

例如
SQL Server 有 T-SQL 写的存储过程
Oracle 有 PL/SQL 写的存储过程
DB2、MySQL 等, 都有自己的存储过程。

至于 Access,也可以写一些在 Access 里面执行的 VBA 代码。
在 Access 里面, 好像名字叫做 “宏”, 不叫做 “存储过程”。

Ⅷ mysql创建存储过程示例

1
用mysql客户端登入
2
选择数据库
mysql>use
test
3
查询当前数据库有哪些存储过程
mysql>show
procere
status
where
db='test'
4
创建一个简单的存储过程
mysql>create
procere
hi()
select
'hello';
5
存储过程创建完毕,看怎么调用它
mysql>call
hi();
显示结果
mysql>
call
hi();
+-------+
|
hello
|
+-------+
|
hello
|
+-------+
1
row
in
set
(0.00
sec)
query
ok,
0
rows
affected
(0.01
sec)
6
一个简单的储存过程就成功了

Ⅸ oracle怎么写存储过程

给你示例你参考下:
----------------------------建立存储过程:
CREATE OR REPLACE PROCEDURE P_name--存储过程名字
(
i_var in int, --输入参数1
o_var OUT varchar2 --输出参数1
)
IS
v_STR VARCHAR2(200); --定义存储过程内部的局部变量

BEGIN
--下面是存储过程的主体实现部分
v_STR := i_var;
dbms_output.put_line(v_STR);
o_var := v_STR;
exception--错误异常处理部分
when others then
dbms_output.put_line(sqlerrm);--打印错误信息
END P_name;

-----------------------------------调用存储过程示例:
declare
v_in int;
v_out varchar2(50);
begin
v_in :=100;
P_name (v_in,v_out); --调用存储过程P_name
dbms_output.put_line('存储过程输入结果为:'||v_out);
exception--错误异常处理部分
when others then
dbms_output.put_line(sqlerrm);--打印错误信息
end;

Ⅹ mysql数据存储过程

MySQL字符串连接使用CONCAT函数,示例如下:

热点内容
linux命令全称 发布:2024-05-17 12:07:54 浏览:110
ftpnas区别 发布:2024-05-17 12:06:18 浏览:949
512g存储芯片价格 发布:2024-05-17 12:04:48 浏览:963
脚本运行周期 发布:2024-05-17 11:39:09 浏览:808
阿里云服务器怎么配置发信功能 发布:2024-05-17 11:37:24 浏览:313
编程中的变量 发布:2024-05-17 11:33:06 浏览:777
加密视频怎么解密 发布:2024-05-17 11:02:52 浏览:571
柳工挖机密码多少合适 发布:2024-05-17 11:00:40 浏览:188
android工程叹号 发布:2024-05-17 10:56:21 浏览:481
在苹果手机应用怎么比安卓贵 发布:2024-05-17 10:56:20 浏览:548