Listen Software解决方案 “How To” 系列2:存储过程数据库教程

时间:2023-08-07 08:21:44 其他范文 收藏本文 下载本文

Listen Software解决方案 “How To” 系列2:存储过程数据库教程(精选12篇)由网友“SKY”投稿提供,下面是小编精心整理的Listen Software解决方案 “How To” 系列2:存储过程数据库教程,仅供参考,大家一起来看看吧。

Listen Software解决方案 “How To” 系列2:存储过程数据库教程

篇1:Listen Software解决方案 “How To” 系列2:存储过程数据库教程

存储过程|解决

Listen Software解决方案 “How To” 系列2:存储过程

参照:

参照定义和使用游标

参照定义和使用函数

存储过程

CREATE OR REPLACE PROCEDURE {procedure name}

( {argument} IN {datatype} ) IS v_variable {datatype};

--变量类型

VARCHAR(X);

VARCHAR2(X);

VARCHAR2;

CHAR(X);

NUMBER(P,S);

--P-数字的位数

--S-数字的精度

NUMBER(X);

NUMBER;

LONG;

--容纳32,760字节数据

DOUBLE PRECISION;

FLOAT;

INT;

REAL;

DATE;

RAW(X)

--容纳32,760字节数据

LONG RAW;

--容纳32,760字节数据

--注意数据库类型为LONG RAW

--容纳20亿字节数据

RECORD;

TABLE;

VARRAY;

LOB;

CLOB;

v_variable_c1 VARCHAR2(20);

--创建20个字符长的变量

v_variable_c2 CHAR(10);

--创建固定长度为10个字符的变量

- 最大长度255

v_variable_c3 VARCHAR2;

--变量长度不能超过个字符

v_variable_n1 table_name.field_name%TYPE;

--定义参照方案中表字段类型的变量类型

v_variable_n2 NUMBER;

v_variable_n3 NUMBER := 3;

v_variable_n4 NUMBER(10);

v_variable_n5 NUMBER(10,2);

v_variable_n6 LONG;

v_variable_n7 FLOAT;

v_variable_n8 REAL;

TYPE t_my_record IS RECORD

(

v_variable1       VARCHAR2(8)

,v_variable2 NUMBER(10)

,v_variable3 DATE

);

my_record t_my_record;

TYPE t_my_table is TABLE OF VARCHAR2(10)

--与vb中的数据结构相似

INDEX BY BINARY_INTEGER;

my_table t_my_table;

BEGIN

--这儿插入代码

v_variable_c1 := 'Hello World';

v_variable_n2 :=10;

--条件逻辑

IF v_variable_n2 = 1 THEN

v_variable_c2 := 'Exact Match';

ELSIF v_variable_n3 >2 THEN

v_variable_c2 := 'Greater Than Match';

ELSE

v_variable_c3 := 'None of the Above';

END IF;

my_record.v_variable1:='ABC';

my_record.v_variable2:=3;

my_record.v_variable3:=TO_DATE('11-JAN-','DD-MON-YYYY');

my_table(1)='A';

my_table(2)='B';

/* v_variable_n2的值为10,因此第一个条件为false.

v_variable_n3初始为3,因此条件为true,

v_variable_c2的值就为'Greater Than Match'

循环 */

v_variable_n2:=0;

LOOP

v_variable_n2:=v_variable_n2+1;

EXIT WHEN v_variable_n2 >10;

END LOOP;

v_variable_n2:=0;

WHILE v_variable_n2<10 LOOP

v_variable_n2:=v_variable_n2+1;

END LOOP;

FOR v_variable_n2 in 1..10 LOOP

END LOOP;

END {procedure name};

篇2:管理存储过程数据库教程

12.3.1 查看存储过程

存储过程被创建以后,它的名字存储在系统表sysobjects 中;它的源代码存放在系统表syscomments 中,可以通过MS SQL Server 提供的系统存储过程来查看关于用户创建的存储过程信息。

1通过Enterprise Manager 管理工具同样可以查看存储过程的源代码

其操作如下:

(1) 启动Enterprise Manager, 登录到要使用的服务器。

(2) 选择要创建存储过程的数据库,在左窗格中单击Stored Procedure 文件夹,此时在右窗格中显示该数据库的所有存储过程。

(3) 在右窗格中,右击要查看源代码的存储过程,在弹出的菜单中选择Properties选项,此时便可看到存储过程的源代码。如图12-4 所示:

2 使用sp_helptext 存储过程查看存储过程的源代码

其语法格式如下:

sp_helptext 存储过程名称

例如要查看数据库pubs 是否是存储过程reptq1 的源代码,则执行sp_helptext reptq1。

注意:如果在创建存储过程时使用了WITH ENCRYPTION选项,那么无论是使用Enterprise Manager还是系统存储过程sp_helptext都无法查看到存储过程的源代码。

12.3.2 重新命名存储过程

修改存储过程的名字使用系统存储过程sp_rename。 其命令格式为:

sp_rename 原存储过程名, 新存储过程名

例12-4 :将存储过程reptq1 修改为newproc 其语句为:

sp_rename reptq1, newproc

另外,通过Enterprise Manager 也可修改存储过程的名字,其操作过程与WINDOWS 下修改文件名字的操作类似。即首先选中需修改名字的存储过程,然后右击鼠标,在弹出菜单中选取rename 选项,最后输入新存储过程的名字。

12.3.3 删除存储过程

删除存储过程使用drop 命令,drop 命令可将一个或多个存储过程或者存储过程组从

当前数据库中删除。其语法规则为:

DROP PROCEDURE {procedure}} [,…n]

例12-5: 如将存储过程reptq1 从数据库中删除,则执行:

drop procedure reptq1

12.3.4 执行存储过程

执行已创建的存储过程使用EXECUTE 命令,其语法如下:

[EXECUTE]

{[@return_statur=]

{procedure_name[;number] | @procedure_name_var}

[[@parameter=] {value | @variable [OUTPUT] | [DEFAULT] [,…n]

[WITH RECOMPILE]

各参数的含义如下:

@return_status

是可选的整型变量,用来存储存储过程向调用者返回的值,

@procedure_name_var

是一变量名用来代表存储过程的名字。

其它参数据和保留字的含义与CREATE PROCEDURE 中介绍的一样。

例12-6: 该存储过程被用来将两个字符串连接成一个字符串,并将结果返回。创建存储过程:

12.3.5 修改存储过程

修改以前用CREATE PROCEDURE 命令创建的存储过程,并且不改变权限的授予情况以及不影响任何其它的独立的存储过程或触发器常使用ALTER PROCEDURE 命令。其语法规则是:

ALTER PROC[EDURE] procedure_name [;number]

[ {@parameter data_type } [VARYING] [= default] [OUTPUT]] [,...n]

[WITH

{RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION}]

[FOR REPLICATION]

AS

sql_statement [...n]

其中各参数和保留字的具体含义请参看CREATE PROCEDURE 命令。

下面将举一个例子使读者对该命令有更为深刻的理解。

将该段代码输入到SQL Server Query Analyzer 窗口中运行后结果为:

注意:由于在ALERT PROCEDURE中使用了WITH ENCTYPTION保留字,所以在查看修改后的存储过程源代码时看到是一些代码。

篇3:通用存储过程的编写数据库教程

存储过程

通用存储过程的编写

对数据库的操作基本上就四种:Insert、Update、Delete和Select,而Update和Insert两种操作又可以作简单的合并,这样下来,基本上一个数据表对应三个存储过程便可以完成绝大多数的数据库操作,存储过程命名规则:Operate_TableName。比如表Order_Info对应三个存储过程:AddEdit_Order_Info、Delete_Order_Info、Search_Order_Info,下面先列出相关代码,然后作总体分析。

一、AddEdit_Order_Info

/*************************************************************

** Name     :   AddEdit_Order_Info

** Creater       :   PPCoder Designed By PPCode Studio(PPTech.Net)

** Create Date   :   -9-6 8:30:17

** Modifer       :  Rexsp

** Modify Date   :   2004-9-6 8:30:17

** Description : AddEdit information for Order_Info

**************************************************************/

ALTER PROCEDURE dbo.AddEdit_Order_Info

(

@OrderStateID Int = -1,

@OrderStateID_Min Int = -1,

@OrderStateID_Max Int = -1,

@OrderUserID Int = -1,

@OrderUserID_Min Int = -1,

@OrderUserID_Max Int = -1,

@OrderID Int = -1,

@OrderID_Min Int = -1,

@OrderID_Max Int = -1,

@ProductID Int = -1,

@ProductID_Min Int = -1,

@ProductID_Max Int = -1,

@CustomizeID Int = -1,

@CustomizeID_Min Int = -1,

@CustomizeID_Max Int = -1,

@OutID INT = 0 OUTPUT

)

AS

IF @OrderID=-1

BEGIN

INSERT INTO [Order_Info] (

[OrderStateID],

[OrderUserID],

[ProductID],

[CustomizeID]

)

VALUES(

@OrderStateID,

@OrderUserID,

@ProductID,

@CustomizeID

)

Set @OutID = @@IDENTITY

END

ELSE

BEGIN

DECLARE @strSQL NVARCHAR(1000)

SET @strSQL = 'UPDATE [Order_Info] SET @tmpOrderID = @tmpOrderID'

IF @OrderStateID -1

BEGIN

SET @strSQL = @strSQL + ', [OrderStateID] = @tmpOrderStateID'

END

IF @OrderUserID -1

BEGIN

SET @strSQL = @strSQL + ', [OrderUserID] = @tmpOrderUserID'

END

IF @ProductID -1

BEGIN

SET @strSQL = @strSQL + ', [ProductID] = @tmpProductID'

END

IF @CustomizeID -1

BEGIN

SET @strSQL = @strSQL + ', [CustomizeID] = @tmpCustomizeID'

END

SET @strSQL = @strSQL + ' WHERE [OrderID] = @tmpOrderID'

BEGIN TRAN

EXECUTE sp_executesql @strSQL, N'

@tmpOrderStateID INT,

@tmpOrderUserID INT,

@tmpOrderID INT,

@tmpProductID INT,

@tmpCustomizeID INT',

@tmpOrderStateID=@OrderStateID,

@tmpOrderUserID=@OrderUserID,

@tmpOrderID=@OrderID,

@tmpProductID=@ProductID,

@tmpCustomizeID=@CustomizeID

Set @OutID = @OrderID

IF @@error!=0

BEGIN

ROLLBACK

END

ELSE

BEGIN

COMMIT

END

END

RETURN

二、Delete_Order_Info

/*************************************************************

** Name     :   Delete_Order_Info

** Creater       :   PPCoder Designed By PPCode Studio(PPTech.Net)

** Create Date   :   2004-9-6 8:30:17

** Modifer       :  Rexsp

** Modify Date   :   2004-9-6 8:30:17

** Description : Delete information for Order_Info

**************************************************************/

ALTER PROCEDURE dbo.Delete_Order_Info

(

@OrderStateID Int = -1,

@OrderStateID_Min Int = -1,

@OrderStateID_Max Int = -1,

@OrderUserID Int = -1,

@OrderUserID_Min Int = -1,

@OrderUserID_Max Int = -1,

@OrderID Int = -1,

@OrderID_Min Int = -1,

@OrderID_Max Int = -1,

@ProductID Int = -1,

@ProductID_Min Int = -1,

@ProductID_Max Int = -1,

@CustomizeID Int = -1,

@CustomizeID_Min Int = -1,

@CustomizeID_Max Int = -1,

@OutID INT = 0 OUTPUT

)

AS

DECLARE @strSQL NVARCHAR(1000)

SET @strSQL = 'DELETE FROM [Order_Info] WHERE @tmpOrderID = @tmpOrderID '

IF @OrderStateID-1

BEGIN

SET @strSQL = @strSQL + ' AND rderStateID = @tmpOrderStateID'

END

IF @OrderStateID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderStateID_Min = @tmpOrderStateID_Min'

END

IF @OrderStateID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderStateID_Max = @tmpOrderStateID_Max'

END

IF @OrderUserID-1

BEGIN

SET @strSQL = @strSQL + ' AND rderUserID = @tmpOrderUserID'

END

IF @OrderUserID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderUserID_Min = @tmpOrderUserID_Min'

END

IF @OrderUserID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderUserID_Max = @tmpOrderUserID_Max'

END

IF @OrderID-1

BEGIN

SET @strSQL = @strSQL + ' AND rderID = @tmpOrderID'

END

IF @OrderID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderID_Min = @tmpOrderID_Min'

END

IF @OrderID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderID_Max = @tmpOrderID_Max'

END

IF @ProductID-1

BEGIN

SET @strSQL = @strSQL + ' AND ProductID = @tmpProductID'

END

IF @ProductID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND ProductID_Min = @tmpProductID_Min'

END

IF @ProductID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND ProductID_Max = @tmpProductID_Max'

END

IF @CustomizeID-1

BEGIN

SET @strSQL = @strSQL + ' AND CustomizeID = @tmpCustomizeID'

END

IF @CustomizeID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND CustomizeID_Min = @tmpCustomizeID_Min'

END

IF @CustomizeID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND CustomizeID_Max = @tmpCustomizeID_Max'

END

BEGIN TRAN

EXECUTE sp_executesql @strSQL, N'

@tmpOrderStateID INT,

@tmpOrderUserID INT,

@tmpOrderID INT,

@tmpProductID INT,

@tmpCustomizeID INT',

@tmpOrderStateID=@OrderStateID,

@tmpOrderUserID=@OrderUserID,

@tmpOrderID=@OrderID,

@tmpProductID=@ProductID,

@tmpCustomizeID=@CustomizeID

Set @OutID = @OrderID

IF @@error!=0

BEGIN

ROLLBACK

END

ELSE

BEGIN

COMMIT

END

RETURN

三、Search_Order_Info

/*************************************************************

** Name     :   Search_Order_Info

** Creater       :   PPCoder Designed By PPCode Studio(PPTech.Net)

** Create Date   :   2004-9-6 8:30:17

** Modifer       :  Rexsp

** Modify Date   :   2004-9-6 8:30:17

** Description : Search information for Order_Info

**************************************************************/

ALTER PROCEDURE dbo.Search_Order_Info

(

@OrderStateID Int = -1,

@OrderStateID_Min Int = -1,

@OrderStateID_Max Int = -1,

@OrderUserID Int = -1,

@OrderUserID_Min Int = -1,

@OrderUserID_Max Int = -1,

@OrderID Int = -1,

@OrderID_Min Int = -1,

@OrderID_Max Int = -1,

@ProductID Int = -1,

@ProductID_Min Int = -1,

@ProductID_Max Int = -1,

@CustomizeID Int = -1,

@CustomizeID_Min Int = -1,

@CustomizeID_Max Int = -1,

@ReturnCount INT=-1,

@OutID INT = 0 OUTPUT

)

AS

DECLARE @strSQL NVARCHAR(1000)

IF @ReturnCount-1

BEGIN

SET @strSQL = 'SELECT TOP '+@ReturnCount+' * FROM [Order_Info] WHERE @tmpOrderID = @tmpOrderID '

END

ELSE

BEGIN

SET @strSQL = 'SELECT * FROM [Order_Info] WHERE @tmpOrderID = @tmpOrderID '

END

IF @OrderStateID-1

BEGIN

SET @strSQL = @strSQL + ' AND rderStateID = @tmpOrderStateID'

END

IF @OrderStateID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderStateID_Min = @tmpOrderStateID_Min'

END

IF @OrderStateID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderStateID_Max = @tmpOrderStateID_Max'

END

IF @OrderUserID-1

BEGIN

SET @strSQL = @strSQL + ' AND rderUserID = @tmpOrderUserID'

END

IF @OrderUserID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderUserID_Min = @tmpOrderUserID_Min'

END

IF @OrderUserID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderUserID_Max = @tmpOrderUserID_Max'

END

IF @OrderID-1

BEGIN

SET @strSQL = @strSQL + ' AND rderID = @tmpOrderID'

END

IF @OrderID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderID_Min = @tmpOrderID_Min'

END

IF @OrderID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND OrderID_Max = @tmpOrderID_Max'

END

IF @ProductID-1

BEGIN

SET @strSQL = @strSQL + ' AND ProductID = @tmpProductID'

END

IF @ProductID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND ProductID_Min = @tmpProductID_Min'

END

IF @ProductID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND ProductID_Max = @tmpProductID_Max'

END

IF @CustomizeID-1

BEGIN

SET @strSQL = @strSQL + ' AND CustomizeID = @tmpCustomizeID'

END

IF @CustomizeID_Min-1

BEGIN

SET @strSQL = @strSQL + ' AND CustomizeID_Min = @tmpCustomizeID_Min'

END

IF @CustomizeID_Max-1

BEGIN

SET @strSQL = @strSQL + ' AND CustomizeID_Max = @tmpCustomizeID_Max'

END

BEGIN TRAN

EXECUTE sp_executesql @strSQL, N'

@tmpOrderStateID INT,

@tmpOrderUserID INT,

@tmpOrderID INT,

@tmpProductID INT,

@tmpCustomizeID INT',

@tmpOrderStateID=@OrderStateID,

@tmpOrderUserID=@OrderUserID,

@tmpOrderID=@OrderID,

@tmpProductID=@ProductID,

@tmpCustomizeID=@CustomizeID

Set @OutID = @OrderID

IF @@error!=0

BEGIN

ROLLBACK

END

ELSE

BEGIN

COMMIT

END

分析:

1、             三个存储过程的入参基本上相同,只有Search_Order_Info多了一个@ReturnCount用来控制搜索信息的条数的,

入参很有特点:与数据表字段的扩展对应。扩展方式有三种:数字型和日期型扩展出“极小”和“极大”两个属性,例如数字型的OrderStateID对应的参数有三个@OrderStateID、@OrderStateID_Min 、@OrderStateID_Max ,时间型的AddTime对应@AddTime、@AddTime_Rof、@AddTime_Eof ;如果是字符型的,则会扩展出一个用来进行模糊搜索的属性,例如Title对应@Title、@Title_Like。之所以这样设计,是为了组合出更具适应性的条件语句。三个存储过程都有一个出参,就是表的唯一标识ID。这个主要在“添加和更新”操作中使用。当然搜索的时候也可以当唯一键返回。这个唯一标识ID也是来判断是Insert或Update的标识。

2、             入参都有赋初值,然后动态构建Sql语句的时候,会判断各入参是否等于初值,如果不等于表示是外面传进来的传,便参与Sql语句的构建。这种灵活性是程序适应性的保证。这样,我们就可以在程序员通过控制是否给入参传值来判断是否要进行某一栏位进行更新或是否要把某一栏位的信息参与条件语句的构成。

3、             用系统存储过程sp_executesql来执行Sql语句,完全数据库操作。用系统存储过程来执行sql语句有一个好处,就是可以实现特殊字符的自动转义。

4、             三个存储过程都有统一的构建规律,所以可以使用自动化工具依据表结构直接生成。

篇4:一问一答:存储过程经典问题数据库教程

存储过程|问题

只涉及到一个表:xkb_treeNode

表结构是这样:

node_id         int     //节点id

parentNode_id   int     //父节点id

node_text       varchar //节点内容

isModule        bit     //是否叶子节点

现在保存的数据有:

node_id parentNode_id node_text       isModule

1       -1         语言与文学          0

2       -1           数学              0

3       -1           技术              0

4        1           语文              0

5        1           外语              0

6        5           英语              0

7        6         初中英语            0

8        7          特斯塔             1

9        4          测定是2            1

10       2           测试3             1

现在问题是:

能否通过做一个存储过程,

根据表中的isModule字段的取值(取值为1的表示最终叶子结点),

比如“特斯塔”为叶子节点,层层向上递进找到”特斯塔“的祖先节点:

特斯塔-〉初中英语-〉英语-〉外语-〉语言与文学

即通过”特斯塔“找到”语言与文学“来

最终返回的形态为:

叶子节点id 父节点id     节点名称     祖先节点名称 祖先节点id

8          7          特斯塔       语言与文学      1

9          4          测定是2      语言与文学      1

10         2          测试3          数学          2

/////////////////////////////////////////////////////////////////////////

正确答案:

--生成测试数据

create table xkb_treeNode(

node_id       int,

parentNode_id  int,

node_textvarchar(10),

isModulebit)

insert into xkb_treeNode select 1 ,-1,'语言与文学',0

insert into xkb_treeNode select 2 ,-1,'数学',0

insert into xkb_treeNode select 3 ,-1,'技术',0

insert into xkb_treeNode select 4 , 1,'语文',0

insert into xkb_treeNode select 5 , 1,'外语',0

insert into xkb_treeNode select 6 , 5,'英语',0

insert into xkb_treeNode select 7 , 6,'初中英语',0

insert into xkb_treeNode select 8 , 7,'特斯塔'       ,1

insert into xkb_treeNode select 9 , 4,'测定是2',1

insert into xkb_treeNode select 10 , 2,'测试3',1

--创建存储过程

create procedure sp_test

as

begin

select

a.node_id,

a.parentNode_id,

a.node_text,

b.node_id  as ancestor_id ,

b.node_text as ancestor_text

into

#t

from

xkb_treeNode a,xkb_treeNode b

where

a.parentNode_id = b.node_id and a.isModule = 1

while(exists(select 1 from xkb_treeNode a,#t b where a.node_id=ancestor_id and a.parentNode_id != -1))

begin

update #t

set

ancestor_id  = b.p_id,

ancestor_text = b.p_text

from

#t a,

(select

c.node_id,

d.node_id as p_id,

d.node_text as p_text

from

xkb_treeNode c,xkb_treeNode d

where

c.parentNode_id = d.node_id) b

where

a.ancestor_id = b.node_id

end

select * from #t order by node_id

end

--执行存储过程,结果楼主自己看

exec sp_test

篇5:解密SQL的存储过程数据库教程

存储过程|解密

内容来自互联网,作者不明

drop procedure sp_decrypt

go

create PROCEDURE sp_decrypt (@objectName varchar(50))

AS

begin

begin transaction --add by playyuer

declare @objectname1 varchar(100)

declare @sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000),@sql5 nvarchar(4000),@sql6 nvarchar(4000),@sql7 nvarchar(4000),@sql8 nvarchar(4000),@sql9 nvarchar(4000),@sql10 nvarchar(4000)

DECLARE @OrigSpText1 nvarchar(4000), @OrigSpText2 nvarchar(4000) , @OrigSpText3 nvarchar(4000), @resultsp nvarchar(4000)

declare @i int , @t bigint

declare @m int,@n int,@q int

set @m=(SELECT max(colid) FROM syscomments WHERE id = object_id(@objectName))

set @n=1

--get encrypted data

create table #temp(colid int,ctext varbinary(8000))

insert #temp SELECT colid,ctext FROM syscomments WHERE id = object_id(@objectName)

set @sql1='ALTER PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '

--set @sql1='ALTER PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '

set @q=len(@sql1)

set @sql1=@sql1+REPLICATE('-',4000-@q)

select @sql2=REPLICATE('-',4000),@sql3=REPLICATE('-',4000),@sql4=REPLICATE('-',4000),@sql5=REPLICATE('-',4000),@sql6=REPLICATE('-',4000),@sql7=REPLICATE('-',4000),@sql8=REPLICATE('-',4000),@sql9=REPLICATE('-',4000),@sql10=REPLICATE('-',4000)

exec(@sql1+@sql2+@sql3+@sql4+@sql5+@sql6+@sql7+@sql8+@sql9+@sql10)

while @n<=@m

begin

SET @OrigSpText1=(SELECT ctext FROM #temp WHERE colid=@n)

set @objectname1=@objectName+'_t'

SET @OrigSpText3=(SELECT ctext FROM syscomments WHERE id=object_id(@objectName) and colid=@n)

if @n=1

begin

SET @OrigSpText2='CREATE PROCEDURE '+ @objectName +' WITH ENCRYPTION AS '--

set @q=4000-len(@OrigSpText2)

set @OrigSpText2=@OrigSpText2+REPLICATE('-',@q)

end

else

begin

SET @OrigSpText2=REPLICATE('-', 4000)

end

--start counter

SET @i=1

--fill temporary variable

SET @resultsp = replicate(N'A', (datalength(@OrigSpText1) / 2))

--loop

WHILE @i<=datalength(@OrigSpText1)/2

BEGIN

--reverse encryption (XOR original+bogus+bogus encrypted)

SET @resultsp = stuff(@resultsp, @i, 1, NCHAR(UNICODE(substring(@OrigSpText1, @i, 1)) ^

(UNICODE(substring(@OrigSpText2, @i, 1)) ^

UNICODE(substring(@OrigSpText3, @i, 1)))))

SET @i=@i+1

END

--drop original SP

--EXECUTE ('drop PROCEDURE '+ @objectName)

--remove encryption

--preserve case

SET @resultsp=REPLACE((@resultsp),'WITH ENCRYPTION', '')

SET @resultsp=REPLACE((@resultsp),'With Encryption', '')

SET @resultsp=REPLACE((@resultsp),'with encryption', '')

IF CHARINDEX('WITH ENCRYPTION',UPPER(@resultsp) )>0

SET @resultsp=REPLACE(UPPER(@resultsp),'WITH ENCRYPTION', '')

--replace Stored procedure without enryption

print @resultsp

--execute( @resultsp)

set @n=@n+1

end

drop table #temp

end

rollback transaction --add by playyuer

GO

篇6:创建作业的通用存储过程数据库教程

创建|存储过程

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_JobSet]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)drop procedure [dbo].[p_JobSet]GO

/*--定时调用存储过程

创建一个在指定时间,调用指定存储过程的作业 作业执行完成后会自动删除

--邹建 .07--*/

/*--调用示例

exec p_JobSet 'master.dbo.xp_cmdshell','2004-1-1 10:30'--*/create proc p_JobSet@prorcname sysname, --要调用定时调用的存储过程名,如果不在当前库中,则用:库名.所有者名.存储过程名@job_date datetime --存储过程的执行时间(包括时间信息)asdeclare @dbname sysname,@jobname sysname ,@date int,@time int

select @jobname='定时发送作业_'+cast(newid as varchar(36)) ,@date=convert(varchar,@job_date,112) ,@time=replace(convert(varchar,@job_date,108),':','')

if exists(select 1 from msdb..sysjobs where name=@jobname) exec msdb..sp_delete_job @job_name=@jobname

--创建作业exec msdb..sp_add_job @job_name=@jobname,@delete_level=1

--创建作业步骤declare @sql varchar(800)select @sql='exec '+@prorcname ,@dbname=db_name()

exec msdb..sp_add_jobstep @job_name=@jobname, @step_name = '发送处理步骤', @subsystem = 'TSQL', @database_name=@dbname, @command = @sql, @retry_attempts = 5,  --重试次数 @retry_interval = 5   --重试间隔

--创建调度EXEC msdb..sp_add_jobschedule @job_name = @jobname, @name = '时间安排', @enabled = 1, @freq_type = 1, @active_start_date = @date, @active_start_time = @time

-- 添加目标服务器EXEC msdb.dbo.sp_add_jobserver @job_name = @jobname , @server_name = N'(local)' go

篇7:关于未能找到存储过程 master..xpjdbcopen数据库教程

存储过程

将安装的 Microsoft SQL Server Driver for JDBC 目录下的文件 sqljdbc.dll 从目录 C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC QLServer JTA\ 拷贝到 SQL Server 的 “binn” 目录下 (看起来像这样 C:\Program Files\Microsoft SQL Server\MSSQL\Binn). 然后用查询分析器打开 instjdbc.sql 脚本,这个脚本在目录 C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC QLServer JTA\. 运行这个脚本将安装一些扩展的存储过程,这样我们就可以在WebLogic中引用文件 sqljdbc.dll了.

篇8:购物车的存储过程学习数据库教程

存储过程|购物车

从来没有接触过存储过程,为了这个项目写了几个存储过程,就当是学习了,呵呵,这个购物车的存储过程中使用了Table(表),Cursor(游标)变量。

要求如下:

一个商品表[Ware],里面包含有的字段有ID,MarketPrice,MemberPrice,VipPrice等等,还一个会员购物车[MemberCar]数据表。包括的有ID,MemberID,WareID,WareNum等等。现要求是能取得购物车表里的所有数据和MarketPrice*WareNum(所有商品和)的总价钱,即有N件商品就获取这N件商品的总价钱而不是单一的价钱。本来在客户端里直接根据购物车[MemberCar]表的数据读取商品表[Ware]里的数据,再用变量累加即可的。但问题却是,购物车里的所有商品显示使用了分页显示。所以累加时就出问题,如果为了累加这些价钱而在分页循环显示后再加一个循环所有记录来累加价钱数据,这样不是不行,但效率就可想而知了!!!

现一个解决方法就是,重新构造一个购物车表的镜像,但却多了商品的几个价钱总数字段。即MarketPrice*WareNum(单一商品)。从而读取购物车时不是读取原来购物车数据表,而是读取这个镜像数据表,并在读取时累加这些总价钱。

存储过程代码如下:

----#####################################################################################

----# 过程作用:返回用户购物车里的所有数据,并包含统计了商品的价钱 (价钱=商品表的价格*购物车表里的数量)

----# 作者:死在水中的鱼

----# 日期:10月15日

----#####################################################################################

CREATE PROCEDURE MemberCar_Info @MemberID INT AS

--使用此句才能保持客户端的数据

SET NOCOUNT ON

DECLARE @Car_ID int,@Car_WareID int,@Car_WareNum smallINt

DECLARE @Car_TotalMemberPrice Numeric(8,2),@Car_TotalMarketPrice Numeric(8,2),@Car_TotalVipPrice Numeric(8,2)

--定义一个查询MemberCar表的游标变量,

获取数据

DECLARE Car_Cursor Cursor For

Select ID,WareID,WareNum From [MemberCar] Where MemberID=@MemberID And IsPay=0

--建立一个临时表变量

DECLARE @Car_Table Table (ID INT,

WareID INT,WareNum SmallINT,MarketPrice Numeric(8,2),MemberPrice Numeric(8,2),VipPrice Numeric(8,2))

--打开MemberCar表提取数据到临时变量

OPEN Car_Cursor

FETCH NEXT FROM Car_Cursor INTO @Car_ID,@Car_WareID,@Car_WareNum

WHILE @@FETCH_STATUS = 0

BEGIN

--取得商品的总市场价、总会员价和总VIP价

Select @Car_TotalMarketPrice=MarketPrice*@Car_WareNum,@Car_TotalMemberPrice=MemberPrice*@Car_WareNum,@Car_TotalVipPrice=VipPrice*@Car_WareNum From [Ware] Where ID=@Car_WareID

--添加进临时变量表

INSERT INTO @Car_Table (ID,WareID,WareNum,MarketPrice,MemberPrice,VipPrice) Values (@Car_ID,@Car_WareID,@Car_WareNum,@Car_TotalMarketPrice,@Car_TotalMemberPrice,@Car_TotalVipPrice)

-- 没有到表尾,继续提取数据到临时变量

FETCH NEXT FROM Car_Cursor INTO @Car_ID,@Car_WareID,@Car_WareNum

END

--关闭MemberCar数据库的游标

CLOSE Car_Cursor

DEALLOCATE Car_Cursor

--返回最终数据表

SELECT * FROM @Car_Table

GO

要求表达不是很清楚,各位原谅...

篇9:封装游标存储过程(Prexecsql2)数据库教程

存储过程|封装|游标

使用脚本自己可以执行自己的特性,封装游标操作存储过程如下:

CREATE PROCEDURE Pr_ExecSQL2

@Asqlstring VARCHAR(8000) --输入的SQL语句

AS

EXEC ('

--启动事务

BEGIN TRAN

DECLARE @ASql VARCHAR(8000)

DECLARE tnames_cursor CURSOR LOCAL FAST_FORWARD FOR '+ @asqlstring +'

OPEN tnames_cursor

FETCH NEXT FROM tnames_cursor INTO @ASql

WHILE (@@FETCH_STATUS=0)

BEGIN

print @ASql

EXEC (@ASql)

IF @@ERROR 0 GOTO FINALEXIT

FETCH NEXT FROM tnames_cursor INTO @ASql

END

CLOSE tnames_cursor

DEALLOCATE tnames_cursor

COMMIT TRAN

RETURN

FINALEXIT:

ROLLBACK TRAN

CLOSE tnames_cursor

DEALLOCATE tnames_cursor

')

使用方法:

declare @sql varchar(8000)

set @sql='select ''update a set a.a='' + b.a from b '

exec Pr_execsql2 @sql

篇10:存储过程入门与提高数据库教程

存储过程

存储过程入门与提高

什么是存储过程呢?

定义:

将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令,

讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?

Microsoft公司为什么还要添加这个技术呢?

那么存储过程与一般的SQL语句有什么区别呢?

存储过程的优点:

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3.存储过程可以重复使用,可减少数据库开发人员的工作量

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权

存储过程的种类:

1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,

如 sp_help就是取得指定对象的相关信息

2.扩展存储过程  以XP_开头,用来调用操作系统提供的功能

exec master..xp_cmdshell 'ping 10.8.16.1'

3.用户自定义的存储过程,这是我们所指的存储过程

常用格式

Create procedure procedue_name

[@parameter data_type][output]

[with]{recompile|encryption}

as

sql_statement

解释:

output:表示此参数是可传回的

with {recompile|encryption}

recompile:表示每次执行此存储过程时都重新编译一次

encryption:所创建的存储过程的内容会被加密

如:

表book的内容如下

编号   书名                          价格

001     C语言入门                  $30

002     PowerBuilder报表开发 $52

实例1:查询表Book的内容的存储过程

create proc query_book

as

select * from book

go

exec query_book

实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额

Create proc insert_book

@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output

with encryption ---------加密

as

insert book(编号,书名,价格) Values(@param1,@param2,@param3)

select @param4=sum(价格) from book

go

执行例子:

declare @total_price money

exec insert_book '003','Delphi 控件开发指南',$100,@total_price

print '总金额为'+convert(varchar,@total_price)

go

存储过程的3种传回值:

1.以Return传回整数

2.以output格式传回参数

3.Recordset

传回值的区别:

output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中

实例3:设有两个表为Product,Order,其表内容如下:

Product

产品编号      产品名称   客户订数

001            钢笔        30

002            毛笔        50

003            铅笔        100

Order

产品编号        客户名    客户订金

001             南山区     $30

002             罗湖区     $50

003             宝安区     $4

请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,

总金额=订金*订数,临时表放在存储过程中

代码如下:

Create proc temp_sale

as

select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额

into #temptable from Product a inner join Order b on a.产品编号=b.产品编号

if @@error=0

print 'Good'

else

print 'Fail'

go

篇11:存储过程入门与提高数据库教程

将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令,

什么是存储过程呢?

定义:

将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?

Microsoft公司为什么还要添加这个技术呢?

那么存储过程与一般的SQL语句有什么区别呢?

存储过程的优点:

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3.存储过程可以重复使用,可减少数据库开发人员的工作量

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权

存储过程的种类:

1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,

如 sp_help就是取得指定对象的相关信息

2.扩展存储过程  以XP_开头,用来调用操作系统提供的功能

exec master..xp_cmdshell 'ping 10.8.16.1'

3.用户自定义的存储过程,这是我们所指的存储过程

常用格式

Create procedure procedue_name

[@parameter data_type][output]

[with]{recompileencryption}

as

sql_statement

解释:

output:表示此参数是可传回的

with {recompileencryption}

recompile:表示每次执行此存储过程时都重新编译一次

encryption:所创建的存储过程的内容会被加密

如:

表book的内容如下

编号   书名                          价格

001     C语言入门                  $30

002     PowerBuilder报表开发 $52

实例1:查询表Book的内容的存储过程

create proc query_book

as

select * from book

go

exec query_book

实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额

Create proc insert_book

@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output

with encryption ---------加密

as

insert book(编号,书名,价格) Values(@param1,@param2,@param3)

select @param4=sum(价格) from book

go

执行例子:

declare @total_price money

exec insert_book '003','Delphi 控件开发指南',$100,@total_price

print '总金额为'+convert(varchar,@total_price)

go

存储过程的3种传回值:

1.以Return传回整数

2.以output格式传回参数

3.Recordset

传回值的区别:

output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中

实例3:设有两个表为Product,Order,其表内容如下:

Product

产品编号      产品名称   客户订数

001            钢笔        30

002            毛笔        50

003            铅笔        100

Order

产品编号        客户名    客户订金

001             南山区     $30

002             罗湖区     $50

003             宝安区     $4

请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,

总金额=订金*订数,临时表放在存储过程中

代码如下:

Create proc temp_sale

as

select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额

into #temptable from Product a inner join Order b on a.产品编号=b.产品编号

if @@error=0

print 'Good'

else

print 'Fail'

go

篇12:MySql存储过程 带参数处理方式数据库教程

下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句),该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式:

call GetUsersDynamic('age<=30','');

/********动态查询用户的信息********/CREATEPROCEDUREGetUsersDynamic(WhereConditionvarchar(500),OrderByExpressvarchar(100))begindeclarestmtvarchar(2000);if LENGTH(OrderbyExpress)>0thenbeginset@sqlstr=concat('select id,name,password,age,getdate(adddate) as AddDate from users where ',WhereCondition,' order by ',OrderByExpress);end;elsebeginset@sqlstr=concat('select id,name,password,age,getdate(adddate) as AddDate from users where ',WhereCondition);end;endif;preparestmtfrom@sqlstr;executestmt;end;

getdate()是一个自定义的函数,作用是返回日期的短格式

CREATEDEFINER=`root`@`localhost`FUNCTION`getdate`($datedatetime)RETURNSvarchar(50) CHARSET latin1returndate_format($date,'%Y-%m-%d');

动态插入数据的MySql存储过程,(注意四个单引号表示一个一引号):

CREATEDEFINER=`root`@`localhost`PROCEDURE`InsertUser`(inname2varchar(50),inpassword2varchar(32),inage2int,inadddate2 datetime)beginDECLAREstmtvarchar(2000);set@sqlstr=concat('insert into users(name,password,age,adddate) values(');set@sqlstr=concat(@sqlstr,'''',name2,'''',',','''',password2,'''',',',age2,',','''',adddate2,'''',')');preparestmtfrom@sqlstr;executestmt;end;

SYBASE数据库用户管理基本概念 (howto)数据库

系统加速我用Windows系统四大自带工具

0202 日的学习内容Windows系统

电脑教程:以太网交换机如何搭建

计算机基础知识的学习方法

单片机课程心得体会

C++基础教程数组

PowerDesign9.5+ 中的GTL编程 解决大问题数据库教程

了解一下NULLs怎样影响IN和EXISTS数据库教程

uniqueidentifier 数据类型数据库教程

Listen Software解决方案 “How To” 系列2:存储过程数据库教程
《Listen Software解决方案 “How To” 系列2:存储过程数据库教程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【Listen Software解决方案 “How To” 系列2:存储过程数据库教程(精选12篇)】相关文章:

如何恢复MYSQL实体文件MYI,MYD到数据库中数据库教程2022-05-04

拼音处理数据库教程2022-09-24

跟踪标记全攻略数据库教程2022-09-26

计算机系毕业论文2023-02-13

存储过程替换text,ntext列中的字符串数据库教程2022-05-07

PS联系表功能介绍2023-01-30

个人网站安全 从数据库合理管理开始数据库教程2023-04-22

IIS配置SMTP服务器服务器教程2022-09-09

非 root 权限读写 Linux 文件的方法2023-07-21

Excel服务器教程2023-10-20