spring呼叫帶引數的oracle函式應注意的問題
spring可以方便的訪問oracle的儲存過程、函式。
spring文件舉了一個訪問sysdate的例子,它不需要輸入引數,使用如下:
public class TestStoredProcedure {
public static void main(String[] args) {
TestStoredProcedure t = new TestStoredProcedure();
t.test();
System.out.println("Done!");
}
void test() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("oracle.jdbc.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:mydb");
ds.setUsername("scott");
ds.setPassword("tiger");
MyStoredProcedure sproc = new MyStoredProcedure(ds);
Map results = sproc.execute();
printMap(results);
}
private class MyStoredProcedure extends StoredProcedure {
private static final String SQL = "sysdate";
public MyStoredProcedure(DataSource ds) {
setDataSource(ds);
setFunction(true);
setSql(SQL);
declareParameter(new SqlOutParameter("date", Types.DATE));
compile();
}
public Map execute() {
// the 'sysdate' sproc has no input parameters, so an empty Map is supplied...
return execute(new HashMap());
}
}
private static void printMap(Map results) {
for (Iterator it = results.entrySet().iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
}
但是如果訪問帶輸入引數的function怎麼辦?很簡單,只是要注意,輸出引數的宣告一定要放在輸入引數宣告的前面。否則,返回值永為null
如下:
public class TestStoredProcedure {
public static void main(String[] args) {
TestStoredProcedure t = new TestStoredProcedure();
t.test();
System.out.println("Done!");
}
void test() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("oracle.jdbc.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:mydb");
ds.setUsername("scott");
ds.setPassword("tiger");
MyStoredProcedure sproc = new MyStoredProcedure(ds);
Map results = sproc.execute();
printMap(results);
}
private class MyStoredProcedure extends StoredProcedure {
private static final String SQL = "youfunc";
public MyStoredProcedure(DataSource ds) {
setDataSource(ds);
setFunction(true);
setSql(SQL);
//一定要注意順序,將OUt放在前面,否則,你的返回值永遠為null
declareParameter(new SqlOutParameter("myrt", Types.varchar));
declareParameter(new SqlParameter("pIN", Types.varchar)); compile();
}
public Map execute() {
// the 'sysdate' sproc has no input parameters, so an empty Map is supplied...
Map m=new HashMap();
m.put("PIn","test");
return execute(new HashMap());
}
}
private static void printMap(Map results) {
for (Iterator it = results.entrySet().iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15247/viewspace-1007043/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式呼叫引數變數傳值的問題函式變數
- Oracle帶引數的自定義函式Oracle函式
- 函式的呼叫方式和引數函式
- 空函式有參函式呼叫引數的注意事項Swift 1.1語言函式Swift
- 封裝帶引數的函式封裝函式
- 函式呼叫棧的問題函式
- js Date()建構函式引數需要注意一個問題JS函式
- 函式呼叫的引數規則與解包函式
- 【函式引數】Oracle 11g中使用“=>”顯式指明函式引數名與引數值的對應關係函式Oracle
- java函式陣列引數的複製問題Java函式陣列
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- C#的Replace函式,使用函式作為的引數需要注意C#函式
- Excel函式應用教程:函式的引數(轉)Excel函式
- 函式定義、函式的引數、函式的預設引數函式
- 使用ctypes呼叫系統C API函式需要注意的問題,函式引數中有指標或結構體的情況下最好不要修改argtypesAPI函式指標結構體
- js中 函式引數的 傳值/傳引用 問題JS函式
- python 函式引數的傳遞(引數帶星號的說明)Python函式
- Swift 呼叫 Objective-C 的可變引數函式SwiftObject函式
- ASP中函式呼叫對引數的影響 (轉)函式
- 同名函式的 帶 params 引數 與 不帶 params 引數的執行優先順序函式
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- 注意力機制下的啟用函式:自適應引數化ReLU函式
- EXTJS 建構函式帶引數JS函式
- python不定長引數如何呼叫函式?Python函式
- 函式訪問引數受限的處理方法函式
- setTimeout()呼叫的函式傳遞引數簡單介紹函式
- Oracle Extent引數問題Oracle
- 父類與子類之間靜態函式的呼叫以及函式引數的傳遞函式
- sql server datediff函式引發的效能問題SQLServer函式
- scala 呼叫 java 方法引數匹配問題Java
- static函式塊中如何呼叫外部xml引數?函式XML
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- 函式的引數傳遞函式
- 函式引數的 Default value函式
- 程式中的函式引數函式
- Python中將函式作為另一個函式的引數傳入並呼叫Python函式
- javascript關於Array()建構函式引數注意點JavaScript函式
- 函式引數 引數定義函式型別函式型別