Oracle 存储过程定义格式如下:
sql 代码
- CREATE OR REPLACE PROCEDURE PRO_YOUR_PROCEDURE (
- ELEMENT_01 IN ELEMENT_TYPE, --COMMENTS
- ....... .... ..... ....
- ELEMENT_0S OUT ELEMENT_TYPE, --COMMENTS
- .... ... ... ....
- )
- AS
- ARGUMENT_01 ARGUMENT_TYPE(ARGUMENT_RANGE);
- ...................
- BEGIN
- --AND YOUR CODE HERE !
- END;
- EXCEPTION
- WHEN
- OTHERS
- THEN
- RAISE_APPLICATION_ERROR(-20003,[YOUR EXCEPITON MESSAGE HERE !]);
- END;
- COMMIT;--IF YOUR WANT , JUST DO SO !
- END PRO_YOUR_PROCEDURE;
其中,[
RAISE_APPLICATION_ERROR(-20003,[YOUR EXCEPITON MESSAGE HERE !]);]中的
“-20003”是 Oracle 提供的用于用户进行错误自定义的扩充代码。其值可以随便定义,
但是也有范围: -20000 到-20999的负整数。
注意到,在存储过程的参数定义中除了IN外,还有个OUT,IN类型的参数是很好理解的,其目的是为了让存储过程接收参数。那么OUT也就不难理解,他的职责就是提供存储过程执行过后的返回值并将其返回给调用者供其使用。
要用Java调用存储过程必须引用“import oracle.jdbc.OracleCallableStatement;”类。
Java调用存储过程的基本格式如下所示:
java 代码
- public RETURN_TYPE METHOD_NAME(ARGUMENTS,...)throws EXCEPTIONS...{
- conn=...;//建立数据库连接
- conn.setAutoCommit(false);//
- OracleCallableStatement cal = null;
- try{
- cal = (OracleCallableStatement) conn.getMetaData().getConnection().prepareCall("call PRO_YOURS(?,...)");
- //如果你的数据是一堆记录集那么你可能会用下面的方式
- for(int i=0;i<...;i++){
- cal.setString(1,arguments);
- … … … … … … … … … …
- cal.registerOutParameter(n,Types.VARCHAR);
- String messages=( (OracleCallableStatement) cal).getString(n);
- }
- }catch(Exception e){
- try {
- conn.rollback();
- }catch(SQLException ex){}
- }catch(...){...............}finally{
- … … … … … …
- … … … … … …
- }
- }
其中,
conn.getMetaData().getConnection().prepareCall("call PRO_YOURS(?,...)");是存储过程的Java调用声明。
cal.setString(1,arguments);是往存储过程中传入参数
(OracleCallableStatement) cal).getString(n)是从存储过程中得到执行后的返回值,但是,在此之前,你必须使用
cal.registerOutParameter(n,Types.VARCHAR);进行声明