2013년 8월 5일 월요일

[Oracle] 자바에서 오라클 stored procedure 호출해서 배열을 변수로 입력



public HashMap callSP (HttpServletRequest req) throws Exception, SQLException {  
Connection con = null;  
PreparedStatement pstmt = null;  
OracleCallableStatement ps = null;  
ResultSet rs = null;  
HashMap hm = new HashMap();                      /*  변수로 던질 배열 생성
                          1차 배열
                     */
String aSingleArray[] = new String[10]; try { con = DBHandler.getConnection();
String RtnCode = ""; String RtnMsg = ""; String RtnCapno = ""; /* 값을 배열에 넣는다. */aSingleArray[0] = req.getParameter("order_no") == null ? "" : req.getParameter("order_no");aSingleArray[1] = req.getParameter("rtncan_dt") == null ? "" : req.getParameter("rtncan_dt");aSingleArray[2] = req.getParameter("ssLoginId") == null ? "" : req.getParameter("ssLoginId"); con.setAutoCommit(false); // 1차 배열의 경우ArrayDescriptor array_desc = ArrayDescriptor.createDescriptor("VARCHAR_ARRAY", con);ARRAY s_array = new ARRAY(array_desc, con, aSingleArray);
ps = (OracleCallableStatement) con.prepareCall({ call PKG_NAME.PROC_NAME(?,?,?)});ps.setArray(1, s_array);ps.registerOutParameter(2, java.sql.Types.VARCHAR); // codeps.registerOutParameter(3, java.sql.Types.VARCHAR); // msg   ps.execute();    // 실행



/* 다차원 배열일 경우 */ 
/* 선언 */        String[][] addArray = new String [bl_no.length][19];
/* 입력 */addArray[i][0] = bl_no[idx] == null ? "" : bl_no[idx];addArray[i][1] = vOrderNo == null ? "" : vOrderNo;addArray[i][2] = acct_cd[idx] == null ? "" : acct_cd[idx];
/* 준비 & 실행 */ArrayDescriptor descriptor =          ArrayDescriptor.createDescriptor( "MULDIM_ARR", con );
ARRAY array_to_pass =  new ARRAY( descriptor, con, addArray );
ps =           (OracleCallableStatement)con.prepareCall           ( " begin PKG_NAME.PROC_BEGIN(?,?,?,?); end;" );
ps.setString(1, ssLoginId);ps.setArray(2, array_to_pass);ps.registerOutParameter(3, java.sql.Types.VARCHAR );ps.registerOutParameter(4, java.sql.Types.VARCHAR );     ps.execute();


[Oracle] stored procedure 안에서 배열 형태로 파라미터 주고 받기


오라클 stored procedure 안에서 다른 SP를 호출하는 경우임


 PROCEDURE PROC_NAME1 (
  aSingleArray  IN   VARCHAR_ARRAY,
  oRtnCode      OUT  VARCHAR2,
  oRtnMsg       OUT  VARCHAR2
  ) AS
/* 배열을 선언한다 */
aINFArry      VARCHAR_ARRAY   := VARCHAR_ARRAY();
BEGIN

/* 배열의 크기를 선언하고 해당 수 만큼 변수를 넣는다 */
            aINFArry.EXTEND(2);
            aINFArry(1)  := 'VALUE1';
            aINFArry(2)  := 'VALUE2' ;    

/* 다른 프로시저를 호출하고 선언한 배열을 넣는다. */
   PROC_NAME2(aINFArry);
END PROC_NAME1 

2013년 7월 11일 목요일

[Oracle] Row 단위 락 확인 함수

create or replace FUNCTION FUNC_IS_ROW_LOCKED (v_rowid ROWID, table_name VARCHAR2)
   RETURN varchar2
IS
   x   NUMBER;
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   EXECUTE IMMEDIATE    'Begin
                           Select 1 into :x from '
                              || table_name
                              || ' where rowid =:v_rowid for update nowait;
                         Exception
                            When Others Then
                              :x:=null;
                         End;'
   USING OUT x, v_rowid;
   -- now release the lock if we got it.
   ROLLBACK;
   IF x = 1
   THEN
      RETURN 'N';
   ELSIF x IS NULL
   THEN
      RETURN 'Y';
   END IF;
END;

그리고 아래 쿼리로 결과 확인
select FUNC_IS_ROW_LOCKED (vrowid, vtablename) from dual;

출처
http://stackoverflow.com/questions/5172911/showing-rows-that-are-locked-in-oracle

2013년 6월 26일 수요일

Sql Developer 설치 에러

SQL Developer 를 JRE 포함 버전으로 설치하게 되면 다음과 같은 문제를 자주 겪게 된다.
1. msvcr71.dll 를 찾을 수 없다고 에러 나면서 실행이 안되는 경우
해결방법 >>> 다른 컴퓨터에서 DriveName:\windows\system32 밑에서 해당 파일을 카피해서 같은 위치에 복사해 넣는다.
원인 >>> 특별한 원인이 있나 이 사람아 저 파일이 없어서 그렇지. ㅎㅎ
2. 시작 후 연결설정 시 로케일을 찾을 수 없다는 에러
해결방법 >>> 자바환경변수 설정에 아래를 추가한다.
JAVA_TOOL_OPTIONS : -Dfile.encoding=UTF8 -Duser.language=en -Duser.region=US -Duser.country=US

원인 >>> 자바를 설치 안해서 그렇다. 자바를 설치 하면 보통 패스 설정과 로케일 설정이 되는데 sql developer를 JRE 포함버전으로 설치해서 그렇다.(빼먹지 말자)