callablestatementtest.java
来自「jtds的源码 是你学习java的好东西」· Java 代码 · 共 945 行 · 第 1/3 页
JAVA
945 行
assertFalse(cstmt.execute());
try {
assertEquals(14, cstmt.getInt(1));
assertEquals(13, cstmt.getInt(2));
// Don't fail the test if we got here. Another driver or a future
// version could cache all the results and obtain the output
// parameter values from the beginning.
} catch (SQLException ex) {
assertEquals("HY010", ex.getSQLState());
assertTrue(ex.getMessage().indexOf("getMoreResults()") >= 0);
}
assertEquals(1, cstmt.getUpdateCount()); // INSERT
assertFalse(cstmt.getMoreResults());
assertEquals(1, cstmt.getUpdateCount()); // UPDATE
assertTrue(cstmt.getMoreResults()); // SELECT
ResultSet rs = cstmt.getResultSet();
assertNotNull(rs);
// Close the ResultSet; this should cache the following update counts
rs.close();
assertEquals(14, cstmt.getInt(1));
assertEquals(13, cstmt.getInt(2));
assertFalse(cstmt.getMoreResults());
assertEquals(1, cstmt.getUpdateCount()); // INSERT
assertFalse(cstmt.getMoreResults());
assertEquals(2, cstmt.getUpdateCount()); // UPDATE
assertFalse(cstmt.getMoreResults());
assertEquals(-1, cstmt.getUpdateCount());
cstmt.close();
}
/**
* Test that procedure outputs are available immediately after processing
* the last ResultSet returned by the procedure (i.e that update counts
* are cached) even if getMoreResults() and ResultSet.close() are not
* called.
*/
public void testProcessUpdateCounts4() throws SQLException {
Statement stmt = con.createStatement();
assertFalse(stmt.execute("CREATE TABLE #testProcessUpdateCounts4 (val INT)"));
assertFalse(stmt.execute("CREATE PROCEDURE #procTestProcessUpdateCounts4"
+ " @res INT OUT AS"
+ " INSERT INTO #testProcessUpdateCounts4 VALUES (1)"
+ " UPDATE #testProcessUpdateCounts4 SET val = 2"
+ " SELECT * FROM #testProcessUpdateCounts4"
+ " INSERT INTO #testProcessUpdateCounts4 VALUES (1)"
+ " UPDATE #testProcessUpdateCounts4 SET val = 3"
+ " SET @res = 13"
+ " RETURN 14"));
stmt.close();
CallableStatement cstmt = con.prepareCall(
"{?=call #procTestProcessUpdateCounts4(?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.registerOutParameter(2, Types.INTEGER);
assertFalse(cstmt.execute());
try {
assertEquals(14, cstmt.getInt(1));
assertEquals(13, cstmt.getInt(2));
// Don't fail the test if we got here. Another driver or a future
// version could cache all the results and obtain the output
// parameter values from the beginning.
} catch (SQLException ex) {
assertEquals("HY010", ex.getSQLState());
assertTrue(ex.getMessage().indexOf("getMoreResults()") >= 0);
}
assertEquals(1, cstmt.getUpdateCount()); // INSERT
assertFalse(cstmt.getMoreResults());
assertEquals(1, cstmt.getUpdateCount()); // UPDATE
assertTrue(cstmt.getMoreResults()); // SELECT
ResultSet rs = cstmt.getResultSet();
assertNotNull(rs);
// Process all rows; this should cache the following update counts
assertTrue(rs.next());
assertFalse(rs.next());
assertEquals(14, cstmt.getInt(1));
assertEquals(13, cstmt.getInt(2));
// Only close the ResultSet now
rs.close();
assertFalse(cstmt.getMoreResults());
assertEquals(1, cstmt.getUpdateCount()); // INSERT
assertFalse(cstmt.getMoreResults());
assertEquals(2, cstmt.getUpdateCount()); // UPDATE
assertFalse(cstmt.getMoreResults());
assertEquals(-1, cstmt.getUpdateCount());
cstmt.close();
}
/**
* Test for bug [ 1062671 ] SQLParser unable to parse CONVERT(char,{ts ?},102)
*/
public void testTsEscape() throws Exception {
Timestamp ts = Timestamp.valueOf("2004-01-01 23:56:56");
Statement stmt = con.createStatement();
assertFalse(stmt.execute("CREATE TABLE #testTsEscape (val DATETIME)"));
PreparedStatement pstmt = con.prepareStatement("INSERT INTO #testTsEscape VALUES({ts ?})");
pstmt.setTimestamp(1, ts);
assertEquals(1, pstmt.executeUpdate());
ResultSet rs = stmt.executeQuery("SELECT * FROM #testTsEscape");
assertTrue(rs.next());
assertEquals(ts, rs.getTimestamp(1));
}
/**
* Test for separation of IN and INOUT/OUT parameter values
*/
public void testInOutParameters() throws Exception {
Statement stmt = con.createStatement();
stmt.execute("CREATE PROC #testInOut @in int, @out int output as SELECT @out = @out + @in");
CallableStatement cstmt = con.prepareCall("{ call #testInOut ( ?,? ) }");
cstmt.setInt(1, 1);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.setInt(2, 2);
cstmt.execute();
assertEquals(3, cstmt.getInt(2));
cstmt.execute();
assertEquals(3, cstmt.getInt(2));
}
/**
* Test that procedure names containing semicolons are parsed correctly.
*/
public void testSemicolonProcedures() throws Exception {
Statement stmt = con.createStatement();
stmt.execute("CREATE PROC #testInOut @in int, @out int output as SELECT @out = @out + @in");
CallableStatement cstmt = con.prepareCall("{call #testInOut;1(?,?)}");
cstmt.setInt(1, 1);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.setInt(2, 2);
cstmt.execute();
assertEquals(3, cstmt.getInt(2));
cstmt.execute();
assertEquals(3, cstmt.getInt(2));
}
/**
* Test that procedure calls with both literal parameters and parameterr
* markers are executed correctly (bug [1078927] Callable statement fails).
*/
public void testNonRpcProc1() throws Exception {
Statement stmt = con.createStatement();
stmt.execute(
"create proc #testsp1 @p1 int, @p2 int out as set @p2 = @p1");
stmt.close();
CallableStatement cstmt = con.prepareCall("{call #testsp1(100, ?)}");
cstmt.setInt(1, 1);
cstmt.execute();
cstmt.close();
}
/**
* Test that procedure calls with both literal parameters and parameterr
* markers are executed correctly (bug [1078927] Callable statement fails).
*/
public void testNonRpcProc2() throws Exception {
Statement stmt = con.createStatement();
stmt.execute("create proc #testsp2 @p1 int, @p2 int as return 99");
stmt.close();
CallableStatement cstmt = con.prepareCall("{?=call #testsp2(100, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setInt(2, 2);
cstmt.execute();
assertEquals(99, cstmt.getInt(1));
cstmt.close();
}
/**
* Test for bug [1152329] Spurious output params assigned (TIMESTMP).
* <p/>
* If a stored procedure execute WRITETEXT or UPDATETEXT commands, spurious
* output parameter data is returned to the client. This additional data
* can be confused with the real output parameter data leading to an output
* string parameter returning the text ?TIMESTMP? on SQL Server 7+ or
* binary garbage on other servers.
*/
public void testWritetext() throws Exception {
Statement stmt = con.createStatement();
stmt.execute(
"create proc #testWritetext @p1 varchar(20) output as "
+ "begin "
+ "create table #test (id int, txt text) "
+ "insert into #test (id, txt) values(1, '') "
+ "declare @ptr binary(16) "
+ "select @ptr = (select textptr(txt) from #test where id = 1) "
+ "writetext #test.txt @ptr 'This is a test' "
+ "select @p1 = 'done' "
+ "end");
stmt.close();
CallableStatement cstmt = con.prepareCall("{call #testWritetext(?)}");
cstmt.registerOutParameter(1, Types.VARCHAR);
cstmt.execute();
assertEquals("done", cstmt.getString(1));
cstmt.close();
}
/**
* Test for bug [1047208] SQLException chaining not implemented correctly:
* checks that all errors are returned and that output variables are also
* returned.
*/
public void testErrorOutputParams() throws Exception {
Statement stmt = con.createStatement();
stmt.execute("CREATE PROC #error_proc @p1 int out AS \r\n" +
"RAISERROR ('TEST EXCEPTION', 15, 1)\r\n" +
"SELECT @P1=100\r\n" +
"CREATE TABLE #DUMMY (id int)\r\n" +
"INSERT INTO #DUMMY VALUES(1)\r\n"+
"INSERT INTO #DUMMY VALUES(1)");
stmt.close();
CallableStatement cstmt = con.prepareCall("{call #error_proc(?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
try {
cstmt.execute();
fail("Expecting exception");
} catch (SQLException e) {
assertEquals("TEST EXCEPTION", e.getMessage());
}
assertEquals(100, cstmt.getInt(1));
cstmt.close();
}
/**
* Test for bug [1236078] Procedure doesn't get called for some BigDecimal
* values - invalid bug.
*/
public void testBigDecimal() throws Exception {
Statement stmt = con.createStatement();
assertEquals(0, stmt.executeUpdate("CREATE TABLE #dec_test "
+ "(ColumnVC varchar(50) NULL, ColumnDec decimal(18,4) NULL)"));
assertEquals(0, stmt.executeUpdate("CREATE PROCEDURE #dec_test2"
+ "(@inVc varchar(32), @inBd decimal(18,4)) AS "
+ "begin "
+ "update #dec_test set columnvc = @inVc, columndec = @inBd "
+ "end"));
assertEquals(1, stmt.executeUpdate(
"insert #dec_test (columnvc, columndec) values (null, null)"));
stmt.close();
CallableStatement cstmt = con.prepareCall("{call #dec_test2 (?,?)}");
cstmt.setString(1, "D: " + new java.util.Date());
cstmt.setBigDecimal(2, new BigDecimal("2.9E+7"));
assertEquals(1, cstmt.executeUpdate());
cstmt.close();
}
/**
* Test that output result sets, return values and output parameters are
* correctly handled for a remote procedure call.
* To set up this test you will a local and remote server where the remote
* server allows logins from the local test server.
* Install the following stored procedure on the remote server:
*
* create proc jtds_remote @in varchar(16), @out varchar(32) output as
* begin
* select 'result set'
* set @out = 'Test ' + @in;
* return 1
* end
*
* Uncomment this test and amend the remoteserver name in the prepareCall
* statement below to be the actual name of your remote server.
*
* The TDS stream for this test will comprise a result set, a dummy return
* (0x79) value and then the actual return and output parameter (0xAC) records.
*
* This call will fail with jtds 1.1 as the dummy return value of 0 in the
* TDS stream will preempt the capture of the actual value 1. In addition the
* return value will be assigned to the output parameter and the actual output
* parameter value will be lost.
*
*
public void testRemoteCallWithResultSet() throws Exception {
CallableStatement cstmt = con.prepareCall(
"{?=call remoteserver.database.user.jtds_remote(?,?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setString(2, "data");
cstmt.registerOutParameter(3, Types.VARCHAR);
cstmt.execute();
ResultSet rs = cstmt.getResultSet();
assertNotNull(rs);
assertTrue(rs.next());
assertEquals("result set", rs.getString(1));
assertFalse(rs.next());
rs.close();
assertEquals(1, cstmt.getInt(1));
assertEquals("Test data", cstmt.getString(3));
cstmt.close();
}
*/
public static void main(String[] args) {
junit.textui.TestRunner.run(CallableStatementTest.class);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?