2012-04-09 13 views
0

複数の行をストアドプロシージャに渡す必要があります。参照カーソルは使用できますか?私は次のことを試してみましたので:PL/SQLストアドプロシージャrefカーソルをパラメータとして使用

私のパッケージの中に私が持っている:

TYPE FACT_VND_RECORD 
IS 
    RECORD 
    (
    COD_NOMCPDT P6PCM2_PARMCMS.COD_NOMCPDT%TYPE, 
    LIB_LIBNOMCPDT P6PCM2_PARMCMS.LIB_LIBNOMCPDT%TYPE, 
    DHS_MAJ P6PCM2_PARMCMS.DHS_MAJ%TYPE, 
    LIB_AUTH_MAJ P6PCM2_PARMCMS.LIB_AUTH_MAJ%TYPE); 

TYPE FACT_VND_CURSOR 
    IS 
     REF 
     CURSOR 
     RETURN FACT_VND_RECORD; 

と2の手順:

PROCEDURE REC_FACT_VND(
     P_IN_NUM_VND IN OUT P6PCM2_PARMCMS.NUM_VND%TYPE, 
     P_OUT_FACT_VND IN OUT FACT_VND_CURSOR, 
     P_OUT_CODE_RET OUT INTEGER, 
     P_OUT_MSG_ERR OUT VARCHAR2); 

    PROCEDURE MAJ_FACT_VND(
     P_IN_NUM_VND IN OUT P6PCM2_PARMCMS.NUM_VND%TYPE, 
     P_IN_FACT_VND IN OUT FACT_VND_CURSOR, 
     P_OUT_CODE_RET OUT INTEGER, 
     P_OUT_MSG_ERR OUT VARCHAR2); 

は、以前に満たされたカーソルをRecievesとデータで何かを行います。

私はこれらの2つの呼び出しを使用します。最初のものは正常に動作し、参照カーソルC1の中のデータを見ることができ、次にそれを使用しようとします。それが定義されていないので、私はデータを反復処理することができません

C1 PACK_REC_FACT_VND.FACT_VND_CURSOR; 
--other definitons 
     PACK_REC_FACT_VND.REC_FACT_VND(NUM_VND,C1,COD_RET,MSG_ERR); 
    PACK_REC_FACT_VND.MAJ_FACT_VND(NUM_VND,C1,COD_RET,MSG_ERR); 

: (第2の手順からコード)

LIGNE_TAUX PACK_REC_FACT_VND.FACT_VND_RECORD; 
    BEGIN 
     DELETE FROM P6PCM2_PARMCMS WHERE NUM_VND=P_IN_NUM_VND; 
     FOR LIGNE_TAUX IN P_IN_FACT_VND 
     LOOP 
     INSERT 
     INTO P6PCM2_PARMCMS VALUES 
      (
      P_IN_NUM_VND, 
LIGNE_TAUX.COD_NOMCPDT, 
LIGNE_TAUX.LIB_LIBNOMCPDT, 
LIGNE_TAUX.DHS_MAJ, 
LIGNE_TAUX.LIB_AUTH_MAJ); 
     END LOOP; 

Error(48,21): PLS-00221: 'P_IN_FACT_VND' is not a procedure or is undefined 

または私はRECORD OF TABLEに切り替える必要がありますか?

答えて

3

このようなREFカーソルは使用できません。明示的なカーソル構文を使用する必要があります。しかし

 LIGNE_TAUX PACK_REC_FACT_VND.FACT_VND_RECORD; 
    BEGIN 
     DELETE FROM P6PCM2_PARMCMS WHERE NUM_VND=P_IN_NUM_VND; 

     LOOP 
     fetch P_IN_FACT_VND into LIGNE_TAUX; 
     exit when P_IN_FACT_VND%notfound; 
     INSERT 
     INTO P6PCM2_PARMCMS VALUES 
      (
      P_IN_NUM_VND, 
      LIGNE_TAUX.COD_NOMCPDT, 
      LIGNE_TAUX.LIB_LIBNOMCPDT, 
      LIGNE_TAUX.DHS_MAJ, 
      LIGNE_TAUX.LIB_AUTH_MAJ); 
     END LOOP; 

    close P_IN_FACT_VND; 

、あなたがコレクションにレコードをフェッチする場合は、より良いパフォーマンスを得る:この(:未テストコード!警告を)試してみてください。このようなもの:

 type LIGNE_TAUX_NT is table of PACK_REC_FACT_VND.FACT_VND_RECORD; 
     LIGNE_TAUX_COLL LIGNE_TAUX_NT; 
    BEGIN 
     DELETE FROM P6PCM2_PARMCMS WHERE NUM_VND=P_IN_NUM_VND; 

     fetch P_IN_FACT_VND bulk collect into LIGNE_TAUX_COLL; 
     close P_IN_FACT_VND; 

     -- while we're at it why not use the more efficient FORALL syntax 
     -- to perform the inserts? 


     forall idx in LIGNE_TAUX_COLL.first() .. LIGNE_TAUX_COLL.last() 
      INSERT 
      INTO P6PCM2_PARMCMS VALUES 
       (
      P_IN_NUM_VND, 
      LIGNE_TAUX_COLL(idx).COD_NOMCPDT, 
      LIGNE_TAUX_COLL(idx).LIB_LIBNOMCPDT, 
      LIGNE_TAUX_COLL(idx).DHS_MAJ, 
      LIGNE_TAUX_COLL(idx).LIB_AUTH_MAJ); 

Find out more

+0

レコードのテーブルは私の第2の思考でした。私は試してみましょう!答えが来る。 – Samson

+0

レコードのテーブルを入力パラメータに切り替えました。なぜなら、それは安全に使うためです:とにかく10x – Samson

関連する問題