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


        今天碰到一个问题,就是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. }  
  • 相关阅读:
    oracle中 connect by prior 递归算法
    sql优化__rownum的使用【转】
    ASP.NET Core四大部件
    .net core Socket
    .NET Core 配置文件
    .NET Core IOC AOP
    Quartz.Net—MisFire
    Quartz.Net—配置化
    Quartz.Net—IJob特性
    Quartz.Net—DateBuilder
  • 原文地址:https://www.cnblogs.com/xzcBY/p/8662133.html
Copyright © 2020-2023  润新知