zoukankan      html  css  js  c++  java
  • 【转】Java 调用SQL 语法Server 的存储过程详解

    Java 调用SQL 语法Server 的存储过程详解
    1 应用不带参数的存储过程
    应用JDBC 驱动程式调用不带参数的存储过程时,必需应用call SQL 语法转义序列。
    不带参数的call 转义序列的句子语法如下所示:
    以下是引用片段:
    {call procedure-name}
    作为举例,在SQL 语法Server 二零零五AdventureWorks 示例数据库中创建以下存储
    过程:
    以下是引用片段:
    CREATE PROCEDURE ContactFormalNames
    AS
    BEGIN
    SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
    FROM Person.Contact
    END
    此存储过程返回单个结果集,其中包含一列数据(由Person.Contact 表中前十个请致电的称
    呼、名字和姓氏组成)。
    在下面的举例中,将向此参数传递AdventureWorks 示例数据库的打开连接,然后应用
    executeQuery 技巧调用ContactFormalNames 存储过程。
    以下是引用片段:
    public static void executeSprocNoParams(Connection con) ...{
    try ...{
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("{call dbo.ContactFormalNames}");
    while (rs.next()) ...{
    System.out.println(rs.getString("FormalName"));
    }
    rs.close();
    stmt.close();
    }
    catch (Exception e) ...{
    e.printStackTrace();
    }
    }
    2 应用带有输入参数的存储过程
    应用JDBC 驱动程式调用带参数的存储过程时,必需结合SQL 语法ServerConnection
    类的prepareCall 技巧应用call SQL 语法转义序列。带有IN 参数的call 转义序列的句子
    语法如下所示:
    以下是引用片段:
    {call procedure-name[([参数][,[参数]]...)]}
    构造call 转义序列时,请应用?(如何)char 来指定IN 参数。此char 充当要传递给该
    存储过程的参数值的占位符。应用SQL 语法ServerPreparedStatement 类的setter 技巧之一
    为参数指定值。可应用的setter 技巧由IN 参数的数据类别决定。
    向setter 技巧传递值时,不仅需求指定要在参数中应用的实际值,还必需指定参数在
    存储过程中的序数位置。例如,假如存储过程包含单个IN 参数,则其序数值为1。假如
    存储过程包含两个参数,则第一个的序数值为1,第二个序数值为2。
    作为如何调用包含IN 参数的存储过程的举例,应用SQL 语法Server 二零零五
    AdventureWorks 示例数据库中的uspEmployeeManagers 存储过程。此存储过程接受名为
    EmployeeID 的单个输入参数(它是一个的整数值),然后基于指定的EmployeeID 返回受雇
    及其经理的递归列表。下面是调用此存储过程的Java 代码:
    以下是引用片段:
    public static void executeSprocInParams(Connection con) ...{
    try ...{
    PreparedStatement pstmt = con.prepareStatement("{call dbo.uspEmployeeManagers(?)}");
    pstmt.setInt(1, 50);
    ResultSet rs = pstmt.executeQuery();
    while (rs.next()) ...{
    System.out.println("EMPLOYEE:");
    System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
    System.out.println("MANAGER:");
    System.out.println(rs.getString("ManagerLastName") + ", " +
    rs.getString("ManagerFirstName"));
    System.out.println();
    }
    rs.close();
    pstmt.close();
    }
    catch (Exception e) ...{
    e.printStackTrace();
    }
    }
    3 应用带有输出参数的存储过程
    应用JDBC 驱动程式调用此类存储过程时,必需结合SQL 语法ServerConnection 类的
    prepareCall 技巧应用call SQL 语法转义序列。带有OUT 参数的call 转义序列的句子语
    法如下所示:
    以下是引用片段:
    {call procedure-name[([参数][,[参数]]...)]}
    构造call 转义序列时,请应用?(如何)char 来指定OUT 参数。此char 充当要从该存
    储过程返回的参数值的占位符。要为OUT 参数指定值,必需在运行存储过程前应用SQL
    语法ServerCallableStatement 类的registerOutParameter 技巧指定各参数的数据类别。
    应用registerOutParameter 技巧为OUT 参数指定的值必需是Java 编程.sql.Types 所包
    含的JDBC 数据类别之一,而它又被映射成本地SQL 语法Server 数据类别之一。有关
    JDBC 和SQL 语法Server 数据类别的详细消息,请参阅了解JDBC 驱动程式数据类别。
    当您对于OUT 参数向registerOutParameter 技巧传递一个的值时,不仅必需指定要用
    于此参数的数据类别,而且必需在存储过程中指定此参数的序号位置或此参数的名字。例如,
    假如存储过程包含单个OUT 参数,则其序数值为1;假如存储过程包含两个参数,则第一
    个的序数值为1,第二个序数值为2。
    作为举例,在SQL 语法Server 二零零五AdventureWorks 示例数据库中创建以下存储
    过程: 根据指定的整数IN 参数(employeeID),该存储过程也返回单个整数OUT 参数
    (managerID)。根据HumanResources.Employee 表中包含的EmployeeID,OUT 参数中返回
    的值为ManagerID。
    在下面的举例中,将向此参数传递AdventureWorks 示例数据库的打开连接,然后应用
    execute 技巧调用ImmediateManager 存储过程:
    以下是引用片段:
    public static void executeStoredProcedure(Connection con) ...{
    try ...{
    CallableStatement cstmt = con.prepareCall("{call dbo.ImmediateManager(?, ?)}");
    cstmt.setInt(1, 5);
    cstmt.registerOutParameter(2, Java 编程.sql.Types.INTEGER);
    cstmt.execute();
    System.out.println("MANAGER ID: " + cstmt.getInt(2));
    }
    catch (Exception e) ...{
    e.printStackTrace();
    }
    }
    本示例应用序号位置来标识参数。或者,也应用参数的名字(而非其序号位置)来标识此参数。
    下面的代码示例改正了上一个的示例,以说明如何在Java 实际运用程式中应用命名参数。
    请留意,这一些参数名字对应于存储过程的定义中的参数名字: CREATE PROCEDURE
    ImmediateManager
    以下是引用片段:
    @employeeID INT,
    @managerID INT OUTPUT
    AS
    BEGIN
    SELECT @managerID = ManagerID
    FROM HumanResources.Employee
    WHERE EmployeeID = @employeeID
    END
    存储过程估计返回更新计数和多个结果集。Microsoft(微软) SQL 语法Server 二零
    零五JDBC Driver 遵循JDBC 3.0 规范,此规范规定在INDEX OUT 参数之前应INDEX 多
    个结果集和更新计数。也那是说,实际运用程式应先INDEX 所有ResultSet object 和更新计
    数,然后应用CallableStatement.getter 技巧INDEX OUT 参数。否则,当INDEX OUT 参
    数时,尚未INDEX 的ResultSet object 和更新计数将丢失。
    4 应用带有返回状态的存储过程
    应用JDBC 驱动程式调用这种存储过程时,必需结合SQL 语法ServerConnection 类的
    prepareCall 技巧应用call SQL 语法转义序列。返回状态参数的call 转义序列的句子语法
    如下所示:
    以下是引用片段:
    {[?=]call procedure-name[([参数][,[参数]]...)]}
    构造call 转义序列时,请应用?(如何)char 来指定返回状态参数。此char 充当要从该
    存储过程返回的参数值的占位符。要为返回状态参数指定值,必需在运行存储过程前应用
    SQL 语法ServerCallableStatement 类的registerOutParameter 技巧指定参数的数据类别。
    此外,向registerOutParameter 技巧传递返回状态参数值时,不仅需求指定要应用的参
    数的数据类别,还必需指定参数在存储过程中的序数位置。对于返回状态参数,其序数位置
    始终为1 , 这是由于它始终是调用存储过程时的第一个的参数。尽管SQL 语法
    ServerCallableStatement 类支持应用参数的名字来指示特定参数,但您只能对返回状态参数
    应用参数的序号位置编号。
    作为举例,在SQL 语法Server 二零零五AdventureWorks 示例数据库中创建以下存储
    过程:
    以下是引用片段:
    CREATE PROCEDURE CheckContactCity
    (@cityName CHAR(50))
    AS
    BEGIN
    IF ((SELECT COUNT(*)
    FROM Person.Address
    WHERE City = @cityName) > 1)
    RETURN 1
    ELSE
    RETURN 0
    END
    该存储过程返回状态值1 或0 , 这取决于也许能在表Person.Address 中找到
    cityName 参数指定的都市。
    在下面的举例中,将向此参数传递AdventureWorks 示例数据库的打开连接,然后应用
    execute 技巧调用CheckContactCity 存储过程:
    以下是引用片段:
    public static void executeStoredProcedure(Connection con) ...{
    try ...{
    CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
    cstmt.registerOutParameter(1, Java 编程.sql.Types.INTEGER);
    cstmt.setString(2, "Atlanta");
    cstmt.execute();
    System.out.println("RETURN STATUS: " + cstmt.getInt(1));
    }
    cstmt.close();
    catch (Exception e) ...{
    e.printStackTrace();
    }
    }
    5 应用带有更新计数的存储过程
    应用SQL 语法ServerCallableStatement 类构建对存储过程的调用之后,应用execute
    或execute 更新技巧中的任意一个的来调用此存储过程。execute 更新技巧将返回一个的
    int 值,该值包含受此存储过程效果的行数,但execute 技巧不返回此值。假如应用execute
    技巧,并且期望获得受效果的行数计数,则在运行存储过程后调用get 更新Count 技巧。
    作为举例,在SQL 语法Server 二零零五AdventureWorks 示例数据库中创建以下表和
    存储过程:
    以下是引用片段:
    CREATE TABLE TestTable
    (Col1 int IDENTitY,
    Col2 varchar(50),
    Col3 int);
    CREATE PROCEDURE 更新TestTable
    @Col2 varchar(50),
    @Col3 int
    AS
    BEGIN
    UPDATE TestTable
    SET Col2 = @Col2, Col3 = @Col3
    END;
    在下面的举例中,将向此参数传递AdventureWorks 示例数据库的打开连接,并应用execute
    技巧调用更新TestTable 存储过程,然后应用get 更新Count 技巧返回受存储过程效果的
    行计数。
    以下是引用片段:
    public static void execute 更新StoredProcedure(Connection con) ...{
    try ...{
    CallableStatement cstmt = con.prepareCall("{call dbo.更新TestTable(?, ?)}");
    cstmt.setString(1, "A");
    cstmt.setInt(2, 100);
    cstmt.execute();
    int count = cstmt.get 更新Count();
    cstmt.close();
    System.out.println("ROWS AFFECTED: " + count);
    }
    catch (Exception e) ...{
    e.printStackTrace();
    }
    }

  • 相关阅读:
    猪猪的机器学习笔记(八)聚类
    猪猪的机器学习笔记(七)最大熵模型
    猪猪的机器学习笔记(九)推荐系统
    标签button:点击button按钮时,出现了页面自动刷新的情况
    SQL案例
    SQL学习记录:函数(二)
    SQL学习记录:定义(一)
    C# 后台报错输出到日志
    DateTime 时间类型总结(前端)
    笛卡尔积的使用
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3138074.html
Copyright © 2011-2022 走看看