2014-05-16 6 views
-2

코드에서 rc1을 찾으십시오. 이 커서로 v_TeminatKayit 컬렉션을 반환하고 싶습니다. 내가 어떻게 해?컬렉션을 커서 매개 변수로 제공하려면 어떻게해야합니까?

이것은 작동하지 않습니다.

OPEN RC1 FOR 
SELECT * 
    FROM TABLE(CAST(v_TeminatKayit AS t_TeminatTip)); 

이것은 작동하지 않습니까? 어떻게 매개 변수 아웃으로 커서로 모음을 반환 할 수 있습니다!? 3

CREATE OR REPLACE PROCEDURE KRD_SEL_GNAKDIRISKDETAY_SP 
    (
     p_MusteriNo IN NUMBER DEFAULT 0, 
     RC1   IN OUT SYS_REFCURSOR, 
     RC2   IN OUT SYS_REFCURSOR 
    ) AS 
     v_RCRTeminat  SYS_REFCURSOR; 
     v_UrunAdi   VARCHAR2(80); 
     v_RiskTutar  NUMBER(26, 2); 
     v_GNakdiRiskToplam NUMBER(26, 2) := 0; 
     v_KullandirimTarih DATE; 
     v_Vade    DATE; 
     v_Muhatap   VARCHAR2(300); 
     v_Konu    VARCHAR2(600); 
     TYPE t_TeminatTip IS RECORD(
      v_urunAdi VARCHAR2(80), 
      v_mektupTtr NUMBER(26, 2), 
      v_mektupTar DATE, 
      v_kkrVade DATE, 
      v_muhatap VARCHAR2(300), 
      v_konu  VARCHAR2(600)); 

     TYPE t_TeminatBilgi IS TABLE OF t_TeminatTip INDEX BY BINARY_INTEGER; 
     v_TeminatKayit t_TeminatBilgi; 

    BEGIN 
     BEGIN 
      KRD_SEL_TEMINATMEKTUPRISK_SP(p_MusteriNo => p_MusteriNo, RC1 => v_RCRTeminat); 
      IF v_RCRTeminat%ISOPEN THEN 
      FETCH v_RCRTeminat BULK COLLECT 
       INTO v_TeminatKayit; 

      END IF; 
     -- how can I serve the collection to cursor parameter ? 
      OPEN RC1 FOR 
      SELECT * 
       FROM TABLE(CAST(v_TeminatKayit AS t_TeminatTip)); 


     EXCEPTION 
      WHEN OTHERS THEN 
      raise_application_error(-20101, ''); 
     END; 

    END KRD_SEL_GNAKDIRISKDETAY_SP; 
+0

내가 원하는 이유 : 모든 대답을 이해합니다. 나는 내용의 일부를 수정 한 다음 커서로 전달하기 때문에 질문의 코드 에서처럼 만들고 싶습니다. – theklc

답변

1

당신은 PL/SQL에서 일반적인 프로그래밍 연습하지 않은, 그것으로 작업 할 수 있도록 메모리에 데이터를 알 수없는 양을 가져 오기 위해 노력하고 . 작은 데이터베이스에서는 괜찮을 지 모르지만 데이터베이스가 큰 데이터베이스이고 BIG 데이터로 작업하는 것을 상상해보십시오. 반환 세트의 크기를 알지 못해도 1 억 개의 행을 반환하는 쿼리를 열면 그리고 나서 이것을 메모리 콜렉션으로 대량 수집하려고 시도하십시오. 운이 좋다면이 모든 일로 인해 프로세스가 중단 될 수 있습니다. 운이 좋지 않다면 데이터베이스 인스턴스가 다운 될 수 있습니다. 그러면 아마도 DBA가 매우 불행하게 될 것입니다. 그리고 만약 당신이 일이라면은 나쁜 날입니다. 멀리서 볼 때 재미 있을지 모르지만, 당신이 행동에 가까울 때 대개 재미 있지는 않습니다 - 특히 3 명의 DBA, 2 명의 시스템 관리자, 빨간 얼굴을 가진 관리자가 큐비클의 외침에 갑자기 나타납니다. "뭐 했니?!?!?!?". 정말로, 이것은 재미 있지 않습니다. 내가 아는 방법을 부탁하지 마십시오 ... : - :

CREATE OR REPLACE PROCEDURE KRD_SEL_GNAKDIRISKDETAY_SP 
    (
    p_MusteriNo IN NUMBER DEFAULT 0, 
    RC1   IN OUT SYS_REFCURSOR, 
    RC2   IN OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    BEGIN 
    KRD_SEL_TEMINATMEKTUPRISK_SP(p_MusteriNo => p_MusteriNo, RC1 => RC1); 
    EXCEPTION 
    WHEN OTHERS THEN 
     raise_application_error(-20101, ''); 
    END; 
END KRD_SEL_GNAKDIRISKDETAY_SP; 

그것을}

이 일상에서 커서를 반환하려는 경우 가장 좋은 방법은 정확히 그렇게 당신의 루틴을 재 작성하는 것입니다 KRD_SEL_TEMINATMEKTUPRISK_SP이 커서를 열 수있을만큼 친절하니 끝났습니다. KRD_SEL_GNAKDIRISKDETAY_SP의 발신자는 어떤 방식 으로든 커서에서 읽어야합니다 (그들은 어쨌든 할 것입니다.).

행운을 빈다.

공유하고 즐기십시오.

+0

나는 모든 대답을 이해한다. 나는 내용의 일부를 수정 한 다음 커서로 전달하기 때문에 질문의 코드 에서처럼 만들고 싶습니다. – theklc

관련 문제