2017-11-15 22 views
0

RefCursorタイプのオブジェクトを出力パラメータとして返す必要があるPL/SQLストアドプロシージャがあります。 SPの終わりにPL/SQL配列をテーブルにキャストするときに無効なデータ型エラーが発生しました

PROCEDURE usp_appnt_stts_driver_wraper2 
(in_req_src_system_id IN NUMBER, 
    in_req_user_info  IN VARCHAR2, 
    out_response_rec1  OUT SYS_REFCURSOR) 

、私は、SELECT文を使用して、私のフロントエンドにハードコード値を返すことができています。

OPEN out_response_rec1 FOR 
SELECT 'data1', 'data2', 'data3', 'data 4' FROM DUAL; 

これは問題なく動作します。しかし、私は配列から取得しているデータを送信する必要があります。

アレイは

FOR g_index IN g_slsnetoutbndarr.FIRST..g_slsnetoutbndarr.LAST 

LOOP 

    out_response_rec.EXTEND; 
    IF g_SlsnetOutbndArr(g_index).Rectypdesc IS NOT NULL THEN 
    out_response_rec(g_index).Rectypdesc := g_SlsnetOutbndArr(g_index).Rectypdesc ; 
    out_response_rec(g_index).Recdetltcode := g_SlsnetOutbndArr(g_index).Recdetltcode; 
    out_response_rec(g_index).RecDetlDesc := g_SlsnetOutbndArr(g_index).RecDetlDesc ; 
    END IF; 

END LOOP; 

だから、このコードの末尾に、Arrayオブジェクトout_response_recは私が必要とするすべての値を持って、このように移入されます。

しかし、これらの値をRefCursor出力パラメータにどのように転送すればよいですか?

アップデート1

私は、パッケージの仕様で新しいデータ型を作成しようとしました。

TYPE SlsnetOutbndRec IS RECORD(
Rectypdesc VARCHAR2(30), 
Recdetltcode NUMBER, 
RecDetlDesc VARCHAR2(130)); 

TYPE SlsnetOutbndTabArr IS TABLE OF SlsnetOutbndRec; 

は最後に、私は

OPEN out_response_rec_result FOR 
SELECT * FROM TABLE (Cast(out_response_rec AS SlsnetOutbndTabArr)); 

としての私のSPのテーブルに配列をキャストしようとしている。しかし、これはInvalid Data Typeエラーを投げています。 SPは、作成した新しいデータ型を認識しません。

+0

だから何があなたの運転配列、 'g_slsnetoutbndarr'を移入私は、インライン、について説明下記参照あなたの条件のための解決策が出ていますか? – APC

+0

こんにちは、別のパッケージのサードパーティSPから来ているので、その中に何が入っているのかわかりません。 – BuggyCoder

+0

"配列"と考えることができるデータ型は複数あります - 'g_slsnetoutbndarr'はコレクション、' VARRAY'または連想配列ですか?また、それはオブジェクト型かレコードを含んでいますか? – MT0

答えて

0

したがって、このコードの最後では、配列オブジェクトout_response_recには、すべて私が必要とする値 があります。

しかし、これらの値をRefCursor出力パラメータにどのように転送すればよいですか?

私が理解できるので、あなたは別のProcedureによって移入されているcollectionであるQueryプラス値の出力を得るためにSYS_REFCUSORを使用していました。

--Create a Object in Place of Record since we cannot use a PLSQL scope compnenet in SQL scope in Oracle 11g and below 
CREATE OR REPLACE TYPE SlsnetOutbndRec IS OBJECT 
    (
     Rectypdesc  VARCHAR2 (30), 
     Recdetltcode NUMBER, 
     RecDetlDesc VARCHAR2 (130) 
    ); 

--Create a table type of the Object 
CREATE OR REPLACE TYPE SlsnetOutbndTabArr IS TABLE OF SlsnetOutbndRec; 
/

--Procedure 
CREATE OR REPLACE PROCEDURE combined_rslt (var OUT SYS_REFCURSOR) 
AS 
    v_var SlsnetOutbndTabArr := SlsnetOutbndTabArr(); 

    l_var SlsnetOutbndTabArr := SlsnetOutbndTabArr(); 
BEGIN 
    --Populating the collection 
    v_var.EXTEND; 
    v_var (1) := SlsnetOutbndRec ('ABC', 1, 'A'); 

    OPEN VAR FOR 
     SELECT 'CDE', 2, 'B' FROM DUAL 
     UNION ALL -- Combining the result of collection with the result of query 
     SELECT * 
     FROM TABLE (v_var) t; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (SQLERRM); 
END; 

実行::

DECLARE 
    x SYS_REFCURSOR; 
    a VARCHAR2 (30); 
    b NUMBER; 
    c VARCHAR2 (130); 
BEGIN 
    combined_rslt (var => x); 

    LOOP 
     FETCH x INTO a, b, c; 

     EXIT WHEN x%NOTFOUND; 
     DBMS_OUTPUT.put_line (a || ' ' || b || ' ' || c); 
    END LOOP; 
END; 

結果:

SQL>/ 
CDE 2 B 
ABC 1 A 

PL/SQL procedure successfully completed. 
0

あなたは(Oracleの12より前のバージョンで)あなたは、SQLステートメントでそれらを使用したい場合は、SQLスコープ(ないPL/SQLの範囲)内の型を作成する必要があります。

CREATE TYPE SlsnetOutbndRec IS OBJECT(
    Rectypdesc VARCHAR2(30), 
    Recdetltcode NUMBER, 
    RecDetlDesc VARCHAR2(130) 
) 
/

CREATE TYPE SlsnetOutbndTabArr IS TABLE OF SlsnetOutbndRec 
/

その後のことができます。

:サードパーティのデータ型はその後、連想配列の場合

PROCEDURE usp_appnt_stts_driver_wraper2(
    in_req_src_system_id IN NUMBER, 
    in_req_user_info  IN VARCHAR2, 
    out_response_rec_result OUT SYS_REFCURSOR 
) 
IS 
    out_response_rec SlsnetOutbndTabArr := SlsnetOutbndTabArr(); 
    g_slsnetoutbndarr ThirdPartyDataType := Get_From_3rd_party_Package(); 
BEGIN 
    FOR i IN 1 .. g_slsnetoutbndarr.COUNT LOOP 
    IF g_SlsnetOutbndArr(i).Rectypdesc IS NOT NULL THEN 
     out_response_rec.EXTEND; 
     out_response_rec := SlsnetOutbndRec(
     g_SlsnetOutbndArr(i).Rectypdesc, 
     g_SlsnetOutbndArr(i).Recdetltcode, 
     g_SlsnetOutbndArr(i).RecDetlDesc 
    ); 
    END IF; 
    END LOOP; 

    OPEN out_response_rec_result FOR 
    SELECT * 
    FROM TABLE(out_response_rec); 
END; 

:あなたの手順でそれを使用します(お使いのサードパーティのデータ型がコレクションまたはVARRAYであると仮定した場合)

関連する問題