spring中JdbcTemplate操作oracle的存儲(chǔ)過(guò)程實(shí)例代碼
場(chǎng)景:
使用java代碼調(diào)用oracle的存儲(chǔ)過(guò)程,本例使用JdbcTemplate模板類(lèi)操作.
功能:
方便后續(xù)查閱.
1.JdbcTemplate調(diào)用存儲(chǔ)過(guò)程(Procedure)不帶返回值
1.1存儲(chǔ)過(guò)程
CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS4(TASK_ID IN NUMBER) IS
BEGIN
INSERT INTO F_LOG_INFO
(TASK_ID,
BEGIN_TIME,
END_TIME,
FLAG,
FAIL_INFO,
DATA_COUNT,
TABLE_NAME)
VALUES
(TASK_ID, SYSDATE - 1, SYSDATE, '999', '999', 999, 'TABLE_NAME2019');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END PRO_QUERY_INFO_ARGS4;1.2代碼
public static void doProcedures() {
String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}";
jdbcTemplate.execute(procedures);
}2.JdbcTemplate調(diào)用存儲(chǔ)過(guò)程(Procedure)帶返回值但值不是集合類(lèi)型
2.1存儲(chǔ)過(guò)程
CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS3(ARGS IN VARCHAR2,
RTNINFO OUT VARCHAR2,
ERRORMSG OUT VARCHAR2,
FAILINFO OUT VARCHAR2) IS
BEGIN
ERRORMSG := '';
RTNINFO := '你輸入的ARGS=' || ARGS;
SELECT FAIL_INFO INTO FAILINFO FROM F_LOG_INFO where TASK_ID = 1;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ERRORMSG := 'PRO_QUERY_INFO_ARG拋出異常: ' || SQLERRM;
END PRO_QUERY_INFO_ARGS3;2.2代碼
public static void getProceduresResult() {
String tt2 = (String) jdbcTemplate.execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(
Connection con) throws SQLException {
String procedures = "{call PRO_QUERY_INFO_ARGS3 (?,?,?,?)}";
CallableStatement cs = con.prepareCall(procedures);
/** 設(shè)置輸入?yún)?shù)的值 */
cs.setString(1, "代碼調(diào)用");
/** 注冊(cè)輸出參數(shù)的類(lèi)型-此處集合為oracle的VARCHAR2 */
cs.registerOutParameter(2, OracleTypes.VARCHAR);
cs.registerOutParameter(3, OracleTypes.VARCHAR);
cs.registerOutParameter(4, OracleTypes.VARCHAR);
return cs;
}
}, new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement st)
throws SQLException, DataAccessException {
st.execute();
/** 依次獲取存儲(chǔ)過(guò)程參數(shù)值,按照順序存儲(chǔ)過(guò)程定義參數(shù)的順序獲取 */
Object tt2 = st.getObject(2);
Object tt3 = st.getObject(3);
Object tt4 = st.getObject(4);
return tt2;
}
});
}3.JdbcTemplate調(diào)用存儲(chǔ)過(guò)程(Procedure)帶返回值且值集合類(lèi)型
3.1存儲(chǔ)過(guò)程
CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS2(ERRORMSG OUT VARCHAR2,
CURINFO OUT SYS_REFCURSOR) IS
BEGIN
ERRORMSG := '';
OPEN CURINFO FOR
SELECT FAIL_INFO, TABLE_NAME FROM F_LOG_INFO;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ERRORMSG := 'PRO_QUERY_INFO_ARG2拋出異常: ' || SQLERRM;
END PRO_QUERY_INFO_ARGS2;3.2代碼
public static List getProceduresResultList() {
List resultList = (List) jdbcTemplate.execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(
Connection conn) throws SQLException {
/** 調(diào)用指定存儲(chǔ)過(guò)程 */
String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }";
CallableStatement statement = conn
.prepareCall(procedures);
/** 注冊(cè)輸出參數(shù)的類(lèi)型-此處集合為oracle的VARCHAR2 */
statement.registerOutParameter(1, OracleTypes.VARCHAR);
/** 注冊(cè)輸出參數(shù)的類(lèi)型-此處集合為oracle的游標(biāo)類(lèi)型 */
statement.registerOutParameter(2, OracleTypes.CURSOR);
return statement;
}
}, new CallableStatementCallback() {
public Object doInCallableStatement(
CallableStatement statement) throws SQLException,
DataAccessException {
List resultsMap = new ArrayList();
statement.execute();
/** 獲取游標(biāo)結(jié)果集-此處2是存儲(chǔ)過(guò)程參數(shù)順序 */
ResultSet resultSet = (ResultSet) statement
.getObject(2);
/** 轉(zhuǎn)換每行的返回值到Map中 */
while (resultSet.next()) {
Map rowMap = new HashMap();
rowMap.put("FAIL_INFO",
resultSet.getObject("FAIL_INFO"));
rowMap.put("TABLE_NAME",
resultSet.getObject("TABLE_NAME"));
resultsMap.add(rowMap);
}
resultSet.close();
return resultsMap;
}
});
return resultList;
}4.附本例使用建表語(yǔ)句
create table F_LOG_INFO ( task_id NUMBER(16) not null, begin_time DATE, end_time DATE, flag VARCHAR2(8), fail_info VARCHAR2(512), data_count NUMBER(16), table_name VARCHAR2(256) ); alter table F_LOG_INFO add constraint PK_F_LOG_INFO primary key (TASK_ID);
5.附本例使用完整測(cè)試代碼
public class TestProcedures {
public static JdbcTemplate jdbcTemplate = getJdbcTemplate();
public static void main(String[] args) {
System.out.println("測(cè)試開(kāi)始......");
// getProceduresResult();
doProcedures();
List result = getProceduresResultList();
for (int i = 0; i < result.size(); i++) {
Map rowMap = (Map) result.get(i);
String id = rowMap.get("FAIL_INFO").toString();
String name = rowMap.get("TABLE_NAME").toString();
System.out.println("FAIL_INFO=" + id + ";TABLE_NAME=" + name);
}
System.out.println("測(cè)試結(jié)束......");
}
/**
* 執(zhí)行存儲(chǔ)過(guò)程無(wú)返回值
* */
public static void doProcedures() {
String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}";
jdbcTemplate.execute(procedures);
}
/**
* 調(diào)用存儲(chǔ)過(guò)程-返回值是非集合
* */
public static void getProceduresResult() {
String tt2 = (String) jdbcTemplate.execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(
Connection con) throws SQLException {
String procedures = "{call PRO_QUERY_INFO_ARGS3 (?,?,?,?)}";
CallableStatement cs = con.prepareCall(procedures);
/** 設(shè)置輸入?yún)?shù)的值 */
cs.setString(1, "代碼調(diào)用");
/** 注冊(cè)輸出參數(shù)的類(lèi)型-此處集合為oracle的VARCHAR2 */
cs.registerOutParameter(2, OracleTypes.VARCHAR);
cs.registerOutParameter(3, OracleTypes.VARCHAR);
cs.registerOutParameter(4, OracleTypes.VARCHAR);
return cs;
}
}, new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement st)
throws SQLException, DataAccessException {
st.execute();
/** 依次獲取存儲(chǔ)過(guò)程參數(shù)值,按照順序存儲(chǔ)過(guò)程定義參數(shù)的順序獲取 */
Object tt2 = st.getObject(2);
Object tt3 = st.getObject(3);
Object tt4 = st.getObject(4);
return tt2;
}
});
}
/**
* 調(diào)用存儲(chǔ)過(guò)程-返回值是List集合
* */
public static List getProceduresResultList() {
List resultList = (List) jdbcTemplate.execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(
Connection conn) throws SQLException {
/** 調(diào)用指定存儲(chǔ)過(guò)程 */
String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }";
CallableStatement statement = conn
.prepareCall(procedures);
/** 注冊(cè)輸出參數(shù)的類(lèi)型-此處集合為oracle的VARCHAR2 */
statement.registerOutParameter(1, OracleTypes.VARCHAR);
/** 注冊(cè)輸出參數(shù)的類(lèi)型-此處集合為oracle的游標(biāo)類(lèi)型 */
statement.registerOutParameter(2, OracleTypes.CURSOR);
return statement;
}
}, new CallableStatementCallback() {
public Object doInCallableStatement(
CallableStatement statement) throws SQLException,
DataAccessException {
List resultsMap = new ArrayList();
statement.execute();
/** 獲取游標(biāo)結(jié)果集-此處2是存儲(chǔ)過(guò)程參數(shù)順序 */
ResultSet resultSet = (ResultSet) statement
.getObject(2);
/** 轉(zhuǎn)換每行的返回值到Map中 */
while (resultSet.next()) {
Map rowMap = new HashMap();
rowMap.put("FAIL_INFO",
resultSet.getObject("FAIL_INFO"));
rowMap.put("TABLE_NAME",
resultSet.getObject("TABLE_NAME"));
resultsMap.add(rowMap);
}
resultSet.close();
return resultsMap;
}
});
return resultList;
}
/** 獲取JdbcTemplate數(shù)據(jù)源 */
public static JdbcTemplate getJdbcTemplate() {
DruidDataSource dataSource = new DruidDataSource();
/**數(shù)據(jù)庫(kù)連接信息*/
String username = "demodb";
String password = "123456";
String jdbcUrl = "jdbc:oracle:thin:@127.0.0.1:1521/orcl";
String driverName = "oracle.jdbc.OracleDriver";
/** 設(shè)置數(shù)據(jù)源屬性參數(shù) */
dataSource.setPassword(password);
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(username);
dataSource.setDriverClassName(driverName);
/** 獲取spring的JdbcTemplate*/
JdbcTemplate jdbcTemplate = new JdbcTemplate();
/** 設(shè)置數(shù)據(jù)源 */
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
}以上,感謝.
總結(jié)
到此這篇關(guān)于spring中JdbcTemplate操作oracle的存儲(chǔ)過(guò)程的文章就介紹到這了,更多相關(guān)JdbcTemplate操作oracle存儲(chǔ)過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基本教程之synchronized關(guān)鍵字 java多線(xiàn)程教程
這篇文章主要介紹了java的synchronized原理、synchronized基本規(guī)則、synchronized方法 和 synchronized代碼塊、實(shí)例鎖和全局鎖2014-01-01
java 對(duì)數(shù)和指數(shù)計(jì)算方式
這篇文章主要介紹了java 對(duì)數(shù)和指數(shù)計(jì)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SWT(JFace)體驗(yàn)之StyledText類(lèi)
有的時(shí)候Text需要實(shí)現(xiàn)這種那種的樣式。先提供在不使用StyledText類(lèi)的情況:2009-06-06
Java反射機(jī)制的學(xué)習(xí)總結(jié)
總的來(lái)說(shuō),java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來(lái)寫(xiě)操做數(shù)據(jù)庫(kù)的代碼了,而是方法更多的時(shí)間在項(xiàng)目的邏輯功能上,這個(gè)可以很大的減少開(kāi)發(fā)時(shí)間,而且代碼的可讀性好2013-09-09
總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系
Jupiter和Junit5之間有什么聯(lián)系?Jupiter提供了哪些新的測(cè)試方法?如何用IDEA和Jupiter生成可讀性更好的測(cè)試報(bào)告?文中有非常詳細(xì)的說(shuō)明,需要的朋友可以參考下2021-06-06
SpringBoot快速入門(mén)及起步依賴(lài)解析(實(shí)例詳解)
SpringBoot?是由?Pivotal?團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化?Spring?應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,這篇文章主要介紹了SpringBoot快速入門(mén)及起步依賴(lài)解析,需要的朋友可以參考下2022-10-10
java遞歸處理單位人員組織機(jī)構(gòu)樹(shù)方式
這篇文章主要介紹了java遞歸處理單位人員組織機(jī)構(gòu)樹(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Jmeter post上傳文件實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Jmeter post上傳文件實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

