java 호출oracle 저장 프로세스 요약

1. 저장 프로세스란 무엇인가.저장 프로세스는 데이터베이스 서버 측의 프로그램으로 두 가지 유형이 있다.SELECT 조회와 유사한 것으로 데이터를 검색하는데 사용되며 검색된 데이터는 데이터 집합의 형식으로 고객에게 되돌아갈 수 있다.INSERT 또는 DELETE 쿼리와 유사한 또 다른 질의는 데이터를 반환하지 않고 하나의 작업만 수행합니다.어떤 서버는 같은 저장 프로세스가 데이터를 되돌려주고 동작을 수행할 수 있도록 허용한다.2. 저장 프로세스가 언제 필요한지 서버가 저장 프로세스를 정의하면 필요에 따라 저장 프로세스를 사용할지 결정해야 한다.저장 프로세스는 통상적으로 자주 실행해야 하는 임무로, 이런 임무는 왕왕 대량의 기록에 맞추어 진행된다.서버에서 저장 프로세스를 실행하면 응용 프로그램의 성능을 개선할 수 있다.왜냐하면:서버는 왕왕 강력한 계산 능력과 속도를 가지고 있다.대량의 데이터를 클라이언트에 다운로드하는 것을 피하고 네트워크의 전송량을 줄이다.예를 들어 하나의 응용 프로그램이 하나의 데이터를 계산해야 한다고 가정하면 이 데이터는 많은 기록과 관련된다.저장 프로세스를 사용하지 않으면 이 데이터를 클라이언트에 다운로드해 인터넷의 데이터가 급증한다.뿐만 아니라 클라이언트는 오래된 컴퓨터일 수도 있고 연산 속도가 매우 느리다.저장 프로세스를 바꾸면 서버는 데이터를 신속하게 계산하고 클라이언트에게 하나의 데이터만 전달하면 효율이 매우 뚜렷하다.3. 저장 프로세스의 매개 변수는 서버의 저장 프로세스를 실행하려면 종종 매개 변수를 전달해야 한다.이러한 매개 변수는 네 가지 유형으로 나뉘는데 첫 번째는 입력 매개 변수라고 하는데 클라이언트 프로그램이 저장 프로세스에 값을 전달한다.두 번째는 출력 매개 변수라고 하는데 저장 프로세스가 클라이언트 프로그램에 결과를 되돌려준다.세 번째는 입력/출력 매개 변수라고 하는데 클라이언트 프로그램에서 저장 프로세스에 값을 전달할 수도 있고 저장 프로세스에서 클라이언트 프로그램에 결과를 되돌릴 수도 있다.네 번째는 상태 매개 변수라고 하는데 저장 프로세스가 클라이언트 프로그램에 오류 정보를 되돌려준다.설명하자면, 모든 서버가 상기 네 가지 유형의 매개 변수를 지원하는 것은 아니다. 예를 들어 InterBase는 상태 매개 변수를 지원하지 않는다.4.oracle 저장 프로세스의 기본 문법 1.기본 구조
CREATE OR REPLACEPROCEDURE       

(

      1 IN NUMBER,

      2 IN NUMBER

) IS

  1 INTEGER :=0;

  2 DATE;

BEGIN 

END       

2. SELECT INTO STATEMENT는 select 조회의 결과를 변수에 저장합니다. 여러 열을 여러 변수에 동시에 저장할 수 있습니다. 기록이 있어야 합니다. 그렇지 않으면 예외를 던집니다. (기록이 없으면 NO DATA FOUND를 던진다) 예:
BEGIN

  SELECT col1,col2 into   1,  2 FROM typestruct where xxx;

  EXCEPTION

  WHEN NO_DATA_FOUND THEN

      xxxx;

  END;

1: 반환 값이 없는 저장 프로세스 저장 프로세스는 다음과 같습니다.
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS

BEGIN 

  INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);

END TESTA;

그리고 자바에서 호출할 때 다음 코드를 사용합니다.
package com.hyq.src;



import java.sql.*;

import java.sql.ResultSet;



public class TestProcedureOne {

public TestProcedureOne() {

}

public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    CallableStatement cstmt = null;



    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");

      CallableStatement proc = null;

      proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");

      proc.setString(1, "100");

      proc.setString(2, "TestOne");

      proc.execute();

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

}

}

당연하죠. 먼저 테이블 TESTTB, 안에 두 개의 필드 (I ID, I NAME) 를 만들어야 합니다.2. 반환 값이 있는 저장 프로세스(비목록)는 다음과 같다.
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS

BEGIN 

  SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1; 

END TESTB;

자바에서 호출할 때 다음 코드를 사용합니다.
package com.hyq.src;



public class TestProcedureTWO {

public TestProcedureTWO() {

}

public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;

    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");

      CallableStatement proc = null;

      proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");

      proc.setString(1, "100");

      proc.registerOutParameter(2, Types.VARCHAR);

      proc.execute();

      String testPrint = proc.getString(2);

      System.out.println("=testPrint=is="+testPrint);

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

}

}



}

주의, 여기 프로c.get String (2) 의 수치 2는 임의가 아니라 저장 과정 중의 out열과 대응합니다. 만약 out이 첫 번째 위치에 있다면 proc입니다.getString(1), 세 번째 위치라면 proc.getString(3), 물론 여러 개의 반환 값도 동시에 있을 수 있습니다. 그것은 바로 아웃 파라미터를 몇 개 더 추가하는 것입니다.3. 반환 목록은oracle 저장 프로세스에 반환 값이 없기 때문에 모든 반환 값은out 매개 변수를 통해 대체됩니다. 목록 역시 예외가 아니지만 집합이기 때문에 일반적인 매개 변수를 사용할 수 없습니다.pagkage를 사용해야 합니다.그래서 두 부분으로 나뉘어야 한다. 하나, 프로그램 패키지를 만들어야 한다.다음과 같습니다.
CREATE OR REPLACE PACKAGE TESTPACKAGE  AS

TYPE Test_CURSOR IS REF CURSOR;

end TESTPACKAGE;

2, 저장 프로세스를 설정합니다. 저장 프로세스는 다음과 같습니다.
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS 

BEGIN

    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;

END TESTC;

이것은 커서 (바늘로 이해할 수 있음) 를 out 매개 변수로 값을 되돌려 주는 것을 볼 수 있다.자바에서 호출할 때 다음 코드를 사용합니다.
package com.hyq.src;

import java.sql.*;

import java.io.OutputStream;

import java.io.Writer;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import oracle.jdbc.driver.*;





public class TestProcedureTHREE {

public TestProcedureTHREE() {

}

public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;



    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, "hyq", "hyq");



      CallableStatement proc = null;

      proc = conn.prepareCall("{ call hyq.testc(?) }");

      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

      proc.execute();

      rs = (ResultSet)proc.getObject(1);



      while(rs.next())

      {

          System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");

      }

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

}

}

이 곳에서 실행하기 전에oracle의 드라이브 패키지를class 경로에 넣어야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다.

좋은 웹페이지 즐겨찾기