存储过程

1 ** 判断是否有相应记录 return 0

set @n = (select 1 from store_pos where pos_serial_no =@posSerialNo )

        if   @n   is   null     

        print   '没有记录!'  

  else  

        print   '有记录!'

 

2 **判断是否有相应记录 return 结果集

select * from store_pos where pos_serial_no =@posSerialNo

        if   @@rowcount=0   --系统常量@@rowcount,会返回

        print   '没有记录!'  

  else  

        print   '有记录!'

 

3 ** 存储过程创建

create   proc   过程名  
  as  
  begin  
  create   table   #
临时表名
{field1   type,field2   type}  
  end  
 
 
  select   *   into   #
临时表名   from   table

 

4 ** 创建临时表

Create   proc   [dbo].[test_create] 

@posSerialNo bigint,  --变量之间用逗号隔开

@count int

as  

declare @n int

declare @firstNo int

set @firstNo=0

--创建临时表

begin  

     create table  #tab1 (store_pdt_name varchar(30),pos_serial_no varchar(20), base_serial_no varchar(20),pin_serial_no varchar(20),input_date datetime)

 

--循环查找,符合条件的插入临时表

       while(@firstNo<@count)

begin

       SELECT @n=1 from store_pos where pos_serial_no =@posSerialNo

        if   @n   is  not  null     

        insert into #tab1 select spi.store_pdt_name ,sp.pos_serial_no ,sp.base_serial_no,sp.pin_serial_no,sp.input_date

                    from store_pos sp , store_in si , store_pdt_info spi

                           where sp.store_in_id = si.store_in_id and si.store_pdt_id=spi.store_pdt_id

                                  and  pos_serial_no =@posSerialNo

      set @posSerialNo=@posSerialNo+1

       set @firstNo=@firstNo+1

end

 select * from #tab1

end

 

5 事务处理

ALTER PROCEDURE [dbo].[test_TRANSACTION]

AS

declare @date datetime

set @date = getdate()

begin

BEGIN tran

       SET NOCOUNT ON;

       insert into store_pos(store_in_id,pos_serial_no,base_serial_no,pin_serial_no,input_date) values(1,1,1,1,@date);

       insert into store_pos(store_in_id,pos_serial_no,base_serial_no,pin_serial_no,input_date) values(1,1,1,1,@date);

       IF @@ERROR <> 0

       BEGIN

        ROLLBACK TRAN

        print 'wrong'

    END

       else

       BEGIN

        commit TRAN

        print 'ok'

    END

END

 

** 6 存储过程的三种返回值

           OUPUT参数返回值  2 RETURN过程返回值  3.SELECT 数据集返回值

cstmt = conn.prepareCall("{?=call test_cursor(?)}");

           cstmt.registerOutParameter(1,java.sql.Types.BIGINT);//返回 return的值

           cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);//返回output的值

           cstmt.execute();

           //long intRet = cstmt.getLong(1);//

           cstmt.getMoreResults();

           int strOut = cstmt.getInt(1);   //100

           String strOut2 = cstmt.getString(2);   //123

 

alter PROCEDURE test_cursor

@value varchar(20) output  //返回output的值

AS

BEGIN

    SET NOCOUNT ON;

     set @value=123

return 100

END

GO

(一)、参数返回值@parm2
(二)、过程返回值return 100

(三)、数据集返回值select * from table1 where age = @parm1

 

3、返回多重结果
  JDBC 2 规范的一个局限是,在任意时刻,返回多重结果的语句只能打开一个ResultSet。作为 JDBC 3.0 规范中改变的一个部分,规范将允许 Statement 接口支持多重打开的 ResultSets。然而,重要的是 execute() 方法仍然会关闭任何以前 execute() 调用中打开的 ResultSet。所以,要支持多重打开的结果,Statement 接口就要加上一个重载的 getMoreResults() 方法。新式的方法会做一个整数标记,在 getResultSet() 方法被调用时指定前一次打开的 ResultSet 的行为。接口将按如下所示定义标记:

CLOSE_ALL_RESULTS:当调用 getMoreResults() 时,所有以前打开的 ResultSet 对象都将被关闭。CLOSE_CURRENT_RESULT:当调用 getMoreResults() 时,当前的 ResultSet 对象将被关闭。KEEP_CURRENT_RESULT:当调用 getMoreResults() 时,当前的 ResultSet 对象将不会被关闭。

conn = (Connection) pool.requestObject();

                 cstmt = conn.prepareCall("{call prcd_newAccountQRY(?,?)}");

                 cstmt.setString(1, _MerchantNo);

                 cstmt.registerOutParameter(2,java.sql.Types.BIGINT);//返回记录数量

                 rs = cstmt.executeQuery();  //第一个结果

                 cstmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);//第二个结果

                

                 long recordCount = cstmt.getLong(2);

while (rs.next())

 

执行带嵌入参数的sql——sp_executesql

declare @sql_str nvarchar(1000) --数据类型要修改为unicode类型

set @sql_str = 'set @temp = (select  count(*)'+@sql_str+')'

exec sp_executesql @sql_str,N'@temp bigint out',@countValue out

 

execute 对拼成的字符串SQL是有长度限制的

sp_executesql对参数类型有限制 Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'这句话很明显说明只支持以上类型。

 

 

** 7 游标 cursor

定义一个游标

1DECLARE authors_cursor CURSOR  FOR select pos_serial_no from store_pos

2DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles
字符转换函数

STR()
把数值型数据转换为字符型数据。

STR (<float_expression>[
length[ <decimal>]])
length
指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10 decimal 缺省值为0

length 或者decimal 为负值时,返回NULL
length 小于小数点左边(包括符号位)的位数时,返回length *
先服从length ,再取decimal
当返回的字符串位数小于length ,左边补足空格。

8, case

update #temp_result

set add_money =

case

 when add_money is null then 0

 else add_money

end,

consume_money =

case

 when consume_money is null then 0

 else consume_money

end

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoyongboy1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值