상세 컨텐츠

본문 제목

오라클 프로시저 실행결과를 C#으로 출력하기 위해서는

데이터베이스

by 김일국 2010. 11. 18. 22:31

본문

1. SELECT의 결과 집합이 1 ROW인 경우

SELECT ... INTO 문으로 내부 변수에 값을 할당한 다음 Procedure 밖으로 전달해 주려면 Output 변수가 필요합니다.

INTO절에 있는 v_ 변수들을 Output 변수로 선언하시고 테스트 해보세요.

 

2. SELECT의 결과 집합이 MULTI ROW인 경우

REF Cursor 타입을 가진 Package를 만드셔야 합니다.

 

사용예1 - 프로시저단

CREATE OR REPLACE PROCEDURE SP_AUTH_SELECT(
  p_USER_NO IN VARCHAR2,
  p_MENU_ID IN VARCHAR2,
  p_SUB_MENU_ID IN VARCHAR2,
  v_OUT OUT NUMBER)
IS
--v_OUT NUMBER;
V_CNT NUMBER := 0;
V_MENU_URL VARCHAR(50);
V_SUB_MENU_URL VARCHAR(50);
/******************************************************************************
   NAME:       SP_AUTH_SELECT
   PURPOSE:    화면번호 구하기

   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2010-11-13          1. Created this procedure.

   NOTES:

   Automatically available Auto Replace Keywords:
      Object Name:     SP_AUTH_SELECT
      Sysdate:         2010-11-13
      Date and Time:   2010-11-13, 오전 12:05:19, and 2010-11-13 오전 12:05:19
      Username:         (김일국)
      Table Name:       ()
   exec SP_AUTH_SELECT('0000000001', 'CM010M', 'CM011M', :A, :B, :C);
******************************************************************************/
BEGIN
 IF SUBSTR(p_MENU_ID, LENGTH(p_MENU_ID),1)  = 'P' THEN
   SELECT -1 INTO v_OUT FROM DUAL;
   RETURN;
   END IF;
 
 SELECT NVL(COUNT(*),0) INTO V_CNT FROM T_MENU WHERE MENU_ID = p_MENU_ID AND AUTH_YN = 'Y';
 
 IF V_CNT = 0 THEN
   SELECT -1 INTO v_OUT FROM DUAL;
   RETURN;
   END IF;
   
 SELECT NVL(p_MENU_ID, ''), NVL(p_SUB_MENU_ID, '') INTO V_MENU_URL , V_SUB_MENU_URL FROM DUAL;

 BEGIN
 SELECT MENU_URL INTO V_SUB_MENU_URL
 FROM T_MENU
 WHERE MENU_ID = p_SUB_MENU_ID;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
  V_SUB_MENU_URL := '';
 END;

 BEGIN
 SELECT MENU_URL INTO V_MENU_URL
 FROM T_MENU
 WHERE MENU_ID = p_MENU_ID;
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
  V_MENU_URL := '';
 END;
 
 IF V_MENU_URL <> V_SUB_MENU_URL THEN
  SELECT 0 INTO v_OUT FROM DUAL;
  RETURN;
 END IF;

 SELECT COUNT(*) INTO v_OUT
 FROM T_USERMENU
 WHERE USER_NO = p_USER_NO
   AND MENU_ID = p_SUB_MENU_ID;

 SELECT (v_OUT + COUNT(*)) INTO v_OUT
 FROM T_GROUPMENU
 WHERE AUTH_ID IN (
      SELECT AUTH_ID
      FROM T_USERGROUP
      WHERE USER_NO = p_USER_NO
      )
   AND MENU_ID = p_SUB_MENU_ID;

 SELECT (v_OUT + COUNT(*)) INTO v_OUT
 FROM T_USERTYPE_MENU A
   INNER JOIN T_USER B
    ON A.TYPE_CD = B.TYPE_CD
 WHERE B.USER_NO = p_USER_NO
   AND A.MENU_ID = p_SUB_MENU_ID;

 --dbms_output.put_line(v_OUT);
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
  --NULL;
  dbms_output.put_line('값이 없습니다.');
 WHEN OTHERS THEN
  RAISE;
END SP_AUTH_SELECT;
/

사용예2 - c#단

string spName = "SP_AUTH_SELECT"; // 조회용 저장프로시저명
            OracleConnection oConn = new OracleConnection(OracleHelper.OraconString("PORTALCOMMONConn"));
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = oConn;
            cmd.CommandText = spName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("v_OUT", OracleType.Number).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("p_USER_NO", OracleType.VarChar).Direction = ParameterDirection.Input;
            cmd.Parameters.Add("p_MENU_ID", OracleType.VarChar).Direction = ParameterDirection.Input;
            cmd.Parameters.Add("p_SUB_MENU_ID", OracleType.VarChar).Direction = ParameterDirection.Input;
            cmd.Parameters["p_USER_NO"].Value = row["USER_NO_SEARCH"];
            cmd.Parameters["p_MENU_ID"].Value = row["MENU_ID_SEARCH"];
            cmd.Parameters["p_SUB_MENU_ID"].Value = row["SUB_MENU_ID_SEARCH"];
            oConn.Open();
            cmd.ExecuteOracleScalar();
            int ret_val = (int)(OracleNumber)cmd.Parameters[0].Value.ToString();
            oConn.Close();
            cmd.Dispose();
            return ret_val;

관련글 더보기

댓글 영역