本篇重點講解存儲過程輸出參數的兩類常見場景:返回整數標量值、返回字符串(含游標拼接結果)。掌握 registerOutParameter 與 getXxx 的配合使用是關鍵。
alter procedure getsum
@n int = 0,
@result int output
as
declare @sum int, @i int
set @sum = 0; set @i = 0
while @i <= @n begin
set @sum = @sum + @i
set @i = @i + 1
end
set @result = @sum
SQL 測試:declare @myResult int; exec getsum 100, @myResult output; print @myResult
import java.sql.*;
public class ProcedureTest {
public static void main(String args[]) throws Exception {
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
Connection conn = DriverManager.getConnection("jdbc:odbc:mydata", "sa", "");
CallableStatement c = conn.prepareCall("{call getsum(?,?)}");
c.setInt(1, 100); // 輸入參數
c.registerOutParameter(2, java.sql.Types.INTEGER); // 註冊輸出參數類型
c.execute(); // 執行
System.out.println(c.getInt(2)); // 獲取輸出值
conn.close();
}
}
create procedure CursorIntoProcedure
@pname varchar(8000) output
as
declare cur cursor for select orderid from orders
declare @v varchar(5)
open cur
set @pname = ''
fetch next from cur into @v
while @@fetch_status = 0 begin
set @pname = @pname + ';' + @v
fetch next from cur into @v
end
print @pname
close cur
deallocate cur
import java.sql.*;
public class ProcedureTest {
public static void main(String args[]) throws Exception {
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
Connection conn = DriverManager.getConnection("jdbc:odbc:mydata", "sa", "");
CallableStatement c = conn.prepareCall("{call CursorIntoProcedure(?)}");
c.registerOutParameter(1, java.sql.Types.VARCHAR); // 註冊 VARCHAR 輸出
c.execute();
System.out.println(c.getString(1)); // 獲取拼接字符串
conn.close();
}
}
| 步驟 | 整數輸出 | 字符串輸出 |
|---|---|---|
| 註冊方法 | registerOutParameter(idx, Types.INTEGER) | registerOutParameter(idx, Types.VARCHAR) |
| 獲取方法 | getInt(idx) | getString(idx) |
| 適用類型 | 標量數值、狀態碼、計數 | 文本、JSON、游標拼接結果 |
Types.INTEGER、Types.VARCHAR、Types.NUMERIC、Types.DATE 等需與數據庫定義一致。varchar(8000)),超長會截斷。