database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 14870 게시물 읽기
No. 14870
Re: [질문] 오라클 스토어드 프로시저
작성자
신충수
작성일
2003-07-08 20:44
조회수
3,955

답변 감사드립니다.

 

그런데 답변을 읽기전에 해결책을 알아버렸답니다. 자문자답인 셈인데

 

저처럼 Database나 SQL쪽에 경험이 없어서 고생하실 분들을 위해 간략하

 

게나마 설명을 좀 드릴려고 합니다.

 

거의 2주가까이 해결을 못하다가 겨우 해결했는데, 오라클 사이트랑 기타 웹

 

사이트를 싹 뒤져서 나온 결과를 종합해보면 레코드셋을 리턴하는 스토어드

 

프로시저를 만들려면 우선 패키지.스토어드 프로시저 와 같이 만들고

 

레퍼런스 커서를 선언해서 커서를 이용해서 레코드셋에 접근을 해야되는군

 

요.

 

 

예를 들자면

 

create or replace package Employee as

type NUMARRAY is table of NUMBER index by BINARY_INTEGER; --Define EMPNOS array

type VCHAR2ARRAY is table of VARCHAR2(10) index by BINARY_INTEGER; --Define ENAMES array

cursor c1 is select * from emp;

type empCur is ref cursor return c1%rowtype;

 

procedure GetEmpData(indeptno IN NUMBER,EmpCursor in out empCur );

PROCEDURE GetEmpNamesInArray (ArraySize IN INTEGER, inEmpnos IN NUMARRAY, outEmpNames OUT VCHAR2ARRAY);

PROCEDURE GetEmpName (inEmpno IN NUMBER, outEmpName OUT VARCHAR2);

FUNCTION GetEmpSal (inEmpno IN NUMBER) RETURN NUMBER;

 

end Employee;

/

 

와 같이 패키지를 선언하구요...

 

 

create or replace package body Employee as

PROCEDURE GetEmpNamesInArray (ArraySize IN INTEGER, inEmpnos IN NUMARRAY,

outEmpNames OUT VCHAR2ARRAY) is --ArrIndex INTEGER;

BEGIN

FOR I in 1..ArraySize loop

SELECT ENAME into outEmpNames(I) from EMP WHERE EMPNO = inEmpNos(I);

END LOOP;

END;

 

PROCEDURE GetEmpName (inEmpno IN NUMBER, outEmpName OUT VARCHAR2) is

BEGIN

SELECT ENAME into outEmpName from EMP WHERE EMPNO = inEmpNo;

END;

 

FUNCTION GetEmpSal (inEmpno IN NUMBER)

RETURN NUMBER is

outEmpsal NUMBER(7,2);

BEGIN

SELECT SAL into outEmpsal from EMP WHERE EMPNO = inEmpno;

RETURN (outEmpsal);

END;

 

procedure GetEmpData(indeptno IN NUMBER,EmpCursor in out empcur)

is

begin

open EmpCursor for

select * from emp where deptno= indeptno;

 

end GetEmpData;

end Employee;

/

 

와 같이 패키지 바디를 선언합니다.

 

 

 

그리고 VC에서 접근할때 OO4O를 이용했는데요...다음과 같습니다.

 

ODatabase odb("test", "scott", "tiger");

 

OParameterCollection params = odb.GetParameters();

 

// add a parameter named 'DEPTNO'

params.Add("DEPTNO", 20, OPARAMETER_INVAR, OTYPE_NUMBER);

 

// add a parameter named 'EMPCURSOR'

params.Add("EMPCURSOR", "", OPARAMETER_OUTVAR, OTYPE_CURSOR);

 

//Execute the SQL statement

odb.ExecuteSQL("BEGIN Employee.GetEmpData (:DEPTNO, :EMPCURSOR); END;");

 

//retrieve the EMPCUSRSOR oparameter class

OParameter EmpcurParam = params.GetParameter("EMPCURSOR") ;

 

//retrieve odyn class associated with empcursor

ODynaset EmpcurDynaset;

 

oresult paramresult = EmpcurParam.GetValue(&EmpcurDynaset);

 

long nRecordCount = EmpcurDynaset.GetRecordCount();

int nFieldCount = EmpcurDynaset.GetFieldCount();

 

const char *value;

 

while( !EmpcurDynaset.IsEOF() )

{

for( int nFieldIndex = 0; nFieldIndex < nFieldCount; nFieldIndex++ )

{

const char* fieldname = EmpcurDynaset.GetFieldName(nFieldIndex);

 

//get the field value

OField oField = EmpcurDynaset.GetField(fieldname);

oField.GetValue(&value);

AfxMessageBox(value);

}

 

EmpcurDynaset.MoveNext();

}

 

params.Remove("EMPCURSOR");

params.Remove("DEPTNO");

 

 

잘되는군요....2주간의 삽질이 끝났습니다. ㅠ.ㅠ

다른분들은 고생하지 마세요 ㅠ.ㅠ

[Top]
No.
제목
작성자
작성일
조회
14864[질문] long타입으로 지정한 필드의 길이는... [1]
손동언
2003-07-07
1701
14863오라클9i에서 Analytic Function 사용한 ProC파일 컴파일 에러 [4]
박종구
2003-07-07
2811
14862프로시져 안에서 임시테이블을 어떻게 만들어요?? [1]
김만수
2003-07-07
10199
14861[질문] 오라클 스토어드 프로시저 [1]
신충수
2003-07-07
3561
14865┕>Re: [질문] 오라클 스토어드 프로시저
김만수
2003-07-08 08:25:37
1878
14870┕>Re: [질문] 오라클 스토어드 프로시저
신충수
2003-07-08 20:44:09
3955
14860도움이 필요합니다. [3]
이정호
2003-07-07
2289
14859index 명 바꾸기 [2]
정전화
2003-07-07
1693
14858charater set 문제 같습니다. 도와주세요 [2]
이강우
2003-07-07
2382
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.047초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다