java 메모리 프로세스 호출 (output과return)
8866 단어 저장 프로세스 반환값
package callProcedure;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import oracle.jdbc.OracleTypes;
//
public class CallProcedure {
public static Connection con = null;
// ,
public static CallableStatement callableStatement = null;
public static ResultSet rs = null;
public static void main(String args[]) throws SQLException {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
//
callNoReturnValueProcedure();
//
callParamProcedure();
//
callOnlyOneReturnValueProcedure();
//
callReturnValuesProcedure();
System.out.println(">>>>>>>>>>>>>>>>>><<>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
//
callReturnValueFunction();
}
반환 값이 없는 저장 프로세스를 호출합니다
public static void callNoReturnValueProcedure() throws SQLException {
try {
con = getConnection();
callableStatement = con.prepareCall("{call noReturnValueProcedure}");
callableStatement.execute();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
System.out.println("callNoReturnValueProcedure() !");
}
위의 callNoReturnValueProcedure()에서 호출된 스토리지 프로세스는 다음과 같습니다.
create or replace procedure noReturnValueProcedure is -- , testProcedure()
begin
insert into cht.remarke_info
values
('001',
'001',
to_char(sysdate, 'yyyymmdd'),
to_char(sysdate, 'yyyymm'),
'cht',
' 。',
sysdate,
100);
end noReturnValueProcedure;
파라미터가 있는 저장 프로세스를 호출합니다
public static void callParamProcedure() throws SQLException {
try {
con = getConnection();
// //
// callableStatement = con.prepareCall("{call paramProcedure('bonc-cht', 2001)}");
//
callableStatement = con.prepareCall("{call paramProcedure(?, ?)}");
callableStatement.setString(1, "bonc-cht");
callableStatement.setInt(2, 3001);
callableStatement.execute();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
System.out.println("callParamProcedure() !");
}
위의 callParamProcedure()에서 호출된 저장 프로세스는 다음과 같습니다.
create or replace procedure paramProcedure(userID varchar2, ramark_info_id number) is
user_id varchar2(200); -- , ( :user_id varchar2 ), number , :v_id_no number;
begin
user_id := userID; -- , userid = userID , ::=
insert into cht.remarke_info
values
('002',
'002',
to_char(sysdate, 'yyyymmdd'),
to_char(sysdate, 'yyyymm'),
user_id, --
' 。',
sysdate,
ramark_info_id); --
end paramProcedure;
되돌아오는 값이 하나밖에 없는 저장 프로세스를 호출합니다
public static void callOnlyOneReturnValueProcedure() throws SQLException {
try {
con = getConnection();
callableStatement = con.prepareCall("{call cht.onlyOneReturnValueProcedure(?, ?)}");
callableStatement.setString(1, "fdasfdsa");
// 2
callableStatement.registerOutParameter(2, Types.INTEGER);
callableStatement.execute();
// ( )
// :callableStatement.getString(2) 2 , out ,
// out , callableStatement.getString(1),
// , callableStatement.getString(3)。
// , out 。
int label_inst_id = callableStatement.getInt(2); // :getInt(2) getInt("2")
System.out.println("callOnlyOneReturnValueProcedure() ( ):" + label_inst_id);
} catch (SQLException sqlException) {
sqlException.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
위의 callOnlyOneReturnValueProcedure () 호출된 저장 프로세스는 다음과 같습니다.
설명: 저장 프로세스는 output 매개 변수를 통해서만 결과를 되돌릴 수 있습니다. 저장 프로세스가 이 출력 매개 변수에 값을 부여했다면 되돌릴 수 있습니다. 이런 되돌림 방식은 여러 개의 값을 되돌릴 수 있고return 되돌림 값은 함수function에만 적용됩니다.
create or replace procedure onlyOneReturnValueProcedure(user_ID in varchar2, max_label_inst_id out number) is
begin
select max(t.remarke_info_id)
into max_label_inst_id --- ,
from cht.remarke_info t
where t.user_id = user_ID;
end onlyOneReturnValueProcedure;
반환 값이 있는 저장 프로세스를 호출합니다
public static void callReturnValuesProcedure() throws SQLException {
try {
con = getConnection();
callableStatement = con.prepareCall("{call getRemarke_info(?, ?)}");
callableStatement.setString(1, "cht");
//
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
callableStatement.execute();
//
rs = (ResultSet)callableStatement.getObject(2);
int i = 0;
while (rs.next()) {
System.out.println(rs.getString(1) + "\t" +
rs.getString(2) + "\t" +
rs.getString(3) + "\t" +
rs.getString(4) + "\t" +
rs.getString(5) + "\t" +
rs.getString(6) + "\t" +
rs.getString(7) + "\t" +
rs.getString(8));
i ++;
}
System.out.println(" callReturnValuesProcedure() , " + i + " !");
} catch (SQLException sqlException) {
sqlException.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
위의 callReturnValuesProcedure ()에서 호출된 패키지와 저장 프로세스 (프로세스는 결과 집합을 되돌려주고 패키지와 커서를 사용합니다) 는 다음과 같습니다.
create or replace package myPackage as ---as is
type cur is ref cursor; ---
procedure getRemarke_info(userId in varchar2, outputValue out cur); --- , ,
end myPackage;
:
create or replace procedure getRemarke_info(userId in varchar2, outputValue out myPackage.cur) is ---as is
begin
open outputValue for --- ,
select * from cht.remarke_info t where t.user_id = userId;
end getRemarke_info;
반환 값이 있는 함수를 호출합니다
public static void callReturnValueFunction() throws SQLException {
try {
con = getConnection();
callableStatement = con.prepareCall("{? = call returnValuFunction(?)}"); // , :returnValuFunction, , :returnValuFunction()
callableStatement.registerOutParameter(1, Types.VARCHAR);
callableStatement.setString(2, "cht");
callableStatement.execute();
// getString(1) ( )
String output = callableStatement.getString(1);
System.out.println("callReturnValueFunction() ! :" + output);
} catch (SQLException sqlException) {
sqlException.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
위의 callReturnValueFunction()에서 호출된 함수는 다음과 같습니다.
create or replace function returnValuFunction(param varchar2) return varchar2 is ---return varchar2(varchar, number...); , :returnValuFunction, , :returnValuFunction()
return_value varchar2(20); ---
begin
select count(*)
into return_value
from
cht.remarke_info t
where t.user_id = param;
return return_value;
end returnValuFunction;
이 파일에 사용된 테이블의 테이블 구조는 다음과 같습니다.
CREATE TABLE "CHT"."REMARKE_INFO"
( "LABEL_INST_ID" VARCHAR2(200),
"DATE_TYPE" VARCHAR2(5),
"DAY_ID" VARCHAR2(8),
"MONTH_ID" VARCHAR2(6),
"USER_ID" VARCHAR2(20),
"REMARKE_CONTENT" VARCHAR2(500),
"REMARKE_DATE" DATE,
"REMARKE_INFO_ID" NUMBER
)