SQL Server存储过程数组参数
2013-04-15 14:23:31 我来说两句作者:orz_men
收藏我要投稿SQL Server存储过程数组参数
SQL Server存储过程不支持数组参数类型,要传递数量不定的参数,需要采用其他方式进行传递
方法一:利用字符串截取拆分数组字符串
-- =============================================
-- Author:
-- Create date: <2010-11-26>
-- Description: <存储过程数组参数>
-- 方法一:利用字符串截取拆分数组字符串
-- =============================================
CREATE PROCEDURE SP_ParameterArray
@UserName VARCHAR(10),
@StrArray VARCHAR(800)
AS
DECLARE @P INT
DECLARE @C INT
DECLARE @Nums INT
SET @P=1
SET @C=1
BEGIN TRANSACTION
Set NOCOUNT ON
CREATE TABLE #t_info
(
UserName VARCHAR(10),
Nums INT
)
SET @C=CHARINDEX(',',@StrArray,@P+1)
SET @Nums=CAST(SUBSTRING(@StrArray,@P,@C-@P) AS INT)
INSERT INTO #t_info(UserName,Nums) VALUES(@UserName,@Nums)
SET @P=@C
WHILE (@P+1< LEN(@StrArray))
BEGIN
SET @C=CHARINDEX(',',@StrArray,@P+1)
IF(@C> 0)
BEGIN
SET @Nums=CAST (SUBSTRING(@StrArray,@P+1,@C-@P-1) AS INT)
INSERT INTO #t_info(UserName,Nums) VALUES(@UserName,@Nums)
SET @P=@C
END
ELSE
BREAK
END
SET @Nums=CAST(SUBSTRING(@StrArray,@P+1,LEN(@StrArray)-@P) AS INT)
INSERT INTO #t_info(UserName,Nums) VALUES(@UserName,@Nums)
SELECT * FROM #t_info
DROP TABLE #t_info
SET NOCOUNT OFF
IF @@ERROR=0
BEGIN
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTION
END
GO
方法二:利用OpenXML 效率更高
-- =============================================
-- Author:
-- Create date: <2010-11-26>
-- Description: <存储过程数组参数>
-- 方法二:利用OpenXML 效率更高
-- @XML_Array=' Nums="4">
-- =============================================
CREATE PROCEDURE [dbo].[SP_ParameterArray2]
@UserName VARCHAR(10),
@XML_Array nvarchar(500)
AS
BEGIN
IF (@XML_Array IS NULL OR LEN(LTRIM(RTRIM(@XML_Array))) = 0) RETURN
CREATE TABLE #t_info(UserName VARCHAR(10),Nums INT) DECLARE @IdHandel INT
EXEC sp_xml_preparedocument @IdHandel OUTPUT, @XML_Array INSERT INTO #t_info(UserName,Nums)
SELECT @UserName,N.Nums
FROM OPENXML(@IdHandel,'/Array/PA') WITH(Nums INT) AS N WHERE N.[Nums] IS NOT NULL
EXEC sp_xml_removedocument @IdHandel
SELECT * FROM #t_info
DROP TABLE #t_info
END
SQLServer 存储过程返回值总结 1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况 (1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几 (2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。 ' 则 count = -1;在显示栏中假如有查询结果,则 count = -1 总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。 B.不论 ExecuteNonQuery(方法是按照 CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。 --------------------------------------------------------------------------------------------------------------------------------------------------- 2. 获得存储过程的返回值 --通过查询分析器获得 (1不带任何参数的存储过程 (存储过程语句中含有 return ---创建存储过程 CREATE PROCEDURE testReturn AS return 145 GO ---执行存储过程
DECLARE @RC int exec @RC=testReturn select @RC ---说明 查询结果为 145 (2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程 create procedure sp_add_table1 @in_name varchar(100, @in_addr varchar(100, @in_tel varchar(100 as if(@in_name = '' or @in_name is null return 1 else begin insert into table1(name,addr,tel values(@in_name,@in_addr,@in_tel return 0
存储过程及参数命名规范 一、存储过程命名规范 1.操作方式add(添加) mod(修改) del(删除) sel(查询) drag(托拽) copy(拷贝) lock(锁) chk(检查) cho(选择) rp(报表) ini(初始化) get(得到function专用) 2.结果类型Tree(树) Tab(表) 3.修饰语A(Tab专用修饰符all) 4.顺序bf(之前) 5.过程标识P (对外过程) F(方法) E(内部过程) 公有过程命名规则 公式:过程名=标识+对象条件+操作及修饰 过程标识_对象名(By条件)(结果类型)_主操作方式(修饰语) (顺序)(次操作方式) ()是可选对象 例: 树查询p_xxxxTree_Sel 树节点查表p_xxxxTab_Sel 主特征表查询P_xxxxByChr_Sel 明细特征表查询P_xxxxByDtlChr_Sel 查询所有p_xxxxx_SelA 独立选择框树P_xxxxTree_Cho 独立选择框树查表P_xxxxTab_Cho 独立选择框待选项查询p_xxxxByChr_Cho 独立选择框已选择项查询P_xxxxSeled_Cho 业务绑定选择框树P_xxxxforxxxTree_Cho 业务绑定选择框树查表P_xxxxforxxxTab_Cho 业务绑定选择框普通查询p_xxxxforxxxByChr_Cho 业务绑定已选择项查询P_xxxxforxxxSeled_Cho 除主页面查询外的其他条件查询P_xxxxByxxxx_Sel 新增P_xxxx_Add 修改P_xxxx_Mod 删除P_xxxx_Del 删除前检查P_xxxx_ChkBfDel 初始化P_xxxx_IniBfxxx 新增,修改,删除任选合一P_xxxx_Save 方法命名规则
存储过程 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 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_executesqlN'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL declare @fnamevarchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fnamevarchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输出参数 declare @numint, @sqlsnvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --如何将exec执行结果放入变量中? declare @numint, @sqlsnvarchar(4000) set @sqls='select @a=count(*) from tableName ' execsp_executesql @sqls,N'@aint output',@num output select @num 1 :普通SQL语句可以用Exec执行例: Select * from tableName Exec('select * from tableName')
2008-12-16 21:41 第一种方法: 使用output参数 USE AdventureWorks; GO IF OBJECT_ID ( 'https://www.sodocs.net/doc/9515240373.html,p_GetList', 'P' ) IS NOT NULL DROP PROCEDURE https://www.sodocs.net/doc/9515240373.html,p_GetList; GO CREATE PROCEDURE https://www.sodocs.net/doc/9515240373.html,p_GetList @product varchar(40) , @maxprice money , @compareprice money OUTPUT , @listprice money OUT AS SELECT https://www.sodocs.net/doc/9515240373.html, AS Product, p.ListPrice AS'List Price' FROM Production.Product p JOIN Production.ProductSubcategory s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE https://www.sodocs.net/doc/9515240373.html, LIKE@product AND p.ListPrice <@maxprice; -- Populate the output variable @listprice. SET@listprice= (SELECT MAX(p.ListPrice) FROM Production.Product p JOIN Production.ProductSubcategory s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE https://www.sodocs.net/doc/9515240373.html, LIKE@product AND p.ListPrice <@maxprice); -- Populate the output variable @compareprice. SET@compareprice=@maxprice; GO 另一个存储过程调用的时候: Create Proc Test as DECLARE@compareprice money, @cost money EXECUTE https://www.sodocs.net/doc/9515240373.html,p_GetList '%Bikes%', 700, @compareprice OUT, @cost OUTPUT IF@cost<=@compareprice BEGIN PRINT'These products can be purchased for less than $'+RTRIM(CAST(@compareprice AS varchar(20)))+'.' END ELSE PRINT'The prices for all products in this category exceed $'+RTRIM(CAST(@compareprice AS varchar(20)))+'.'
SQL Server在存储过程中编写事务处理代码的三种方法 SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran 这样编写的SQL存在很大隐患。请看下面的例子: create table demo(id int not null) go begin tran insert into demo values (null) insert into demo values (2) commit tran go 执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。这是什么原因呢? 原来SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。 如何避免这样的问题呢? 有三种方法:
1. 在事务语句最前面加上set xact_abort on set xact_abort on begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran go 当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。 2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。 begin tran update statement 1 ... if@@error<>0 begin rollback tran goto labend end delete statement 2 ... if@@error<>0 begin rollback tran goto labend end commit tran labend: go 3. 在SQL Server 2005中,可利用try...catch 异常处理机制。
整理者为我 实例1:只返回单一记录集的存储过程。 银行存款表(bankMoney)的内容如下 要求1:查询表bankMoney的内容的存储过程 create procedure sp_query_bankMoney as select * from bankMoney go exec sp_query_bankMoney 注* 在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧! 实例2(向存储过程中传递参数): 加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。 Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output with encryption ---------加密 as insert bankMoney (id,userID,sex,Money)
Values(@param1,@param2,@param3, @param4) select @param5=sum(Money) from bankMoney where userID='Zhangsan' go 在SQL Server查询分析器中执行该存储过程的方法是: declare @total_price int exec insert_bank '004','Zhangsan','男',100,@total_price output print '总余额为'+convert(varchar,@total_price) go 在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容): 1.以Return传回整数 2.以output格式传回参数 3.Recordset 传回值的区别: output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。 实例3:使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。 USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = 'au_info_all' AND type = 'P') DROP PROCEDURE au_info_all GO
获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值 例:向Order表插入一条记录,返回其标识 CREATE PROCEDURE[dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEGIN SET NOCOUNT ON; BEGIN INSERT INTO[Order](o_buyerid ) VALUES (@o_buyerid ) SET@o_id=@@IDENTITY END END 存储过程中获得方法: DECLARE@o_buyerid int DECLARE@o_id bigint EXEC[nb_order_insert]@o_buyerid ,o_id bigint 2.RETURN过程返回值 CREATE PROCEDURE[dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEGIN SET NOCOUNT ON; IF(EXISTS(SELECT*FROM[Shop]WHERE[s_id]=@o_shopid)) BEGIN INSERT INTO[Order](o_buyerid ) VALUES (@o_buyerid ) SET@o_id=@@IDENTITY RETURN1—插入成功返回1 END ELSE RETURN0—插入失败返回0 END
存储过程中的获取方法 DECLARE@o_buyerid int DECLARE@o_id bigint DECLARE@result bit EXEC@result=[nb_order_insert]@o_buyerid ,o_id bigint 3.SELECT 数据集返回值 CREATE PROCEDURE[dbo].[nb_order_select]( @o_id int ) AS BEGIN SET NOCOUNT ON; SELECT o_id,o_buyerid FROM[Order] WHERE o_id =@o_id GO 存储过程中的获取方法 (1)、使用临时表的方法 CREATE TABLE[dbo].[Temp]( [o_id][bigint]IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, [o_buyerid][int]NOT NULL ) INSERT[Temp]EXEC[nb_order_select]@o_id –这时Temp就是EXEC执行SELECT 后的结果集 SELECT*FROM[Temp] DROP[Temp]—删除临时表 (2)、速度不怎么样.(不推荐) SELECT*from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb _order_select’) 1.获取Return返回值 程序代码 //存储过程 //Create PROCEDURE MYSQL // @a int,
SqlServer 使用存储过程导出为Excel 一个脱离office组件的可以将语句结果导出到Excel的过程 --1.执行时所连接的服务器决定文件存放在哪个服务器 [sql]view plain copy print? 1.CREATE PROC ExportFile 2. @QuerySql VARCHAR(max) 3. ,@Server VARCHAR(20) 4. ,@User VARCHAR(20) = 'sa' 5. ,@Password VARCHAR(20) 6. ,@FilePath NVARCHAR(100) = 'c:\ExportFile.csv' 7.AS 8.DECLARE @tmp VARCHAR(50) = '[##Table' + CONVERT(VARCHAR(36),NEWID())+']' 9.BEGIN TRY 10.DECLARE @Sql VARCHAR(max),@DataSource VARCHAR(max)=''; 11.--判断是否为远程服务器 12. IF @Server <> '.'AND @Server <> '127.0.0.1' 13.SET @DataSource = 'OPENDATASOURCE(''SQLOLEDB'',''Data Source='+@Server+';User ID='+@Us er+';Password='+@Password+''').' 14.--将结果集导出到指定的数据库 15.SET @Sql = REPLACE(@QuerySql,' from ',' into '+@tmp+ ' from ' + @DataSource) 16. PRINT @Sql 17.EXEC(@Sql) 18. 19.DECLARE @Columns VARCHAR(max) = '',@Data NVARCHAR(max)='' 20.SELECT @Columns = @Columns + ',''' + name +''''--获取列名(xp_cmdshell导出文件没有列名) 21. ,@Data = @Data + ',Convert(Nvarchar,[' + name +'])'--将结果集所在的字段更新为nvarchar(避 免在列名和数据union的时候类型冲突) 22.FROM tempdb.sys.columns WHERE object_id = OBJECT_ID('tempdb..'+@tmp) 23.SELECT @Data = 'SELECT ' + SUBSTRING(@Data,2,LEN(@Data)) + ' FROM ' + @tmp 24.SELECT @Columns = 'Select ' + SUBSTRING(@Columns,2,LEN(@Columns)) 25.--使用xp_cmdshell的bcp命令将数据导出 26.EXEC sp_configure 'xp_cmdshell',1 27. RECONFIGURE 28.DECLARE @cmd NVARCHAR(4000) = 'bcp "' + @Columns+' Union All ' + @Data+'" queryout ' + @Fi lePath + ' -c' + CASE WHEN RIGHT(@FilePath,4) = '.csv'THEN' -t,'ELSE''END + ' -T' 29. PRINT @cmd 30.exec sys.xp_cmdshell @cmd 31.EXEC sp_configure 'xp_cmdshell',0 32. RECONFIGURE 33.EXEC('DROP TABLE ' + @tmp) 34.END TRY 35.BEGIN CATCH
一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程。微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了)。虽然这些存储过程可能很有用并为你节省了很多时间,但是他们可以在任何时候改变他们的函数或简单的删除掉。 下面的图表显示了当许多存储过程从一个Microsoft SQL Server版本移入另一个版本时,引入了新的存储过程,而原来的一些则从安装包里删除了。大多数的存储过程,如果不是所有的,要求用户是系统管理员服务器角色以便执行这些存储过程。和文件系统交互的存储过程还要求执行存储过程的用户(还有SQL Server的服务帐户)具有访问文件/文件夹的权限。 sp_executeresultset 微软在SQL Server 2005中删除了这个名为sp_executeresultset的便利小程序。它允许你在空闲时通过使用SELECT查询产生动态SQL代码。然后,作为结果的SQL命令将会在数据库上执行。它允许你创建单独的一行代码,这行代码可以在单步中查询到你的数据库里
的每一个表的记录数目(就像例子中所显示的)。这是一个未公开的存储过程,而且无法知道它为什么被删除了。但是,唉,这个便利的有用存储过程已经没有了。 exec sp_execresultset 'SELECT ''SELECT '''''' + name + '''''', count(*) FROM '' + name from sysobjects where xtype = ''U''' sp_MSforeachdb / sp_MSforeachtable sp_MSforeachdb / sp_MSforeachtable 两个存储过程,sp_MSforeachdb和sp_MSforeachtable封装了一个指针。它们允许你对你的SQL Server上的每一个数据库和当前数据库中的每一个表分别执行T-SQL代码。然而你不能在SQL2000和之前的版本中在一个sp_MSforeachdb命令中使用sp_MSforeachtable命令。在这些存储过程中使用的指针名称是一样的(hCForEach),因此在每一次执行sp_MSforeachtable时会返回一个错误说该指针名称已经在使用。在SQL Server 2005中,微软解决了这一问题。为了执行“下一个”命令,你必须告诉其中的一个存储过程它将使用一个不同的替换字符而不是默认的问号。我改变了数据库命令中的这个替换字符,因为它更为简单。 打印当前数据库中的每一个表的名称 exec sp_MSforeachtable 'print ''?''' 打印当前服务器的每一个数据库 exec sp_MSforeachdb 'print ''?''' 打印当前数据库的每一个表 exec sp_MSforeachdb 'use [@] exec sp_MSforeachtable ''print ''''@.?''''''', '@' sp_readerrorlog / xp_readerrorlog 存储过程sp_readerrorlog实际上有两种形式。每一项的工作内容一样;一个是另一个的简单封装。封装的存储过程是sp_readerrorlog,它调用xp_readerrorlog。这两个都有四个输入参数,但是只有前两个对我们有用。第一个参数设定你希望看到的文件编号。第二
用JDBC操作Oracle的存储过程返回值 Oracle的存储过程可以返回任何类型,包括一个ResultSet,JDBC自带的CallableStatement可以提供操作这些返回值得借口,其中我们可以通过registerOutParameter来注册需要返回的类型。CallableStatement是PrepareStatement的一个子类,但提供了返回和注册Out类型参数的功能。我们看一下例子,在Oracle里面我们定义了一个包如下: create or replace package GP_TESTP is type my_dCursor is ref cursor; procedure GP_Test(m_cursor2 OUT my_dCursor; end GP_TESTP; create or replace package body GP_TESTP is procedure GP_Test(m_cursor2 OUT my_dCursor is begin open m_cursor2 for select bom.material_no,bom.product_no from gp2_bom bom where bom.year=2006 ; end GP_Test; end GP_TESTP; 在JDBC里面我们可以通过如下的接口来得到返回的动态游标的内容 Global.start(; //初始化连接池 ConnectionWrapper wrapper=ConnectionPoolFactory.getPoolInstance(.borrowConnection(;//从连接池里面返回连接 Connection conn=wrapper.getConnection(; try { String callSql="{call GP_TESTP.GP_Test(?}"; CallableStatement cs = null; ResultSet rs=null; cs = conn.prepareCall(callSql; cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR; cs.execute(; rs = (ResultSetcs.getObject(2; while(rs.next({ //String s=rs.get(""; String component=rs.getString(2; String productNo=rs.getString(4; System.out.println("component="+component+"-------productNo="+productNo; } } catch (SQLException e { // TODO Auto-generated catch block e.printStackTrace(; } 注意兰颜色的代码是注册动态游标和返回结果集的关键代码。 ======================================= 2008年07月06日星期日 07:41 P.M.一:无返回值的存储过程存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2 AS BEGIN INSERT INTO HYQ.B_ID (I_ID,I_NAME VALUES (PARA1, PARA2; END TESTA; 然后呢,在java里调用时就用下面的代码: package com.hyq.src; import java.sql.*; import java.sql.ResultSet; public class TestProcedureOne { public TestProcedureOne( { } public static void main(String[] args { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq "; Statement stmt = null;
列出SQLServer数据库中所有的存储过程 Dim cn As rdoConnection Dim ps As rdoPreparedStatement Dim rs As rdoResultset Dim strConnect As String Dim strSQL As String '利用 DSNless 连接到 pubs 数据库 '改变参数以适合你自己的 SQL Server strConnect = "Driver={SQL Server}; Server=myserver; " & "Database=pubs; Uid=sa; Pwd=" Set cn = rdoEnvironments(0).OpenConnection(dsName:="", Prompt:=rdDriverNoPrompt, ReadOnly:=False, Connect:=strConnect) strSQL = "Select https://www.sodocs.net/doc/9515240373.html,,https://www.sodocs.net/doc/9515240373.html,,https://www.sodocs.net/doc/9515240373.html,,sc.length " & "FROM syscolumns sc,master..systypes st,sysobjects so " & "WHERE sc.id in (select id from sysobjects where type ='P')" & " AND so.type ='P' " & "AND sc.id = so.id " & "AND sc.type = st.type " & "AND sc.type <> 39" Set ps = cn.CreatePreparedStatement("MyPs", strSQL) Set rs = ps.OpenResultset(rdOpenStatic) list1.AddItem "SP Name,Param Name,Data Type,Length" While Not rs.EOF list1.AddItem rs(0) & " , " & rs(1) & " , " & rs(2) & " , " & rs(3) rs.MoveNext Wend rs.Close Set rs = Nothing cn.Close Set cn = Nothing 【
存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.创建存储过程 create procedure sp_name() begin ......... end 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.其他常用命令 1.show procedure status 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等 2.show create procedure sp_name 显示某一个mysql存储过程的详细信息 --------------------数据类型及运算符-------------------- 一、基本数据类型: 略 二、变量: 自定义变量:DECLARE a INT ; SET a=100; 可用以下语句代替:DECLARE a INT DEFAULT 100; 变量分为用户变量和系统变量,系统变量又分为会话和全局级变量 用户变量:用户变量名一般以@开头,滥用用户变量会导致程序难以理解及管理 1、在mysql客户端使用用户变量 mysql> SELECT 'Hello World' into @x; mysql> SELECT @x; mysql> SET @y='Goodbye Cruel World'; mysql> select @y;
Oracle存储过程参数 在创建存储过程时,需要考虑的一件重要事情就是过程的灵活性,以方便随后可以重新使用。通过使用“参数”可以使程序单元变得很灵活,参数是一种向程序单元输入和输出数据的机制,存储过程可以接受和返回0到多个参数。Oracle有三种参数模式:IN、OUT和IN OUT。 1.IN参数 该类型的参数值由调用者传入,并且只能够被存储过程读取。这种模式的参数是最常用的,也是默认的参数模式。 例如,下面以SCOTT用户连接到数据库,并建立一个简单的存储过程ADD_EMPLOYEE。顾名思义,该过程将接受一系列参数,并且将它们添加到SCOTT.EMP 表中: SQL> create or replace procedure add_employee( 2 id_param in number, 3 name_param in varchar2, 4 job_param in varchar2, 5 hire_param in date, 6 salary_param in number) is 7 begin 8 insert into scott.emp(empno,ename,job,hiredate,sal) 9 values(id_param,name_param,job_param,hire_param,salary_param); 10 end add_employee; 11 / 过程已创建。 在为存储过程定义参数时,参数的数据类型不能包括大小和精度信息。在调用该存储过程时,用户需要传递一系列参数,以便过程的执行部使用这些参数向SCOTT.EMP表添加一条记录。在调用存储过程时有三种向其传递参数的方法:名称表示法、位置表示法和混合表示法。 名称表示法 名称表示法是指为各个参数传递参数值时,指定传入数值的参数名。使用名称表示法传递参数的语法形式如下: prcedure_name(param_name=>value[,param_name=>value]); 例如,在下面的示例中使有名称表示法传递参数,以调用存储过程ADD_EMPLOYEE:SQL> alter session set nls_date_format = 'yyyy-mm-dd'; 会话已更改。 SQL> begin 2 add_employee(id_param=>8000,name_param =>'ATG', 3 job_param =>'CLERK',hire_param =>'1997-12-20', 4 salary_param =>1500); 5 end;
Java调用SQL Server存储过程 Java调用SQL Server的存储过程详解,主要内容: ●使用不带参数的存储过程 ●使用带有输入参数的存储过程 ●使用带有输出参数的存储过程 ●使用带有返回状态的存储过程 ●使用带有更新计数的存储过程 1.使用不带参数的存储过程 使用JDBC 驱动程序调用不带参数的存储过程时,必须使用call SQL 转义序列。不带参数的call 转义序列的语法如下所示: 实例:在SQL Server 2005 AdventureWorks示例数据库中创建以下存储过程: 此存储过程返回单个结果集,其中包含一列数据(由Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。 在下面的实例中,将向函数传递AdventureWorks示例数据库的打开连接,然后使用executeQuery方法调用GetContactFormalNames存储过程。
2.使用带有输入参数的存储过程 使用JDBC 驱动程序调用带参数的存储过程时,必须结合SQLServerConnection 类的prepareCall方法使用call SQL转义序列。带有IN参数的call转义序列的语法如下所示: 构造call转义序列时,请使用?(问号)字符来指定IN参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用SQLServerPreparedStatement类的setter方法之一为参数指定值。可使用的setter方法由IN参数的数据类型决定。 向setter方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个IN参数,则其序数值为1。如果存储过程包含两个参数,则第一个序数值为1,第二个序数值为2。 作为调用包含IN参数的存储过程的实例,使用SQL Server 2005 AdventureWorks示例数据库中的uspGetEmployeeManagers存储过程。此存储过程接受名为EmployeeID的单个输入参数(它是一个整数值),然后基于指定的EmployeeID返回雇员及其经理的递归列表。下面是调用此存储过程的Java代码:
Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet) 一:无返回值的存储过程调用 存储过程: CREATE OR REPLACE PROCEDURE PRO_1(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN INSERT INTO DBO.EMP (ID,NAME) VALUES (PARA1, PARA2); END PRO_1; Java代码: package com.icesoft.service; import java.sql.*; import java.sql.ResultSet; public class CallProcedureTest1 { public CallProcedureTest1() { super(); } public static void main(String[] args) { String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl "; String user = "admin"; String pwd = "password"; Connection conn = null; CallableStatement cs = null; ResultSet rs = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, user, pwd); cs = conn.prepareCall("{ call DBO.PRO_1(?,?) }"); cs.setString(1, "10"); cs.setString(2, "Peter");