안녕하세요
초보입니다.
델파이7.0 에서 오라클 프로시져를 실핼후 그 결과값이
한개의 변수가 아닌
SELECT의 결과문을
커셔로 받아 바로 DB그리드(혹은 SPREED)에 연결하여 뿌리는 방법좀 알려주세요
상세하게요
고수님들!!
본문=============
PROCEDURE USP_CALL_MULTIBOM_TREE
(
search_date_mode IN VARCHAR2,
search_date IN VARCHAR2,
par_class_ids IN VARCHAR2,
par_object_ids IN VARCHAR2,
par_object_pos IN VARCHAR2,
return_cursor OUT REF_CURSOR_TYPE
) IS
sPar_object_pos VARCHAR2(1000);
nAssyPos NUMBER := 0;
nPos PLS_INTEGER := 0;
nMaxLevel NUMBER := 0;
str_sql VARCHAR2(32767);
BEGIN
--DBMS_OUTPUT.Enable(1000000);
new_seq_no := 0;
COMMIT;
PKG_MULTIBOM.USP_GET_MULTIBOM_TREE(search_date_mode, search_date, 1, par_class_ids, par_object_ids, par_object_pos);
SELECT MAX(nLevel) INTO nMaxLevel FROM MULTIBOM##@PDM_CON;
sPar_object_pos := par_object_pos;
str_sql := 'SELECT nLevel, part_object_id, part_class_id, part_state, link_object_id, link_class_id, link_state, seq_no as no';
FOR i IN 1..nMaxLevel LOOP
str_sql := str_sql||', (SELECT nLevel FROM MULTIBOM##@PDM_CON WHERE seq_no = t.seq_no AND nLevel='||i||') AS LVL'||i;
END LOOP;
str_sql := str_sql||', pfm, part_no, part_name, revision as rev';
LOOP
IF sPar_object_pos IS NULL THEN
EXIT;
END IF;
nPos := instr(sPar_object_pos,',');
IF nPos <> 0 THEN
nAssyPos := SUBSTR(sPar_object_pos, 1, nPos-1);
sPar_object_pos := SUBSTR(sPar_object_pos, nPos+1);
ELSE
nAssyPos := sPar_object_pos;
sPar_object_pos := '';
END IF;
str_sql := str_sql||', (SELECT qty FROM MULTIBOM_QTY##@PDM_CON WHERE seq_no=t.seq_no AND assy_idx='||nAssyPos||') AS QTY'||nAssyPos;
END LOOP;
str_sql := str_sql||', part_eo_no as eono, part_effective_from as eodate FROM MULTIBOM##@PDM_CON t ORDER BY seq_no ASC';
OPEN return_cursor FOR str_sql;
--CLOSE return_cursor;
COMMIT;
END USP_CALL_MULTIBOM_TREE;
=========================
참고로 VB.NET에서는 된다고 알고 있는데요!!
흠.. 오라클 버젼이 어떻게 되는지요?
REF CURSOR가 있는거보니까.. 8i정도는 된것 같은데요..
제가 직접 오라클에서 테스트(사실은 갖고논다구.. 깔짝깔짝) 해보았을 때에는
좀 오래되서 기억이 안나지만.
function으로 리턴을 받았던것으로 기억이 납니다.
function의 return 값을 ref cursor로 받았던거 같네요..
단.. 중요한 것은..
OLEDB를 이용하실 때 Oracle OLEDB for oracle을 사용하니.. 결과가 안나오더군요..
즉, 에러더군요..
그래서, Microsoft OLEDB for oracle을 사용하니까.
select 함수 from 테이블
이렇게 하니까 결과값이 DBGrid에 뿌려졌던것으로 기억이 납니다.
그냥 테스트한다고 재미로 깔짝대보았떤 기억이 나네요..
왜냐하면, Oracle이 신버젼 나올때마다 그 기능을 조금씩 테스트를 해 봤었는데..
그게 되더군요..
그것을 받기 위해서는 cursor로 받는 방법도 있지만,
record를 선언해서 record 타입의 table로 지정해서 리턴을 받아도 되는 것 같았습니다.
(즉, return type이 table -- 읔.. 이거 9i꺼던가?? ㅡ,,ㅡ)
그냥, 테스트를 했던 유저로써 정확한지 기억이 안나서(8i가 언제나왔었죠?? 큽큽)
하지만, function을 써서 cursor를 받았던 것은 기억이 나네요.
물론, DBGrid에 뿌려준것도요..
ps. 이제는 pc에 os 3개깔아서 쓰는것도 귀찮아서.. 테스트도 안하네요.
그냥 밀었다가.. 지웠다가. 설치하고.. 뭐 이렇게 1개씩만 테스트를 하네요..
아직 10g는 설치못해