[pgsql-jp: 29058] fetchの連続使用時not found処理

Kuniko YASUDA kyasuda @ d-d.co.jp
2003年 2月 14日 (金) 16:10:05 JST


はじめまして、安田と申します。

現在postgres 7.2で PL/SQL -> PL/pgSQLの変換作業を行って
いるのですが、fetchを連続で行った場合にエラーがでて困っております

PL/SQLで
-------------------------------------------
宣言部分
CURSOR c1 IS SELECT col1,col2,col3 FROM t1;

cc1 c1%ROWTYPE;
cc2 c1%ROWTYPE;

BEGIN部分
  OPEN c1 ;
  LOOP

 cc1:= NULL;
  cc2:= NULL;

  FETCH c1 INTO cc1;
   EXIT WHEN m1%NOTFOUND;

  FETCH c1 INTO cc2; 

  INSERT INTO t2(
  col11,col12,col13,
  col21,col22,col23
  ) values (
  cc1.col1,cc1,col2,cc1.col3,
  cc2.col1,cc2,col2,cc2.col3
  )

 END LOOP;
  CLOSE c1;
------------------------------------------
となっているところを
PL/pgSQLで
-------------------------------------------
宣言部分
CURSOR c1 
c1 refcursor;
cc1 record;
cc2 record;

BEGIN部分
  OPEN c1 FOR SELECT col1,col2,col3 FROM t1;
  LOOP

  FETCH c1 INTO cc1;
  IF NOT found THEN
    EXIT;
  END IF;

  FETCH c1 INTO cc2; 
 
 INSERT INTO t2(
  col11,col12,col13,
  col21,col22,col23
  ) values (
  cc1.col1,cc1,col2,cc1.col3,
  cc2.col1,cc2,col2,cc2.col3
  )

 END LOOP;
  CLOSE c1;
------------------------------------------
この場合に、SELECT col1,col2,col3 FROM t1が
2件以上なかった場合に、cc2の部分で
ERROR: record cc2 is unassigned yetとなってしまいます。
PL/SQLでは "cc2:= NULL;" のような記述ができるのですが、
PL/pgSQLではrecord型にたいしてcc2:= NULL;のような
記述ができません。
PL/pgSQLでも同じような処理をすることはできないでしょうか。

よろしくお願いいたします。




pgsql-jp メーリングリストの案内