오라클 테이블 타입 리턴
방법 1: 패키지 사용
==========================================================================
패키지로 커서를 선언 한 후에 패키지 바디에서 커서를 오픈 하면 됩니다.
CREATE OR REPLACE PACKAGE PK_EMP_INFO
AS
TYPE T_CUR IS REF CURSOR; --리턴받을 변수에 타입선언
PROCEDURE SP_EMP_INFO
( P_EMP_NO IN EMP_TBL.EMP_NO%TYPE,
P_EMP_NAME IN EMP_TBL.EMP_NAME%TYPE,
V_CUR OUT T_CUR); --수행할 프로시져 선언
END PK_DAY_DILIGENCE_STATUS;
/
CREATE OR REPLACE PACKAGE BODY PK_EMP_INFO
AS
PROCEDURE SP_EMP_INFO
( P_EMP_NO IN EMP_TBL.EMP_NO%TYPE,
P_EMP_NAME IN EMP_TBL.EMP_NAME%TYPE,
V_CUR OUT T_CUR) --수행할 프로시져 선언
AS
BEGIN
IF V_CUR%ISOPEN THEN
CLOSE V_CUR;
END IF;
OPEN V_CUR FOR
SELECT EMP_NO, EMP_NAME
FROM EMP_TBL
WHERE COMPANY_CODE = P_COMPANY_CODE
AND DIVISION_CODE LIKE P_DIVISION_CODE
AND DEPT_CODE LIKE P_DEPT_CODE
AND EMP_NO LIKE P_EMP_NO;
END SP_EMP_INFO;
END PK_EMP_INFO;
/
델파이에서 호출하는 부분입니다.
TStoredProc 컴포넌트의 파라미터를 세팅한 후 실행이 아니라 Open해야 됩니다.
리턴되는 Curor의 파라미터 타입은 ftCursor로 설정합니다.
procedure Form1.Button1Click(Sender: TObject);
begin
with StoredProc1 do
begin
Params.Clear;
StoredProcName:= 'PK_EMP_INFO.SP_EMP_INFO;
Params.CreateParam(ftString, 'P_EMP_NO', ptInPut);
Params.CreateParam(ftString, 'P_COMPANY_CODE', ptInPut);
Params.CreateParam(ftString, 'P_DIVISION_CODE', ptInPut);
Params.CreateParam(ftString, 'P_DEPT_CODE', ptInPut);
Params.CreateParam(ftCursor, 'V_CUR', ptOutPut);
Open;
end;
end;
// 오픈전에 파라미터 값 Assign
procedure TForm1.StoredProc1BeforeOpen(DataSet: TDataSet);
begin
with TStoredProc(DataSet) do
begin
ParamByName('P_COMPANY_CODE').Value:= '0';
ParamByName('P_DIVISION_CODE').Value:= '000';
ParamByName('P_DEPT_CODE').Value:= '0000'
ParamByName('P_EMP_NO').Value:= Edit1.Text;
end;
end;
위처럼 Open 하시면 스토어드프로시저를 일반 쿼리처럼 사용하실 수 있습니다.
==============================================================================
방법 2: Type Object 사용
=============================================================================
오라클의 Type과 Type Object를 생성한 후
Function에서 Return형을 생성한 Type으로 만드셔서 사용하시면 됩니다.
Type 생성
=============================================
CREATE TYPE OBJTYPEEMP_INFO
AS OBJECT EMP_NO VARCHAR2(8), EMP_NAME VARCHAR(30));
CREATE TYPE TBLTYPE_EMP_INFO
AS TABLE OF OBJTYPE_EMP_INFO;
=============================================
Function 생성
=============================================
CREATE OR REPLACE FUNCTION GET_EMP_INFO
(
P_COMPANY_CODE IN EMP_TBL.COMPANY_CODE%TYPE,
P_DIVISION_CODE IN EMP_TBL.DIVISION_CODE%TYPE,
P_DEPT_CODE IN EMP_TBL.DEPT_CODE%TYPE,
P_PART_CODE IN WORK_PART.PART_CODE%TYPE,
P_EMP_NO IN VARCHAR2 --%문자사용가능
)
RETURN TBLTYPE_DEPT_STATUS
AS
RESULT TBLTYPE_EMP_INFO := TBLTYPE_EMP_INFO();
BEGIN
DECLARE
V_EMP_NO EMP_TBL.EMP_NO%TYPE;
V_EMP_NAME EMP_TBL.EMP_NAME%TYPE;
I NUMBER = 1;
CURSOR SOURCE IS
SELECT EMP_NO, EMP_NAME
FROM_EMPLOYEE
WHERE COMPANY_CODE = P_COMPANY_CODE
AND DIVISION_CODE LIKE P_DIVISION_CODE
AND DEPT_CODE LIKE P_DEPT_CODE
AND PART_CODE LIKE P_PART_CODE
AND EMP_NO LIKE P_EMP_NO;
BEGIN
OPEN SOURCE;
LOOP
FETCH SOURCE INTO V_EMP_NO, V_EMP_NAME;
EXIT WHEN SOURCE%NOTFOUND;
RESULT.EXTEND;
RESULT(I) := OBJTYPE_EMP_INFO(V_EMP_NO, V_EMP_NAME);
I := I + 1;
END LOOP;
CLOSE SOURCE;
RETURN RESULT;
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END;
/* 사용방법
SELECT *
FROM THE ( SELECT CAST(GET_EMP_INFO('1', '1', '000001', 'A', '%') as TBLTYPE_EMP_INFO )
FROM DUAL );
*/
======================================================
SQL 사용방법은
SELECT * FROM THE
(SELECT CAST([Function_Name]([Input 파라미터]...)
as [Type Object Name]) FROM DUAL );
쿼리 컴포넌트에 위 SQL처럼 적으시면 일반 테이블 쿼리처럼 사용하실 수 있습니다...
의문 나시는 건 다시 질문해주세요
박대곤 님이 쓰신 글 :
: 환경은 delphi5,6. Oracle 8i 입니다.
:
: 몇가지 예제를 찾아서 실해해 보는데 정상적인 실행을 할 수 가 없네요
:
: 델파이 Source에서 프로시져(Oracle StoredProcedure)의 값을 받아보는 예제좀 만들어 주세요
:
: 아무리 찾아보고 알아봐도 잘 모르겠네요.
:
|