1

レコードの配列 (手数料) からテーブルを作成し、それらの行を ref カーソルに入れるストアド プロシージャがあります。

TYPE rctl IS REF CURSOR ;
Fees   t_Fees;
type t_Fees is table of t_FeeRecord index by binary_integer;

type t_FeeRecord is record(
    description         varchar2(80),
    amount              number(12,2),
    taxAmount           number(12,2)
);

--populate the Fees array

INSERT into TEMPORARY_FEE(description,amount,tax) values(Fees(i).description,Fees(i).Amount,Fees(i).Tax);

OPEN rc1 FOR SELECT description,amount TEMPORARY_FEES; 

これはすべて正常に機能します (レコードの作成、一時テーブルへの挿入、ref カーソルの作成)。ただし、テーブルを削除して、レコードの配列を直接ref_cursor? ref_cursorサードパーティのアプリケーション用として結果を返さなければなりません。

このようなものを試すことができるかもしれないと思いました。

OPEN rc1 FOR  
SELECT * FROM TABLE(cast(Fees as t_FeeRecord));

しかし、無効なデータ型を取得します。

4

1 に答える 1

1

Oracleでは、pl/sql オブジェクトではなくデータベース オブジェクトとして宣言t_FeeRecordし、 PL/SQL 型を SQL クエリで使用できないため、データ型エラーが発生します (ただし、この制限は Oracle 12c で削除されます)。 レコードはPL/SQL型でSQL問合せでは使用できないため、レコード型ではなくオブジェクト型として作成する必要があります。t_Fees


t_FeeRecord

create type t_FeeRecord is object(
    description         varchar2(80),
    amount              number(12,2),
    taxAmount           number(12,2)
);/

create type t_Fees as table of t_FeeRecord; /

以下は、レコードのテーブルを作成し、このテーブルの ref カーソルを開き、カーソルを読み取り、カーソルから取得した行をテーブルに挿入する簡単なデモです (11.2g でテスト済み)。

create type t_FeeRecord is object(
    description         varchar2(80),
    amount              number(12,2),
    taxAmount           number(12,2)
);
/

create type t_Fees as table of t_FeeRecord; 
/

create table temporary_fee(
  description varchar2(80),
  amount      number(12,2),
  taxAmount   number(12,2)
);

declare
  fees t_Fees;
  TYPE rctl IS REF CURSOR;
  cur rctl;

  rec TEMPORARY_FEE%ROWTYPE;
begin 
  fees := t_Fees (
       t_FeeRecord( 'aaa', 20, 30 ),
       t_FeeRecord( 'bbb', 10, 76 ),
       t_FeeRecord( 'xxx', 4, 23 ),
       t_FeeRecord( 'zzz', 7, 43 ),
       t_FeeRecord( 'ccc', 13, 44 ) );

  open cur for
       select * from table( fees );

  LOOP
     FETCH cur INTO rec;
     EXIT WHEN cur%NOTFOUND;
     INSERT INTO TEMPORARY_FEE VALUES rec;
  END LOOP;
  close cur;
end;  
/

select * from temporary_fee;

DESCRIPTION      AMOUNT  TAXAMOUNT
------------ ---------- ----------
aaa                  20         30 
bbb                  10         76 
xxx                   4         23 
zzz                   7         43 
ccc                  13         44 
于 2013-10-05T22:31:21.833 に答える