首页 > 数据库 >记录:jdbc调用sqlserver存储过程

记录:jdbc调用sqlserver存储过程

时间:2023-08-08 15:45:00浏览次数:38  
标签:存储 jdbc log sqlserver 调用 cstmt proc

  • 1、现场为内网环境,不利于测试
  • 2、调用sql server存储过程,报错:为过程或函数 ** 指定了过多的参数

一、制作本地sql server环境

1、docker安装sql server

#获取镜像
docker pull mcr.microsoft.com/azure-sql-edge
#启动 账号: sa 密码: Password@
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Password@' -p 1433:1433  --name sqlserver -d 镜像名称

image.png

2、建表

建一张名为: t_test_proc

略。。。

3、创建存储过程

create proc proc_query_with_arg 
@v1 varchar(40),
@v2 varchar(40),
@v3 varchar(40)
as 
select * from t_test_proc where create_time >= @v1 and create_time <= @v2 AND test_status = @v3

#直接调用
exec proc_query_with_arg @v1 = '20230101', @v2 = '20231230' , @v3= '2';

二、使用jdbc调用

1、修改数据库连接配置

# 数据库配置需要根据安装的sqlserver修改
# 当前设置是用上面的 docker 安装后的配置
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://localhost:1433;DatabaseName=master
username: sa
password: Password@

2、测试问题代码

经过测试,查询当前存储过程的时候只需要设置入参即可
是否需要设置出参类型影响因素(猜测):

  • 数据库类型 sql server 、oracle、 mysql
  • 存储过程写法,没有用@设置返回值
public List<TestEntity> queryTestProc(String startDate, String endDate) {
    log.info("查询入参为:{},{}",startDate,endDate);
    List<TestEntity> testEntityList = new ArrayList<>();
    try (Connection conn = dataSource.getConnection()){
        ResultSetMapper<TestEntityQuery> resultSetMapper = new ResultSetMapper<>();
        log.info("获取数据库连接成功");
        //问题代码,只需要设置三个入参即可
        //CallableStatement cstmt = conn.prepareCall("{ call proc_query_with_arg(?,?,?,?) }");
        CallableStatement cstmt = conn.prepareCall("{ call proc_query_with_arg(?,?,?) }");
        cstmt.setString(1, startDate);
        cstmt.setString(2, endDate);
        cstmt.setString(3, "2");
        //问题代码,多了设置返回值类型,会报错
        //cstmt.registerOutParameter(4, Types.ARRAY);
        ResultSet resultSet = cstmt.executeQuery();
        log.info("执行存储过程成功");
        List<TestEntityQuery> pojoList = resultSetMapper.mapRersultSetToObject(resultSet, TestEntityQuery.class);
        if (CollectionUtils.isNotEmpty(pojoList) && pojoList != null) {
            for (TestEntityQuery pojo : pojoList) {
                log.info("执行存储过程的结果为:{}", pojo);
                //....略
            }
        } else {
            log.info("ResultSet is empty. Please check if database table is empty");
        }

    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    return testEntityList;
}

标签:存储,jdbc,log,sqlserver,调用,cstmt,proc
From: https://www.cnblogs.com/lulu-buding/p/17614520.html

相关文章

  • hadoop组件---数据仓库(五)---通过JDBC连接hive的thrift或者hiveserver2
    我们在上一篇文章中已经学习了Hive的常用命令,但是如果使用其他的语言如何跟Hive进行交互呢。Thrift简介Hive拥有HiveServer(Thrift)或者Hiveserver2组件,提供了JDBC驱动服务,使得我们可以用Java代码或者Python来连接Hive并进行一些关系型数据库的sql语句查询等操作。HiveServer或者Hi......
  • 获取微信签名方法调用
    微信签名生成1、微信签名生成参照微信支付文档中心:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_0.shtmlimportjava.io.BufferedInputStream;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;import......
  • SqlServer时间格式化
       sqlserver日期格式化中文-年月日selectconvert(varchar,datepart(yy,getdate()))+N'年'+convert(varchar,datepart(mm,getdate()))+N'月'+convert(varchar,datepart(dd,getdate()))+N'日',cast(datepart(yy,getdate())asvarchar)+N'年......
  • Java Reflection机制 实现类的反射与动态调用
    JavaReflection机制实现类的反射与动态调用JavaReflection机制被广泛用于实现类的反射和动态调用,反射是指在运行时检查和操作类的能力。只需要一个类的名称或对象的引用,就可以获取类的信息,调用类的方法,创建对象实例等。JavaReflection机制实现类的反射与动态调用JavaRefle......
  • 调用Geoserver发布的图层中文字段显示乱码
    通过OL使用WFS服务,调用发布的图层字段,中文字段显示为乱码  有几种原因:①指定打印的字符格式在代码中指定输出的编码格式,例如使用console.log('@@xxx',xzq.toString('utf-8'))来指定输出为UTF-8编码格式。②添加meta如果是在网页中输出乱码,可以在HTML的<head>标......
  • Siemens 西门子SCL语言编程实例——循环调用电机
    导读西门子结构化编程可将不同的控制任务划分为不同的控制区域,相同控制功能数量众多的设备可利用具备多重背景的FB功能块重复调用来解决,使程序简洁、清晰、合理,易读性强,更改方便,为以后系统的升级改造提供了极大的便利。SCL语言的应用,更是大大减小了程序代码的占用空间,使西门......
  • Go语言:调用cmd隐藏黑窗口的方法(包括子进程)(转)
    说明:通过 go 的标准库 exec 调用 cmd 命令时会弹出 cmd的黑窗口只需要在编译时加入参数:-ldflags="-Hwindowsgui"示例如下:gobuild-ldflags="-Hwindowsgui-w-s"main.go通过子进程调用的cmd命令会弹黑窗口:示例如下:cmd:=exec.Command(`cmd`,`/......
  • 从原理聊JVM(四):JVM中的方法调用原理
    1引言多态是Java语言极为重要的一个特性,可以说是Java语言动态性的根本,那么线程执行一个方法时到底在内存中经历了什么,JVM又是如何确定方法执行版本的呢?2栈帧JVM中由栈帧存储方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法的调用就是从入栈到出栈到过......
  • Java:Java程序通过执行系统命令调用Python脚本
    本文实现功能:Java程序调用Python脚本Python脚本importsysdefadd(x,y):returnx+yif__name__=="__main__":print(add(int(sys.argv[1]),int(sys.argv[2])))直接执行$pythonmath.py123Java程序调用Python脚本packageio.github.mouday.utils;importja......
  • C#实现SqlServer数据库同步
    实现效果:设计思路:1.开启数据库及表的cdc,定时查询cdc表数据,封装sql语句(通过执行类型,主键;修改类型的cdc数据只取最后更新的记录),添加到离线数据表;2.线程定时查询离线数据表,更新远程库数据;3.远程库数据被更改又会产生cdc数据,对此数据进行拦截;配置文件说明:{ "AsyncInterval":......