2017-01-16 6 views
0

ここでカーソルを使用しようとしていますが、選択列のカーソルフィールドにアクセスする方法を知りたいですか?選択クエリでカーソルフィールドを使用する方法

Iは、エラーなし遵守機能

create or replace TYPE "TABLE_TYPE_SAMPLE" AS OBJECT(
    ENTITY_NAME   VARCHAR2(100) 
); 

create or replace TYPE "TABLE_SAMPLE" AS TABLE OF TABLE_TYPE_SAMPLE; 

CREATE OR REPLACE FUNCTION segmentFields(
    txnId   VARCHAR2) 
    RETURN TABLE_SAMPLE 
IS 
attValue VARCHAR2(20); 
curStr VARCHAR2(20); 

    flexTable TABLE_SAMPLE := TABLE_TYPE_SAMPLE(); 

CURSOR cur_seg 
IS 
    (SELECT colA 
    FROM table1 -- (table name has column colA) 
    WHERE id = txnId 
    ); 
BEGIN 
FOR cur_recd IN cur_seg 
LOOP 
    curStr := cur_recd.colA; 
    SELECT curStr into attValue FROM PER_PEOPLE_GROUPS; 

flexTable.EXTEND; 
    flexTable(flexTable.count) := (TABLE_TYPE_SAMPLE(attValue)) ; 
END LOOP; 
RETURN flexTable; 
END; 

、以下のように実装しています。正確な行
ORA-06512の要求された数よりも多くのリターンをフェッチ: "SEGMENTFIELDS" で、私は、クエリ

select * from table(segmentFields(480)); 

の下に実行しようとするが、私は以下のエラー、

ORA-01422を取得します、line 19
01422. 00000 - "exact fetchが要求された行数を超えて返されます"
*原因:exact fetchで指定された数値が、返される行数より少なくなりました。
処置:行のクエリまたは変更数が

を要求した書き換え私はこの実装が間違っているものを、理解したいです。

ありがとうございます。行の

答えて

0

エラー:PER_PEOPLE_GROUPS FROM ATTVALUEに

SELECT curStr。

コードを実行しますか? PER_PEOPLE_GROUPSに何行ありますか?

error indicates that more than one。 where節に条件を入れる必要があるかもしれませんか?

0

問題はselect intoです。それがなぜ最初にあるのかわからない。あなたのカーソルからの値はcur_recd.colaで利用可能で、直接使用することができます。

create or replace function segmentfields(txnid varchar2) return table_sample is 

    flextable table_sample := table_type_sample(); 

    cursor cur_seg is(
     select cola 
     from table1 -- (table name has column colA) 
     where id = txnid); 
begin 
    for cur_recd in cur_seg 
    loop 
     flextable.extend; 
     flextable(flextable.count) := (table_type_sample(cur_recd.cola)); 
    end loop; 
    return flextable; 
end; 
0

このクエリはありません持っているWHERE句:それはPER_PEOPLE_GROUPSですべての行のためのヒットを返すことを意味します

SELECT curStr into attValue FROM PER_PEOPLE_GROUPS; 

。 SELECT ... INTO構文は1つの変数を取り込むため、正確に1つの行を返すクエリが必要です。 ORA-01422メッセージは、PER_PEOPLE_GROUPSに複数の行があるため、正確なフェッチを実行していないことを示しています。あなたが達成しようとしているものに応じて

いくつかの可能な解決策、:

  1. だけPER_PEOPLE_GROUPSから1行を返すように、いくつかの種類の制限を追加します。
  2. BULK COLLECTを使用して、代わりに配列に値を入力します。
  3. 単純な代入それの顔にflexTable(flexTable.count) := (TABLE_TYPE_SAMPLE(cur_recd.colA))

でSELECTを交換して、SELECTを破棄することは、あらゆる情報をご提供していないとして、最良の選択肢と思われます。しかし、投稿されたコードで表現されていない他のビジネスロジックを実装しようとしている可能性も高いので、おそらくいくつか変更する必要があります。

+0

こんにちはAPC、 BULK INTOのあなたのお勧めは機能しました。 タイプsegment_aat 表cur_seg%ROWTYPE; l_columns segments_aat; SELECT curStr BULKはl_columnsからPER_PEOPLE_GROUPSに集約されます。 – SatyajeethT

+0

@SatyajeethT - この回答が役に立ちましたら、正解としてアップしてください。このような行動は、将来の探求者のための資源としてのSOの質を向上させる。 – APC

関連する問題