导读:就爱阅读网友为大家分享了多篇关于 "sql 存储过程" 资料,内容精辟独到,非常感谢网友的分享,希望从中能找到对您有所帮助的内容。
相关资料一 : Oracle 存储过程使用动态 SQL
Oracle 存储过程相信大家都比较了解,下面就为您介绍 Oracle 存储过程使用动态 SQL 的方法,希望对您能够有所帮助。
Oracle 存储过程使用动态 SQL 有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者。试验步骤如下:
1. DDL 和 DML
- /***DDL***/
- begin EXECUTEIMMEDIATE 'droptabletemp_1';
- EXECUTEIMMEDIATE 'createtabletemp_1(namevarchar2(8))';
- end;
- /***DML***/
- declare v_1varchar2(8);
- v_2varchar2(10);
- strvarchar2(50);
- begin v_1: ='测试人员';
- v_2: ='北京';
- str: ='INSERTINTOtest(name,address)VALUES(:1,:2)';
- EXECUTEIMMEDIATEstrUSINGv_1,
- v_2;
- commit;
- end;
2. 返回单条结果
- declare strvarchar2(500);
- c_1varchar2(10);
- r_1test % rowtype;
- begin c_1: ='测试人员';
- str: ='select*fromtestwherename=:cWHEREROWNUM=1';
- executeimmediatestrintor_1usingc_1;
- DBMS_OUTPUT.PUT_LINE(R_1.NAME || R_1.ADDRESS);
- end;
3. 返回结果集
- CREATEORREPLACEpackagepkg_testas
- /*定义refcursor类型 不加return类型,为弱类型,允许动态sql查询, 否则为强类型,无法使用动态sql查询; */
- typemyrctypeisrefcursor; --函数申明functionget(intIDnumber) returnmyrctype;
- endpkg_test;
- / CREATEORREPLACEpackagebodypkg_testas --函数体 functionget(intIDnumber)returnmyrctypeis rcmyrctype;--定义refcursor变量 sqlstrvarchar2(500); begin ifintID=0then --静态测试,直接用select语句直接返回结果 openrcforselectid,name,sex,address,postcode,birthdayfrom student; else --动态sql赋值,用:w_id来申明该变量从外部获得 sqlstr:='selectid,name,sex,address,postcode,birthdayfromstudent whereid=:w_id'; --动态测试,用sqlstr字符串返回结果,用using关键词传递参数 openrcforsqlstrusingintid; endif; returnrc; endget; endpkg_test; /
------------------------------------- 目的:多条件查询销售任务信息 (销售报表)---- 创建人:史志辉 -- 日期:2011.01.19-------------------------------------ALTER PROC [proc_SEL_WL_SaleMission_BY_Conditions](@TheYear varchar(20),@MissionType varchar(20),@Audit varchar(20),@ComId int,@ComIds varchar(200))
ASDECLARE@strSQL nvarchar(2000)SET@strSQL='SELECT A.*,case when A.MissionType=0THEN''现有任务''when A.MissionType=1 THEN''拓展任务''else''未定义'' endAS
MissionTypeName, B.C_Name FROM WL_SaleMission A LEFT JOINH_Company B ON A.ComId=B.id WHERE 1=1 'if(@TheYear!='')beginset@strSQL=@strSQL+'AND A.TheYear='''+rtrim(@TheYear)+''''endif(@MissionType!='-1')beginset@strSQL=@strSQL+' AND A.MissionType='''+rtrim(@MissionType)+''''endif(@Audit!='-1')beginset@strSQL=@strSQL+' AND A.Audit= '''+rtrim(@Audit)+''''endif(@ComId!='-1')beginset@strSQL=@strSQL+' AND A.ComId= '''+rtrim(@ComId)+''''endif(@ComIds!='')beginset@strSQL=@strSQL+'AND B.id IN(' + @ComIds + ')'endexec(@strSQL)GO
EXEC proc_SEL_WL_SaleMission_BY_Conditions'','-1','-1','1','1'
导读:sql 存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的 sql 存储过程,这样就将抽象的事物形象化,比较容易理解。
例 1:
create proc proc_stu@sname varchar(20),@pwd varchar(20)asselect * from ren where sname=@sname and pwd=@pwdgo
查看结果:proc_stu 'admin','admin'
例 2:
下面的存储过程实现用户验证的功能,如果不成功,返回 0,成功则返回 1.
CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUTAS
IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD)SELECT @LEGAL = 1ELSESELECT @LEGAL = 0
在程序中调用该存储过程,并根据 @LEGAL 参数的值判断用户是否合法。
例 3:一个高效的数据分页的存储过程 可以轻松应付百万数据
CREATE PROCEDURE pageTest -- 用于翻页的测试 -- 需要把排序字段放在第一列
(@FirstID nvarchar(20)=null, -- 当前页面里的第一条记录的排序字段的值 @LastID nvarchar(20)=null, -- 当前页面里的最后一条记录的排序字段的值 @isNext bit=null, --true 1 : 下一页;false 0: 上一页 @allCount int output, -- 返回总记录数 @pageSize int output, -- 返回一页的记录数 @CurPage int -- 页号(第几页)0:第一页;-1 最后一页。)
AS
if @CurPage=0-- 表示第一页 begin-- 统计总记录数 select @allCount=count(ProductId) from Product_testset @pageSize=10-- 返回第一页的数据 select top 10ProductId,ProductName,Introductionfrom Product_test order by ProductIdend
else if @CurPage=-1-- 表示最后一页
select * from(select top 10 ProductId,ProductName,Introduction
from Product_test order by ProductId desc ) as aaorder by ProductIdelse
beginif @isNext=1-- 翻到下一页 select top 10 ProductId,ProductName,Introductionfrom Product_test where ProductId > @LastID order by ProductIdelse-- 翻到上一页 select * from(select top 10 ProductId,ProductName,Introductionfrom Product_test where ProductId < @FirstID order by ProductId desc) as bb order by ProductIdend
上文中讲到的这三个例子都是 sql 存储过程比较典型的例子,希望大家好好学习,都能够学到大家各自需要的东西。
如果你想更好的了解 SQL Server 2005 列出所有存储过程的实际操作的相关内容的话,如果你想更好的了解 SQL Server 2005 列出所有存储过程的实际操作的相关内容的话,下面的文章你不妨浏览,望你能会获得自己想要的东西。
对于数据库管理员来说,可以经常想了解一些之前未听说过的存储过程,特别是无文档类型的存储过程。或许是用这些存储过程,能够简化日常的数据管理。
对于数据库管理员来说,可以经常想了解一些之前未听说过的存储过程,特别是无文档类型的存储过程。或许是用这些存储过程,能够简化日常的数据管理。
为了查找这些存储过程,你可以花时间在互联网搜索,查看一些你还未知道的存储过程,也许在一两个小时您可能会发现你想要... 也许你很幸运的找到,其他人在他们的文章中列出所有的存储过程 ,函数和视图,并介绍了如何使用这些存储过程。
但其实,您可以在一分钟之内就可以自己列出这些存储过程、函数和视图的清单! 这份名单甚至包括 SQL Server 中所有无文档的存储过程。通过这个清单,你就可以确定你所想要找的存储过程。
SQL Server 2005 实际上保存了所有存储过程的列表,包括有文档的、无文档的,甚至是用户自定义的! 所有这些信息,都包含在系统表中。最简单的方法是使用一个系统视图,特别是 sys.all_objects 这个视图来查阅。
您也可以使用 sys.procedures 目录视图,但我的测试结果,发现这个视图会过滤掉一些储存过程。
您也可以使用系统储存过程 sp_stored_procedures 返回当前环境中的存储过程列表 ,但这个存储过程同样也限制了存储过程返回值。
通过对比,我觉得:如果想获得 SQL Server 2005 中所有的储存程序,建议使用 sys.all_objects 这个系统视图,sys.Procedures 或 sp_Stored_Procedures 这两个视图会因为某些未知原因,过滤掉一些内容,造成信息不全。
存储过程信息是存储在各自用户数据库中的系统表中的。SQL Server 2005 保存了存储过程的唯一标识信息,如存储过程的名称、创建时间、修改时间、是否来自微软等等。
如何确保所有的用户数据库都能够自动创建这些存储过程呢
当 SQL Server 部署完成后,微软提供的存储过程,是保存在 master 数据库中的。当您新建一个数据库时,master 数据库将作为模板数据库,因此,master 数据库中的所有存储过程将自动创建到你所新建的数据库中。
如果你想创建一个存储过程,并希望能够自动分发到所有的数据库中,你可以在 master 数据库中建立该存储过程,这样之后新创建的数据库中,将自动包含你新建的这个存储过程; 但对于之前已经存在的数据库,你仍需要到每个数据库中手动创建这个存储过程。
一、列出所有的储存过程
以下代码列出了 SQL Server 2005 中存在的所有储存过程。
- USE[your_database_name_here];
- GO SELECT * FROMsys.all_objects WHERE([type] = 'P'OR[type] = 'X'OR[type] = 'PC') ORDERBY[name];
- GO
如果您已经安装了 SQL Server 2005,并使用了所有的默认设置时,你将看到类似一下界面:
上面这个命令,通过 Type 对象进行过滤。从下表中,你可以确定自己所需的对象的类型,然后根据你的实际情况,调整 WHERE 子句中的类型。
此列表仅列出了意见,职能和程序。
二、用户自定义存储过程
在日常使用中,另一个字段 "is_ms_shipped" 也经常用来筛选记录。该字段用来判断存储过程是有微软发布的 ,如果最初是由微软发布的,则该字段的值为 0; 如果不是由微软发布的,则该字段的值为 1 。
在上面的 T-SQL 语句的基础上,您只要增加个限制条件 "and [is_ms_shipped] = 0 ",就可以找到不是微软创建的存储过程,这些或许是你或者第三方软件商访问数据库时创建的。如果您只想看看微软提供的储存过程,只要将值从 0 到 1 即可 。
下面举例说明,通过一个 T-SQL 代码演示如何获取只有用户定义的存储过程。
- USE[your_database_name_here];
- GO SELECT * FROMsys.all_objects WHERE([type] = 'P'OR[type] = 'X'OR[type] = 'PC') AND[is_ms_shipped] = 0 ORDERBY[name];
- GO
需要注意的是,这个语句的执行结果,因每个人的数据库的情况不同,而得到不同的记录列表。情况而异。执行之后,将看到类似下图的输出结果。
三、小结
通过上面的例子可以看到,通过少量代码,我们就可以很容易地、快速地获得自己所用的 SQL Server 的存储过程列表,你不必在一个个网站中搜索这些存储过程了。你可能会学到一个之前自己花了很大精力编写的复杂脚本,现在直接用一个存储过程就可以实现同样的效果了。
请记住,当使用一个不能确定来源或结果的存储过程,应该在测试系统先验证; 从来没有使用任何没有得到彻底的测试在生产环境中。
本文只是告诉各位可以用来获得 SQL Server 2005 中所有存储过程的方法,但不是鼓励你随意使用任何类型的存储过程,特别是无文档类型的。Microsoft 一再声明:微软对所有无文档的存储过程,扩展存储过程,函数和视图,均不提供任何相关的支持。
以上关于 "[关于数据库, sql 存储过程][sql 存储过程]Oracle 存储过程使用动态 SQL" 的信息由网友上传分享,希望对您有所帮助 ,感谢您对就爱阅读网的支持!
来源: http://www.92to.com/bangong/2017/06-06/22856518.html