今天碰到一个问题,就是java调用存储过程,但是存储过程有几个参数是有默认值的,而正好我这块是不需要给那些默认值赋值。
我先把测试的存储过程贴出来,用的是sql server 2005:
Create PROCEDURE [dbo].[proc_defult_value] @aaa varchar(20)='aaa,', @bbb varchar(20)='bbb,', @ccc varchar(20)='End', @result varchar(2000) output AS BEGIN select @result=@aaa+@bbb+@ccc END
存储过程很简单,前三个参数都有默认值,第四个参数是返回前三个字符串连接的串。
我现在想只传入@aaa和@bbb的值,@ccc的值用默认的值。
首先写测试代码,如下:
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Types; public class TestProcedure { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1;DatabaseName=DBname", "sa", "sa"); cs = conn.prepareCall("{CALL proc_defult_value(?,?,?,?)}"); cs.setString("aaa", "aa,"); cs.setString("bbb", "bb,"); cs.setString("ccc", "cc"); cs.registerOutParameter("result", Types.VARCHAR); cs.execute(); System.out.println(cs.getString("result")); cs.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (cs != null) cs.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
这块要注意一下,因为我用的是sql server 2005 Class.forName如下:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
如果你用的是sql server 2000的话 Class.forName如下:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
执行结果是:aa,bb,cc,
与预期的一致,
现在我打算只传入@aaa和@bbb这两个值,经过几次测试才知道需要用default,且给占位符设置值得时候不能再用参数名了,只能用数字。
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Types; public class TestProcedure { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1;DatabaseName=DBname", "sa", "sa"); cs = conn.prepareCall("{CALL proc_defult_value(?,?,default,?)}"); cs.setString(1, "aa,"); cs.setString(2, "bb,"); //cs.setString("ccc", "cc"); cs.registerOutParameter(3, Types.VARCHAR); cs.execute(); System.out.println(cs.getString(3)); cs.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (cs != null) cs.close(); if (conn != null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
相关推荐
Java调用存储过程是数据库操作中的常见任务,特别是在复杂的业务逻辑和数据处理中。存储过程是由数据库管理系统预先编译并存储的一系列SQL语句和控制流结构,可以在应用程序中按需调用,以提高性能、封装复杂逻辑和...
- 调用存储过程时,参数的位置必须与存储过程定义中的一致,即`IN`参数先于`OUT`参数。 - `CallableStatement`的`getString()`方法中的数字表示参数位置,与存储过程中的`OUT`参数顺序对应。 - 游标(CURSOR)...
总的来说,Java调用SQL Server存储过程涉及以下几个关键点: 1. 加载JDBC驱动。 2. 建立数据库连接。 3. 创建CallableStatement对象,设置SQL语句,使用问号作为占位符。 4. 注册输出参数,并设置输入参数。 5. 执行...
在Java编程中,调用存储过程是数据库交互中常见的任务之一。存储过程是预先编译并存储在数据库服务器上的SQL语句集合,可以提高应用程序的性能和安全性。本实例将详细讲解如何在Java中调用Oracle、MySQL或其他支持...
4. 示例代码生成:部分查看器还能自动生成调用存储过程的示例代码,支持多种编程语言,如Java、C#、Python等,便于开发人员快速集成到应用中。 二、存储过程助手 存储过程助手是一个全面的辅助工具,旨在简化存储...
在Java中,我们通常使用JDBC(Java Database Connectivity)API来与数据库交互,调用存储过程也是通过JDBC实现的。首先,我们需要加载并建立到数据库的连接,这可以通过`DriverManager.getConnection()`方法完成。...
3. **在应用程序中调用**:通过编程语言(如Java, C#, Python等)的数据库驱动程序调用存储过程。 4. **触发器调用**:在特定数据库事件(如INSERT, UPDATE, DELETE)发生时自动执行。 **四、存储过程的优点** 1....
3. **传递数组参数**:在调用存储过程时,将数组作为参数传递。对于JDBC,可以使用`OracleCallableStatement`的`setArray`方法: ```java OracleCallableStatement cs = (OracleCallableStatement) connection....
这些数据的存储顺序会受到虚拟机分配策略参数(如/CompactFields)和字段在Java源码中的顺序的影响。 3. **对齐填充(Padding)**:由于虚拟机要求对象起始地址必须是8字节的整数倍,填充是为了让对象大小符合这一要求而...
- 带多个输入参数和默认值的存储过程:查询学生在特定课程(默认为"Java")的成绩。 执行存储过程通常使用`EXECUTE`或其缩写`EXEC`,可以按照参数位置或参数名传递参数值。 10.1.3 从存储过程中返回数据 存储过程...
存储过程的调用可以在应用程序中进行,例如在C#、Java或VB.NET等编程语言中,通过ADO.NET或其他数据库连接库来调用。调用时传递参数,接收返回值,从而实现与数据库的交互。 总的来说,存储过程是数据库系统中的...
自己开发一个工具类,为第三方应用提供调用接口,但是打包后测试过程中,发现了一个问题就是在用@Value获取配置文件内容的时候,无法获取我们的配置信息,也无法加载我们配置的默认值!具体配置如下: @Value("${...
6. **调用存储过程 `addresult2` 设置变量接收计算结果** ```sql DECLARE @s int; SET @s = 0; EXEC addresult2 10, @sum = @s OUTPUT; PRINT '1+2+3++n的结果是:'; PRINT @s; ``` - **功能**: 调用`...
对于POST请求,参数存储在`Request`对象的`request`属性中,我们可以用类似的方式获取POST参数,例如: ```php // 获取POST参数 $name = $request->request->get('name'); ``` 此外,Symfony还提供了便捷的`dump()...
通过这种方式,我们可以根据注解中的参数实现接口调用记录的功能。尽管这些参数在编译时就已经确定,但我们可以利用它们模拟动态传参的效果,根据不同的参数值执行不同的处理逻辑。 在这个小demo中,主要展示了如何...
在Java中,变量是我们存储数据的基本单元,每种类型的变量都有其特定的默认值。当我们声明一个变量但未初始化时,它将自动被赋予这些默认值。让我们深入探讨一下Java中的变量类型及其默认值。 Java变量主要分为三大...
每个Java线程都有自己的调用栈,其大小由JVM参数`-Xss`(默认值因JVM版本和平台而异)控制。如果线程在执行过程中需要的栈空间超过了这个限制,就会抛出`StackOverflowError`。 在处理`StackOverflowError`时,一种...
- **栈内存**:用于存储局部变量、方法参数等,遵循先进后出原则,生命周期随方法调用结束而结束。 ##### 变量不赋值与赋null的区别 - 如果一个变量未被显式赋值,默认值取决于变量的数据类型:数值型为0,布尔型为...
在Java编程中,多线程环境下的数据传递与同步开发模式下的方式有所不同,因为线程的执行顺序和结束时间是不确定的,无法像普通函数那样直接通过参数和返回值进行数据交互。以下将详细介绍三种向Java多线程传递参数的...