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

    今天碰到一个问题,就是java调用存储过程,但是存储过程有几个参数是有默认值的,而正好我这块是不需要给那些默认值赋值。

我先把测试的存储过程贴出来,用的是sql server 2005:

Sql代码  收藏代码
  1. Create PROCEDURE [dbo].[proc_defult_value]   
  2. @aaa varchar(20)='aaa,',  
  3. @bbb varchar(20)='bbb,',  
  4. @ccc varchar(20)='End',  
  5. @result varchar(2000) output  
  6. AS  
  7. BEGIN  
  8.     select @result=@aaa+@bbb+@ccc  
  9. END  

存储过程很简单,前三个参数都有默认值,第四个参数是返回前三个字符串连接的串。

我现在想只传入@aaa和@bbb的值,@ccc的值用默认的值。

首先写测试代码,如下:

Java代码  收藏代码
  1. import java.sql.CallableStatement;  
  2. import java.sql.Connection;  
  3. import java.sql.DriverManager;  
  4. import java.sql.Types;  
  5.   
  6. public class TestProcedure {  
  7.     public static void main(String[] args) {  
  8.         Connection conn = null;  
  9.         CallableStatement cs = null;  
  10.         try {  
  11.             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
  12.             conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1;DatabaseName=DBname", "sa", "sa");  
  13.             cs = conn.prepareCall("{CALL proc_defult_value(?,?,?,?)}");  
  14.             cs.setString("aaa", "aa,");  
  15.             cs.setString("bbb", "bb,");  
  16.             cs.setString("ccc", "cc");  
  17.             cs.registerOutParameter("result", Types.VARCHAR);  
  18.             cs.execute();  
  19.             System.out.println(cs.getString("result"));  
  20.             cs.close();  
  21.         } catch (Exception e) {  
  22.             e.printStackTrace();  
  23.         } finally {  
  24.             try {  
  25.                 if (cs != null)  
  26.                     cs.close();  
  27.                 if (conn != null)  
  28.                     conn.close();  
  29.             } catch (Exception e) {  
  30.                 e.printStackTrace();  
  31.             }  
  32.         }  
  33.     }  
  34. }  

这块要注意一下,因为我用的是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,且给占位符设置值得时候不能再用参数名了,只能用数字。

Java代码  收藏代码
  1. import java.sql.CallableStatement;  
  2. import java.sql.Connection;  
  3. import java.sql.DriverManager;  
  4. import java.sql.Types;  
  5.   
  6. public class TestProcedure {  
  7.     public static void main(String[] args) {  
  8.         Connection conn = null;  
  9.         CallableStatement cs = null;  
  10.         try {  
  11.             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
  12.             conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1;DatabaseName=DBname", "sa", "sa");  
  13.             cs = conn.prepareCall("{CALL proc_defult_value(?,?,default,?)}");  
  14.             cs.setString(1, "aa,");  
  15.             cs.setString(2, "bb,");  
  16.             //cs.setString("ccc", "cc");  
  17.             cs.registerOutParameter(3, Types.VARCHAR);  
  18.             cs.execute();  
  19.             System.out.println(cs.getString(3));  
  20.             cs.close();  
  21.         } catch (Exception e) {  
  22.             e.printStackTrace();  
  23.         } finally {  
  24.             try {  
  25.                 if (cs != null)  
  26.                     cs.close();  
  27.                 if (conn != null)  
  28.                     conn.close();  
  29.             } catch (Exception e) {  
  30.                 e.printStackTrace();  
  31.             }  
  32.         }  
  33.     }  
  34. }  
原文地址:https://www.cnblogs.com/xzcBY/p/8662133.html