2

いくつかのテーブルからデータを選択します。次に、戻る前にカーソルから返されたデータを編集する必要があります。次に、カーソルがperlスクリプトに渡され、行が表示されます。

そのために、次のコードのようにpl/sqlテーブルを作成します。私が知る必要があるのは、そのテーブルに戻る方法ですか?

現在、「テーブルまたはビューが存在しません」というエラーが表示されます。簡単なテーブルに使用するテストコードをここに添付します。

CREATE OR REPLACE FUNCTION test_rep
RETURN SYS_REFCURSOR
AS

CURSOR rec_Cur IS 
    SELECT  table1.NAME, 
        table1.ID 
    FROM TESTREPORT table1;
TYPE rec_Table IS TABLE OF rec_Cur%ROWTYPE INDEX BY PLS_INTEGER;
working_Rec_Table rec_Table;    

TYPE n_trade_rec IS RECORD
(
    NAME    VARCHAR2(15), 
    ID      NUMBER
);
TYPE ga_novated_trades IS TABLE OF n_trade_rec index by VARCHAR2(15);
va_novated_trades    ga_novated_trades;
v_unique_key VARCHAR2(15);

TYPE db_cursor IS REF CURSOR;
db_cursor2 db_cursor; 

BEGIN

    OPEN rec_Cur;
    FETCH rec_Cur BULK COLLECT INTO working_Rec_Table;

    FOR I IN 1..working_Rec_Table.COUNT LOOP
        v_unique_key := working_Rec_Table(I).NAME;
        va_novated_trades(v_unique_key).NAME    := working_Rec_Table(I).NAME;
        va_novated_trades(v_unique_key).ID      := working_Rec_Table(I).ID;
     END LOOP; --FOR LOOP

     OPEN db_cursor2 FOR SELECT * FROM va_novated_trades; --ERROR LINE

     CLOSE rec_Cur;
     RETURN db_cursor2;

END test_rep;
/
4

1 に答える 1

2

基本的に、関数table typeを使用して oracleから選択する方法がありますTABLE()

SELECT * FROM table(va_novated_trades);

ただし、これはスキーマテーブル タイプおよびオンplsql tables(スキーマで定義され、plsql パッケージでは定義されていないテーブルタイプ) に対してのみ機能します。

CREATE TYPE n_trade_rec AS OBJECT
(
    NAME    VARCHAR2(15), 
    ID      NUMBER
);
CREATE TYPE ga_novated_trades AS TABLE OF n_trade_rec;

しかし、クエリ (および/または perl スクリプト) ですべてを実行する必要があると思います。

たとえば、4 番目の文字を分析し、それに応じて他のフィールドを編集する必要があるフィールドが 1 つあります。

これは、次のようなクエリで実現できます。

select case when substr(one_field, 4, 1) = 'A' then 'A.' || sec_field
            when substr(one_field, 4, 1) = 'B' then 'B.' || sec_field
            else sec_field 
       end as new_sec_field,
       case when substr(one_field, 4, 1) = 'A' then 100 * trd_field
            when substr(one_field, 4, 1) = 'B' then 1000 * trd_field
            else trd_field 
       end as new_trd_field,
       -- and so on
from TESTREPORT
于 2012-06-22T06:35:30.010 に答える