數(shù)據(jù)采用oracle數(shù)據(jù)庫scott/tiger示范賬戶下的emp(員工)表和dept(部門)表:
create table DEPT
(
DEPTNO NUMBER(2) not null primary key,
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
)
create table EMP
(
EMPNO NUMBER(4) not null primary key,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2),
constraint FK_DEPTNO foreign key (DEPTNO)references DEPT (DEPTNO)
)
Oracle存儲(chǔ)過程代碼:
Create or replace PROCEDURE searchEmpByDept(
indeptno IN NUMBER,
empcur OUT sys_refcursor,
errorMsg OUT varchar)
IS
BEGIN
errorMsg:='';
OPEN empcur FOR
SELECT *
FROM emp
WHERE deptno = indeptno
ORDER BY empno;
EXCEPTION
WHEN OTHERS THEN
errorMsg:= sqlerrm;-- sqlcode是異常編號(hào),sqlerrm是異常的詳細(xì)信息
END searchEmpByDept;
使用 pl/sql 過程語句測試上面的存儲(chǔ)過程:
declare
errorMsg varchar(1000);
empcur sys_refcursor;
emp scott.emp%rowtype;
begin
searchEmpByDept(10,empcur, errorMsg);
if errorMsg is not null then
dbms_output.put_line(errorMsg);
end if;
loop
fetch empcur into emp;
EXIT WHEN empcur%notfound ;
dbms_output.put_line(emp.ename);
end loop;
close empcur;
end;
Java調(diào)用代碼:
public class DBHelper {
private Connection conn = null;
public Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.1.6:1521:ntcsoft",
"scott",
"tiger");
return conn;
}
}
public class CallOracleProcedure {
public static void main(String args[]) {
ResultSet rs = null;
CallableStatement st = null;
Connection con = null;
try {
con = new DBHelper().getConnection();
String sql = "call searchEmpByDept(?,?,?)";
st = con.prepareCall(sql);
st.setInt(1, 20);//設(shè)置入?yún)⒉块T編號(hào)20
//注冊返回類型參數(shù)。CURSOR類型在java.sql.Tyes中沒有定義,在驅(qū)動(dòng)程序包中找到了
st.registerOutParameter(2, oracle.jdbc.driver.OracleTypes.CURSOR);
st.registerOutParameter(3, Types.VARCHAR);
boolean result = st.execute();
//獲取返回參數(shù)
rs = (ResultSet) st.getObject(2);
String msg = st.getString(3);
if(msg != null)
System.out.println(msg);//異常信息部為null則打印
System.out.println("empno" + ""t" + "ename" + ""t" + "sal" + ""t"+ "deptno");
//輸出查詢結(jié)果
StringBuilder output = new StringBuilder();
while (rs.next()) {
output.append(rs.getInt("empno"))
.append(""t")
.append(rs.getString("ename"))
.append(""t")
.append(rs.getDouble("sal"))
.append(""t")
.append(rs.getInt("deptno"));
System.out.println(output.toString());
output.delete(0, output.length());
}
output = null;
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(rs!=null) rs.close();
if(st!=null) st.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
注意,oracle數(shù)據(jù)庫的scott示范賬戶默認(rèn)是被鎖定的,在使用之前需要解鎖:
alter user scott account unlock;
然后以scott/tiger 登陸數(shù)據(jù)庫服務(wù)器,會(huì)提示密碼已過期,并要求你立即輸入新密碼。
學(xué)軟件開發(fā),到蜂鳥科技!
地址:鄭州市文化路豐產(chǎn)路口東50米豐產(chǎn)路21號(hào)SOHO世紀(jì)城西塔20樓F
電話:0371-63839606 手機(jī):13838505572(申老師) 13673990036 (許老師)
QQ: 1073422643 1群:47614738 2群:108157678 鄭州軟件開發(fā)興趣小組群:38236716
網(wǎng)址:www.ntcsoft.com