打开加密存储过程的存储过程

打开加密存储过程的存储过程
打开加密存储过程的存储过程

sql server 2005 以上存储过程无法进行查看和编辑,网上找了个解密存储过程,代码如下:Create PROCEDURE [dbo].[sp_windbi$decrypt]

(@procedure sysname = NULL, @revfl int = 1)

AS

/**//*

王成辉翻译整理,转贴请注明出自微软BI开拓者https://www.360docs.net/doc/354874596.html,

调用形式为:

exec dbo.sp__windbi$decrypt @procedure,0

如果第二个参数使用1的话,会给出该存储过程的一些提示。

--版本4.0 修正存储过程过长解密出来是空白的问题

*/

SET NOCOUNT ON

IF @revfl = 1

BEGIN

PRINT '警告:该存储过程会删除并重建原始的存储过程。'

PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'

PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'

PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'

RETURN 0

END

DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int select @maxColID = max(subobjid) FROM

sys.sysobjvalues WHERE objid = object_id(@procedure)

--select @maxColID as 'Rows in sys.sysobjvalues'

select @procNameLength = datalength(@procedure) + 29

DECLARE @real_01 nvarchar(max)

DECLARE @fake_01 nvarchar(max)

DECLARE @fake_encrypt_01 nvarchar(max)

DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)

declare @objtype varchar(2),@ParentName nvarchar(max)

select @real_decrypt_01a = ''

--提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称select @objtype=type,@parentname=object_name(parent_object_id)

from sys.objects where [object_id]=object_id(@procedure)

-- 从sys.sysobjvalues里提出加密的imageval记录

SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =

object_id(@procedure) and valclass = 1 order by subobjid)

--创建一个临时表

create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,

[real_decrypt] NVARCHAR(MAX) )

--开始一个事务,稍后回滚

BEGIN TRAN

--更改原始的存储过程,用短横线替换

if @objtype='P'

SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1

/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/'

else if @objtype='FN'

SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1

/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/ END'

else if @objtype='V'

SET @fake_01='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/'

else if @objtype='TR'

SET @fake_01='ALTER trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)

/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/'

EXECUTE (@fake_01)

--从sys.sysobjvalues里提出加密的假的

SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) and valclass = 1 order by subobjid )

if @objtype='P'

SET @fake_01='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1 /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/'

else if @objtype='FN'

SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1

/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/ END'

else if @objtype='V'

SET @fake_01='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/'

else if @objtype='TR'

SET @fake_01='Create trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)

/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 -

@procNameLength)+'*/'

--开始计数

SET @intProcSpace=1

--使用字符填充临时变量

SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 ))

--循环设置每一个变量,创建真正的变量

--每次一个字节

SET @intProcSpace=1

--如有必要,遍历每个@real_xx变量并解密

WHILE @intProcSpace<=(datalength(@real_01)/2)

BEGIN

--真的和假的和加密的假的进行异或处理

SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,

NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^

(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^

UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))

SET @intProcSpace=@intProcSpace+1

END

--通过sp_helptext逻辑向表#output里插入变量

insert #output (real_decrypt) select @real_decrypt_01

--select real_decrypt AS '#output chek' from #output --测试

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

--开始从sp_helptext提取

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

declare @dbname sysname

,@BlankSpaceAdded int

,@BasePos int

,@CurrentPos int

,@TextLength int

,@LineId int

,@AddOnLen int

,@LFCR int --回车换行的长度

,@DefinedLength int

,@SyscomText nvarchar(max)

,@Line nvarchar(255)

Select @DefinedLength = 255

SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格CREATE TABLE #CommentText

(LineId int

,Text nvarchar(255) collate database_default)

--使用#output代替sys.sysobjvalues

DECLARE ms_crs_syscom CURSOR LOCAL

FOR SELECT real_decrypt from #output

ORDER BY ident

FOR READ ONLY

--获取文本

SELECT @LFCR = 2

SELECT @LineId = 1

OPEN ms_crs_syscom

FETCH NEXT FROM ms_crs_syscom into @SyscomText

WHILE @@fetch_status >= 0

BEGIN

SELECT @BasePos = 1

SELECT @CurrentPos = 1

SELECT @TextLength = LEN(@SyscomText)

WHILE @CurrentPos != 0

BEGIN

--通过回车查找行的结束

SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,

@BasePos)

--如果找到回车

IF @CurrentPos != 0

BEGIN

--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续

While (isnull(LEN(@Line),0) + @BlankSpaceAdded +

@CurrentPos-@BasePos + @LFCR) > @DefinedLength

BEGIN

SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +

@BlankSpaceAdded)

INSERT #CommentText VALUES

( @LineId,

isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,

@BasePos, @AddOnLen), N''))

SELECT @Line = NULL, @LineId = @LineId + 1,

@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0

END

SELECT @Line = isnull(@Line, N'') +

isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'') SELECT @BasePos = @CurrentPos+2

INSERT #CommentText VALUES( @LineId, @Line )

SELECT @LineId = @LineId + 1

SELECT @Line = NULL

END

ELSE

--如果回车没找到

BEGIN

IF @BasePos <= @TextLength

BEGIN

--如果@Lines长度的新值大于定义的长度

While (isnull(LEN(@Line),0) + @BlankSpaceAdded +

@TextLength-@BasePos+1 ) > @DefinedLength

BEGIN

SELECT @AddOnLen = @DefinedLength -

(isnull(LEN(@Line),0) + @BlankSpaceAdded)

INSERT #CommentText VALUES

( @LineId,

isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,

@BasePos, @AddOnLen), N''))

SELECT @Line = NULL, @LineId = @LineId + 1,

@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =

END

SELECT @Line = isnull(@Line, N'') +

isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'') if LEN(@Line) < @DefinedLength and charindex(' ',

@SyscomText, @TextLength+1 ) > 0

BEGIN

SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1

END

END

END

END

FETCH NEXT FROM ms_crs_syscom into @SyscomText

END

IF @Line is NOT NULL

INSERT #CommentText VALUES( @LineId, @Line )

select Text from #CommentText order by LineId

CLOSE ms_crs_syscom

DEALLOCATE ms_crs_syscom

DROP TABLE #CommentText

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

--结束从sp_helptext提取

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

--删除用短横线创建的存储过程并重建原始的存储过程

ROLLBACK TRAN

DROP TABLE #output

go

执行上面的存储过程方法为:

exec sp_windbi$Decrypt 'IA_WriSummary',0

exec sp_windbi$Decrypt '你要解密的存储过程名',0

在执行上面的语句后出现错误:

对象名'sys.sysobjvalues'无效

主要原因是我们没有用DAC模式登陆,下面是解决办法:

第一步:允许DAC模式

(1)如果是在本地服务器做DAC的话用:sqlcmd -A (A一定要大写,要不然不好用哦) 用这个命令就可以很轻松的连接上,连接上以后在里面写语句就可以,语句写玩了要运行GO这个命令。

(2)如果要做远程连接DAC的话需要用:sqlcmd -S 服务器名-U sa(一个是sysadmin角色的登陆帐户就可以了)-P(密码)-A就可以了

启用远程DAC登录选项:

操作步骤:'程序'->'Sql Server2005'-> '配置工具'-> 'Sql Server 外围应用配置器'-> '功能的外围应用配置器'-> 'DataBase Engine'-> 'DAC' -> '启用远程DAC' 这样DAC模式就启用成功了,接下来是使用DAC模式登陆。

第二步:使用DAC模式登陆(关键就在这个地方)

1,DAC只支持一个窗口

2,DAC只支持查询窗口, 不支持Object Explorer. 如果你想在SQL Server Management Studio中用DAC连, 你应该用个正常的连接, 然后用DAC打开查询窗口.

下面是操作步骤:

1,先用有sysadmin角色的用户登陆SQL Server Management Studio,随便sa就可以了;

2,新建查询,在弹出的连接对话框中,服务器名称改为ADMIN:服务器名称;然后,选项->连接属性->连接到数据库改为加密存储过程所在的数据库->连接即可.

3,最后执行上面的存储过程方法;

如何启用远程DAC连接?

只有 SQL Server sysadmin 角色的成员可以使用 DAC 连接。默认情况下,只能从服务器上运行的客户端建立连接。除非通过 sp_configure 使用 remote admin connections 选项进行配置,否则不允许使用网络连接。

DAC 支持加密和 SQL Server 的其他安全性功能。DAC 只允许将用户上下文切换到其他管理用户。

默认情况下,DAC 仅侦听环回 IP 地址 (127.0.0.1) 端口1434。

remote admin connections 设置的可能值如下:

0-指明仅允许本地连接使用 DAC

1-指明允许远程连接使用 DAC

--启用远程DAC连接

sp_configure 'remote admin connections', 1;

GO

RECONFIGURE;

GO

注意:配置远程管理连接之后,会立即启用 DAC 侦听器而不必重新启动 SQL Server,并且客户端可以立即远程连接到 DAC

这个存储过程网上很多,如果出现二进制截断

是因为有些网站提供存储过程为:

DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@intEncrypted tinyint,@procNameLength int

select @maxColID = max(subobjid),@intEncrypted = imageval FROM

sys.sysobjvalues WHERE objid = object_id(@procedure)

GROUP BY imageval

修改前面的第22行为:

select @maxColID = max(subobjid) FROM

sys.sysobjvalues WHERE objid = object_id(@procedure) 同时取消定义@intEncrypted tinyint

第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还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获。 1. 建立一个存储过程 create or replace PROCEDURE firstPro IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; 其中IS关键字替换为AS关键字结果不会出现任何变化,大多认为他们是等同的,但也有一种说法解释为:一般PACKAGE 或者单独的FUNCTION, PROCEDURE 都用AS,PACKAGE 中的FUNCTION, PROCEDURE 用IS。 DBMS_OUTPUT.PUT_LINE('Hello World!'); 是一个输出语句。 2. 执行存储过程 Oracle返回结果需要使用包,那么存储过程似乎只能在数据库中执行或被其他调用,编程语言似乎并不能直接调用存储过程返回数据,是否能执行他有待研究。那么首先在数库中执行上面的存储过程。 BEGIN FirstPro();//注意有括号 END; 运行后输出Hello World。 3. 下面写一个稍复杂的存储过程,他定义了变量,进行了运算,输出一个count操作所用的时间。 CREATE OR REPLACE procedure testtime is n_start number; n_end number; samplenum number; use_time number; begin n_start:=dbms_utility.get_time; select count(*) into samplenum from emp; n_end:=dbms_utility.get_time; use_time:= n_end - n_start; dbms_output.put_line('This statement cost '|| use_time ||' miliseconds'); end; 4. 下面试验下怎么能给存储过程赋值 CREATE OR REPLACE procedure test(num in number) is begin dbms_output.put_line('The input numer is:' || num); end ; 今天的就到这,明天将调用这个存储过程,并试验一写对表的操作。 1. 首先把昨天带参的存储过程执行一下 declare

ORACLE存储过程编码规范

ORACLE存储过程编码规范 1.1变量规范 变量名、常量名、参数名、函数名、存储过程名、包名等所有对象全部用英文拼写,不允许用汉语拼音,多个单词间用下划线分割。 全局常量全部用大写,全局变量全部用小写,且全局变量尽量避免使用。 局部变量全部小写,使用“v_”开头,输入参数以“i_”开头,输出参数以“o_” 开头,输入输出参数用io_开头。 游标的定义:游标统一用前缀“cur_”命名 当变量代表列时,使用%TYPE属性,当变量实际上表示数据库表的某列数据时,为避免数据库结构修改对变量的影响,应统一使用%TYPE属性对变量命名 1.2显示游标规范 外部查询的多行数据返回使用游标进行处理,通过传递游标变量的形式返回数据到外部接口,由外部程序自行FETCH数据。 打开游标前,必须显式检查游标的%ISOPEN属性。 使用FETCH语句后,要立即检查%NOTFOUND属性,以便正常终止游标FETCH 循环。 无论PL/SQL程序是正常终止还是出错退出,都要关闭所有已打开的游标。在出错退出时,应该在其异常处理部分管理所有游标,这可以释放一部分的系统资源 1.3事务处理规范 在需要分割事务以使主事务的提交或者回滚独立于子事务的提交及回滚时,应使用自动提交事务。 所有的存储过程均统一在结束处统一COMMIT或者ROLLBACK。 1.4错误处理规范 凡是涉及到表操作(insert,update,select,delete)的sql语句,都必须进行错误捕捉,不能将错误带到后面的语句 从表中SELECT数据INTO到指定变量中的SQL语句,应严格区分NO_DATA_FOUND 和TOO_MANY_ROWS的错误,并将相应错误信息填入错误信息 ?NO_DA TA_FOUND 多数为查询条件问题导致无数据返回(用户级错误)

SQLServer中数据加密方法

中数据加密方法 对中的数据进行加密,有三种方法, 、在程序语言中先对数据进行加密后再把加密后的数据保存在数据库中; 、利用未公开的加密密码函数,在代码中调用加密密码函数对数据进行加密后保存;、编写扩展存储过程的外部文件实现加密,然后由代码调用加密功能实现数据加密。 第一种方法就不再描述,利用第二种方法加密数据代码示例: ( , () ) (, ('')) (, ('')) (, ('')) * 比较数据是否相等 * ('', )

上面的语句中,用到了二个函数:和,这是二个未公开的函数,实现对输入数据进行加密后返回二进制形式的加密内容,而用于检查明文是否与加密的二进制数据内容相等,没有解密函数。这二个函数主要是用于内部自己调用。优点是调用方便,缺点是这二个函数没有公开,就意味着可能改变,并且不兼容原来的,在使用上存在风险。 第三种方法,在我的上一篇文章《在中调用外部扩展存储过程》里,已描述了怎样编写扩展存储过程文件和怎样注册扩展存储过程,我提供了一个完整的加密文件,可注册到中调用,也可注册为库,还可在语言中直接调用声明的函数,由于在文章中没有上传文件的功能,因此,我先把此文件上传到“我的资源”中,有兴趣者可下载。 说明:本文不讨论哪种方法好和坏,在于列举出后二种方法,供大家参考,只有实用的才是最好的。 、扩展存储过程的引入 首先,我们需要知道在(以上版本)中有一个扩展存储过程,名叫,这是干什么用的呢,查它的帮助呀,不就知道了,在的帮助中是这样描述的:向注册新扩展存储过程的名称。语法为:[] '' , [] ''。由此我们知道,它的功能是把已经写好在外部文件中的函数引入到中,提供给其它代码调用。其用法示例为: '', ':\' 上面的语句表示把外部文件:\ 中的函数引入到中,在执行完上面的语句后,主库中就多了一个名为的扩展存储过程,我们在其它脚本中就可以调用此扩展存储过程了。有一点限定的是,只能在中执行,如果在其它库中调用,需要加上限定库名。 、编写外部文件 好了,我们知道了怎样在中加载外部扩展存储过程,接下来,我们要做什么呢,对

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

C#调用存储过程简单完整例子https://www.360docs.net/doc/354874596.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 文件: ---------------------------------------------------------------------------------------- ......

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

存储过程的概念

存储过程的概念 SQL Server提供了一种方法,它可以将一些固定的操作集中起来由SQLServer 数据库服务器来完成,以实现某个任务,这种方法就是存储过程。 存储过程是SQL语句和可选控制流语句的预编译集合,存储在数据库中,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。 在SQL Server中存储过程分为两类:即系统提供的存储过程和用户自定义的存储过程。 可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列SQL语句。 可以从自己的存储过程内引用其他存储过程,这可以简化一系列复杂语句。 存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快,而且减少网络通信的负担。 安全性更高。 创建存储过程 在SQL Server中,可以使用三种方法创建存储过程: ①使用创建存储过程向导创建存储过程。 ②利用SQL Server 企业管理器创建存储过程。 ③使用Transact-SQL语句中的CREATE PROCEDURE命令创建存储过程。 下面介绍使用Transact-SQL语句中的CREATE PROCEDURE命令创建存储过程创建存储过程前,应该考虑下列几个事项: ①不能将CREATE PROCEDURE 语句与其它SQL 语句组合到单个批处理中。 ②存储过程可以嵌套使用,嵌套的最大深度不能超过32层。 ③创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。 ④存储过程是数据库对象,其名称必须遵守标识符规则。 ⑤只能在当前数据库中创建存储过程。 ⑥一个存储过程的最大尺寸为128M。 使用CREATE PROCEDURE创建存储过程的语法形式如下: QUOTE: CREATE PROC[EDURE]procedure_name[;number][;number] [{@parameter data_type} [VARYING][=default][OUTPUT] ][,...n] WITH {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}] [FOR REPLICATION] AS sql_statement [ ...n ] 用CREATE PROCEDURE创建存储过程的语法参数的意义如下:

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

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/354874596.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/354874596.html,%TYPE := 'wish'; v_pwd user_info.pwd%TYPE := 'history'; v_add user_info.address%TYPE := 'shanghai'; BEGIN --调用过程,添加wish用户到数据库

存储过程

66:创建无参数无返回值的存储过程(存储过程的默认返回值都是int类型的,并且为0)create proc mya as select*from orders go exec mya 67:删除存储过程 Drop proc 存储过程名称,如果多个用,号进行分割。 68:创建有参数但无返回值的存储过程 create proc myb @param int= 1 as select*from orders where oid > @param go exec myb 3 69:调用以上俩个存储过程,并查看默认返回值 declare @number int set @number = 1; exec @number = mya exec @number = myb 3 print @number go 70:获取存储过程的返回值(存储过程默认的返回值都为0) declare @number int set @number = 1 exec @number = mya exec @number = myb print @number 71:创建有参数并且有返回值的存储过程,并调用存储过程,获取返回值 select*from person; go --create proc myc --@inparm int, --@outparm int output --as

--select @outparm=count(*) from person where pid>@inparm --go declare @flag int set @flag = 2 exec myc @outparm = @flag output,@inparm = 1 if(@flag>0) begin print @flag end else begin print'set is null' end go --1 调用方法: --1:不要返回值return,的俩种写法 --2:计算参数总共有多少个输出参数,有多少个输出参数,就需要有多少个变量,output不能少 --创建存储过程时,注意,sql中引用表必须在当前数据库中存在,否则调用不成功 --存储过程与use 间必须用批处理命令 go 去隔开 72:手工改变存储过程的返回值 create proc mya as select*from person return 888 go declare @flag int set @flag = 0 exec @flag = mya print @flag create proc mya as declare @flag int set @flag = 0 select @flag =count(*)from person return @flag go

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

Oracle存储过程语法与注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STA TEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DA TA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP; 5.变量赋值 V_TEST := 123;

6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP; END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如: select a.appname from appinfo a;-- 正确 select a.appname from appinfo as a;-- 错误 也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。 select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译 select af.keynode from APPFOUNDA TION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement

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

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

存储过程

MySQL 5.0 版本开始支持存储过程。 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 存储过程思想上很简单,就是数据库SQL 语言层面的代码封装与重用。 优点 ?存储过程可封装,并隐藏复杂的商业逻辑。 ?存储过程可以回传值,并可以接受参数。 ?存储过程无法使用SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。 ?存储过程可以用在数据检验,强制实行商业逻辑等。 缺点 ?存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。 ?存储过程的性能调校与撰写,受限于各种数据库系统。 一、存储过程的创建和调用 ?存储过程就是具有名字的一段代码,用来完成一个特定的功能。 ?创建的存储过程保存在数据库的数据字典中。 创建存储过程 CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name([proc_par ameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type characteristic: COMMENT'string' | LANGUAG E SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA |

Oracle+PlSql存储过程 学习文档

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利 用游标的话就另当别论了。 (5) 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。 (5) 4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错 (5) 5. 在存储过程中,关于出现null的问题 (5) 6. Hibernate调用Oracle存储过程 (6) 用Java调用Oracle存储过程总结 (6) 一、无返回值的存储过程 (6) 二、有返回值的存储过程(非列表) (8) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) Oracle存储过程调用Java方法 (16) Oracle高效分页存储过程实例 (17) Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

实验五 存储过程20103191王晓燕

实验五存储过程 学号:20103191 姓名:王晓燕专业:应用物理班级:2010232 一、实验目的 (1)掌握T-SQL流控制语句。 (2)掌握创建存储过程的方法。 (3)掌握存储过程的执行方法。 (4)掌握存储过程的管理和维护。 二、实验内容 1、创建简单存储过程 (1)创建一个名为stu_pr的存储过程:该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出“已删除!”信息,否则就给出“不存在,可创建!”的信息,并创建该存储过程。 存储过程的创建语句:if exists (select name from sysobject where name=’stu_pr’and type=’p’) Drop procedure stu_pr go create procedure stu_pr As select * from student left outer join sc on(student.sno=sc.sno) go 存储过程的执行测试结果:

2、创建带参数的存储过程 (1)创建一个名为stu_proc1的存储过程:查询某系、某姓名的学生的学号、姓名、年龄,选修课程名、成绩。系名和姓名在调用该存储过程时输入,其默认值分别为“%”与“林%”。执行该存储过程,用多种参数加以测试。 存储过程的创建语句:create procedure stu_proc1 @sdept char(10)=”%”,@sname varchar(8)=”林%“ As select student.sno,sname,datediff(year,birth,getdate()) age,https://www.360docs.net/doc/354874596.html,ame,grade From student,sc,course Where syudent.sno=sc.sno and https://www.360docs.net/doc/354874596.html,o=https://www.360docs.net/doc/354874596.html,o and sdept=@sdept and sname=@sname go 存储过程的执行测试结果:

(完整版)SQLSERVER存储过程大总结

SQLSERVER存储过程使用说明书 引言 首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同SQL语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。 请大家先看一个小例子: create proc query_book as select * from book go --调用存储过程 exec query_book 请大家来了解一下存储过程的语法。 Create PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ] 一、参数简介 1、procedure_name 新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。 要创建局部临时过程,可以在 procedure_name 前面加一个编号 符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两

个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。 2、;number 是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。Drop PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应 在 procedure_name 前后使用适当的定界符。 3、@parameter 过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。 使用@符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。 4、data_type 参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。 说明:对于可以是cursor 数据类型的输出参数,没有最大数目的限制。 5、VARYING 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。 6、default 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。 7、OUTPUT

打开加密存储过程的存储过程

sql server 2005 以上存储过程无法进行查看和编辑,网上找了个解密存储过程,代码如下:Create PROCEDURE [dbo].[sp_windbi$decrypt] (@procedure sysname = NULL, @revfl int = 1) AS /**//* 王成辉翻译整理,转贴请注明出自微软BI开拓者https://www.360docs.net/doc/354874596.html, 调用形式为: exec dbo.sp__windbi$decrypt @procedure,0 如果第二个参数使用1的话,会给出该存储过程的一些提示。 --版本4.0 修正存储过程过长解密出来是空白的问题 */ SET NOCOUNT ON IF @revfl = 1 BEGIN PRINT '警告:该存储过程会删除并重建原始的存储过程。' PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。' PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。' PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。' RETURN 0 END DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int select @maxColID = max(subobjid) FROM sys.sysobjvalues WHERE objid = object_id(@procedure) --select @maxColID as 'Rows in sys.sysobjvalues' select @procNameLength = datalength(@procedure) + 29 DECLARE @real_01 nvarchar(max) DECLARE @fake_01 nvarchar(max) DECLARE @fake_encrypt_01 nvarchar(max) DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max) declare @objtype varchar(2),@ParentName nvarchar(max) select @real_decrypt_01a = '' --提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称select @objtype=type,@parentname=object_name(parent_object_id) from sys.objects where [object_id]=object_id(@procedure) -- 从sys.sysobjvalues里提出加密的imageval记录

相关文档
最新文档