답변 감사드립니다.
그런데 답변을 읽기전에 해결책을 알아버렸답니다. 자문자답인 셈인데
저처럼 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주간의 삽질이 끝났습니다. ㅠ.ㅠ
다른분들은 고생하지 마세요 ㅠ.ㅠ
|