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;
오라클 프로시저에서 조건문에 문자 NULL 체크하기 - MSSql과 비교 (0) | 2010.12.24 |
---|---|
MSSQL 링크드서버사용법 (0) | 2010.11.19 |
오라클 각종함수사용법 (0) | 2010.11.17 |
오라클에서 c# 닷넷 파라미터 값 받어서 처리하기 (0) | 2010.11.13 |
MSSQL 과 ORACLE 프로시저 사용비교 (0) | 2010.11.12 |
댓글 영역