java调用sql server存储过程

使用java调用带有输出参数的存储过程

本例存储过程的作用为:查询用户输入的ip地址所在的位置信息(国家,省份,城市)

USE [databaseName]
GO
/****** Object:  StoredProcedure [dbo].[procedureName]    Script Date: 12/27/2019 01:31:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[procedureName]
	@ip varchar(50),
	@country char(2) out,
	@province nvarchar(255) out,
	@city nvarchar(255) out
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    select top 1 @country=country,@province=province,@city=city from tableName where ip_start<=@ip order by ip_start desc
END

先来看下在sql server 中可以怎么执行此存储过程

DECLARE	
		@country char(2),
		@province nvarchar(255),
		@city nvarchar(255)
		
exec p_dbip_city_sByIp  N'123.157.221.126',
		@country OUTPUT ,
		@province OUTPUT ,
		@city OUTPUT 
select @country,@province,@city

返回结果

在这里插入图片描述
与在百度上查询结果一致
在这里插入图片描述
然后看一下使用java语言如何调用

@Override
    public List<IpWarehouse> query(String url) {
        logger.info("call query url : " + url);
        //用户返回(其实本例中返回的只有一个对象,可以修改为返回对象而不是list)
        List<IpWarehouse> ipWarehouseList = Lists.newArrayList();
        try {
            //加载驱动
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //调用存储过程
            String procName = "{Call p_dbip_city_sByIp(?,?,?,?)}";
            //获取连接 根据sql server的地址,用户名,密码
            java.sql.Connection conn = DriverManager.getConnection(procUrl, procUserName, procPassword);
            CallableStatement pstmt = conn.prepareCall(procName);
            //设置输入参数,注意位置下标
            pstmt.setString(1, url);
            // 注册输出参数 返回信息
            pstmt.registerOutParameter(2,java.sql.Types.VARCHAR);
            pstmt.registerOutParameter(3,java.sql.Types.VARCHAR);
            pstmt.registerOutParameter(4,java.sql.Types.VARCHAR);
            //执行
            pstmt.execute();
            //定义一个对象用户接收返回信息
            //返回的不是一个ResultSet,所以不能用ResultSet接收返回对象
            IpWarehouse ipWarehouse = new IpWarehouse();
            
            ipWarehouse.setIp(url);
            ipWarehouse.setCountry(pstmt.getString(2));
            ipWarehouse.setRegion(pstmt.getString(3));
            ipWarehouse.setCity(pstmt.getString(4));
            ipWarehouseList.add(ipWarehouse);
        } catch (Exception e) {
            e.printStackTrace();
        }


        return ipWarehouseList;
    }

调用此服务地址,返回结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值