`
ducaijun
  • 浏览: 156915 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java调用存储过程参数默认值问题

阅读更多

    今天碰到一个问题,就是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 调用存储过程.doc

    Java调用存储过程是数据库操作中的常见任务,特别是在复杂的业务逻辑和数据处理中。存储过程是由数据库管理系统预先编译并存储的一系列SQL语句和控制流结构,可以在应用程序中按需调用,以提高性能、封装复杂逻辑和...

    java调用oracle存储过程精彩总结..docx

    - 调用存储过程时,参数的位置必须与存储过程定义中的一致,即`IN`参数先于`OUT`参数。 - `CallableStatement`的`getString()`方法中的数字表示参数位置,与存储过程中的`OUT`参数顺序对应。 - 游标(CURSOR)...

    Java中调用SQL存储过程示例

    总的来说,Java调用SQL Server存储过程涉及以下几个关键点: 1. 加载JDBC驱动。 2. 建立数据库连接。 3. 创建CallableStatement对象,设置SQL语句,使用问号作为占位符。 4. 注册输出参数,并设置输入参数。 5. 执行...

    JAVA100例之实例58 调用存储过程

    在Java编程中,调用存储过程是数据库交互中常见的任务之一。存储过程是预先编译并存储在数据库服务器上的SQL语句集合,可以提高应用程序的性能和安全性。本实例将详细讲解如何在Java中调用Oracle、MySQL或其他支持...

    存储过程参数查看器、存储过程助手

    4. 示例代码生成:部分查看器还能自动生成调用存储过程的示例代码,支持多种编程语言,如Java、C#、Python等,便于开发人员快速集成到应用中。 二、存储过程助手 存储过程助手是一个全面的辅助工具,旨在简化存储...

    关于java中存储过程的使用

    在Java中,我们通常使用JDBC(Java Database Connectivity)API来与数据库交互,调用存储过程也是通过JDBC实现的。首先,我们需要加载并建立到数据库的连接,这可以通过`DriverManager.getConnection()`方法完成。...

    存储过程-02.存储过程分类及参数使用方法

    3. **在应用程序中调用**:通过编程语言(如Java, C#, Python等)的数据库驱动程序调用存储过程。 4. **触发器调用**:在特定数据库事件(如INSERT, UPDATE, DELETE)发生时自动执行。 **四、存储过程的优点** 1....

    oracle class12.jar nls_charset12.jar存储过程接收数组空值

    3. **传递数组参数**:在调用存储过程时,将数组作为参数传递。对于JDBC,可以使用`OracleCallableStatement`的`setArray`方法: ```java OracleCallableStatement cs = (OracleCallableStatement) connection....

    java内存对象分配过程研究

    这些数据的存储顺序会受到虚拟机分配策略参数(如/CompactFields)和字段在Java源码中的顺序的影响。 3. **对齐填充(Padding)**:由于虚拟机要求对象起始地址必须是8字节的整数倍,填充是为了让对象大小符合这一要求而...

    数据库原理及应用课件:第10章 存储过程和触发器.ppt

    - 带多个输入参数和默认值的存储过程:查询学生在特定课程(默认为"Java")的成绩。 执行存储过程通常使用`EXECUTE`或其缩写`EXEC`,可以按照参数位置或参数名传递参数值。 10.1.3 从存储过程中返回数据 存储过程...

    数据库数据存储过程.ppt.ppt

    存储过程的调用可以在应用程序中进行,例如在C#、Java或VB.NET等编程语言中,通过ADO.NET或其他数据库连接库来调用。调用时传递参数,接收返回值,从而实现与数据库的交互。 总的来说,存储过程是数据库系统中的...

    java中的@Value获取不到配置文件的值,也加载不到默认值

    自己开发一个工具类,为第三方应用提供调用接口,但是打包后测试过程中,发现了一个问题就是在用@Value获取配置文件内容的时候,无法获取我们的配置信息,也无法加载我们配置的默认值!具体配置如下: @Value("${...

    实验6数据库实验——存储过程和触发器.doc

    6. **调用存储过程 `addresult2` 设置变量接收计算结果** ```sql DECLARE @s int; SET @s = 0; EXEC addresult2 10, @sum = @s OUTPUT; PRINT '1+2+3++n的结果是:'; PRINT @s; ``` - **功能**: 调用`...

    5、http请求的query参数1

    对于POST请求,参数存储在`Request`对象的`request`属性中,我们可以用类似的方式获取POST参数,例如: ```php // 获取POST参数 $name = $request->request->get('name'); ``` 此外,Symfony还提供了便捷的`dump()...

    自定义注解实现伪动态传参的小demo

    通过这种方式,我们可以根据注解中的参数实现接口调用记录的功能。尽管这些参数在编译时就已经确定,但我们可以利用它们模拟动态传参的效果,根据不同的参数值执行不同的处理逻辑。 在这个小demo中,主要展示了如何...

    java代码-Java变量各类型默认值

    在Java中,变量是我们存储数据的基本单元,每种类型的变量都有其特定的默认值。当我们声明一个变量但未初始化时,它将自动被赋予这些默认值。让我们深入探讨一下Java中的变量类型及其默认值。 Java变量主要分为三大...

    如何解决java.lang.StackOverflowError

    每个Java线程都有自己的调用栈,其大小由JVM参数`-Xss`(默认值因JVM版本和平台而异)控制。如果线程在执行过程中需要的栈空间超过了这个限制,就会抛出`StackOverflowError`。 在处理`StackOverflowError`时,一种...

    java经典问题答案

    - **栈内存**:用于存储局部变量、方法参数等,遵循先进后出原则,生命周期随方法调用结束而结束。 ##### 变量不赋值与赋null的区别 - 如果一个变量未被显式赋值,默认值取决于变量的数据类型:数值型为0,布尔型为...

    java向多线程中传递参数的三种方法详细介绍

    在Java编程中,多线程环境下的数据传递与同步开发模式下的方式有所不同,因为线程的执行顺序和结束时间是不确定的,无法像普通函数那样直接通过参数和返回值进行数据交互。以下将详细介绍三种向Java多线程传递参数的...

Global site tag (gtag.js) - Google Analytics