Q&A

  • 오라클PROC의 CUrsor의 리턴값 DB그리드에 올리는 방법좀알려주세요??
안녕하세요
초보입니다.
델파이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에서는 된다고 알고 있는데요!!
2  COMMENTS
  • Profile
    착한천사 2006.08.16 22:12
    착한천사입니다.
    흠.. 오라클 버젼이 어떻게 되는지요?
    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는 설치못해
  • Profile
    조성미 2006.08.17 08:23
    참고로 보내주신 메일 잘받아 보았구요
    그런데 저는  현재 OLE방식이 아니고 BDE방식이구요
    ORACLE PACKAGE안에서 PROCEDURE에서 CURSOR를 RETURN하려고 하는데
    중요한 것은 델파이에서 PARAM으로  PROC를 실행하는 예제는 많이 있고
    저도 잘 되는데 도데체 RETURN 값을 받아서 DB그리드 혹은  STRING GRID에
    넣는 방법좀 자세히 알려줄수 없나요  혹 옥은 예제 델파이 프로그램이라도
    부탁드립니다. 간절히.....
    현재 CURSOR가 아닌  VARCHAR2는 리텅이 잘됩니다.
    그리고 리턴될수 있는 VARCHAR2변수의 값이 너무길면 에라가 나는데 오ㅒ그런가요?