電子書籍の厳選無料作品が豊富!

こんにちは
pgAdmin3を使用しています。

 条件に一致する行を複数取得して、その行に対してアップデートをかけたいです。アップデートの処理がややこしいので一文で書かず、カーソルを使用して一行づつ処理をしていきたいのですが、下記で カーソル名.列名で値の取得が出来ないようです。
missing FROM-clause entry in subquery for table "car"

BEGIN;
  DECLARE car CURSOR IS ~抽出条件
FETCH ALL IN car;
  UPDATE ・・・ WHERE clm_name = car.clm_name
CLOSE car;
END;

 postgresqlが不慣れで、ネットで調べては色々変えてやってみているのですが、ここで詰まってしまいました。
 カーソル内のカラムの取得方法についてご教示下さる方が居れば助かります。

A 回答 (3件)

#2回答者です。



「FETCH ALL IN カーソル名」の使い方がよく分からなかったので、代替案としてPL/pgSQLを使用する方法を考えてみました。

(1)関数の定義
recという行データ受け取り変数を使い、受け取った特定列の参照は、「変数名.列名」で行えます。

create function functest1() returns int as
'
declare
car cursor for
select * from t1;
rec record;
begin
open car;
loop
fetch car into rec;
if not found then
exit;
end if;
update t2
set c2=0
where c3=(select c3 from t3 where c1=rec.c1);
end loop;
close car;
return 0;
end;
'
language 'plpgsql'
;

(2)関数の実行
select functest1();

(3)関数を削除する場合
drop function functest1();
    • good
    • 0
この回答へのお礼

ありがとうございます。
 plpgsqlを使えるように設定したりと時間がかかり、お礼が遅くなってしまいました。

 今の所、まだ処理中で結果が返ってきておりませんが、エラーが出ておりませんので大丈夫のようです。

 oracle→ポスグレの移行をしているのですが、勉強することが山ほどありそうです。
 
 今回はありがとうございました。

お礼日時:2006/06/25 08:59

PostreSQLのカーソルについては詳しくないのですが。

。。

「FROM句のサブクエリの書き方にミスがある」とエラーが出ているのだから、質問で省略されているSELECT文が分からなければ、回答のしようがありません。

「DECLARE car CURSOR IS ~」の最後のISはFORの転記誤り?

カーソル宣言でエラーが出ているのだから、その後の処理は何もされないでしょうね。

#1さんの説明の「カーソルを使用した更新はできない」は、
「UPDATE 表名 SET 列名=値 WHERE CURRENT OF カーソル名」
という操作ができないという意味だと思うので、質問中の操作(検索条件指定のUPDATE)は該当しないと思われます。

この回答への補足

有難うございます
 ご指摘の通り、IS は、FORの転記間違いでした。

 サブクエリの中を含めて書くと

BEGIN;
 DECLARE car CURSOR FORSELECT 列名1 AS 列仮名1 from 表1;

 FETCH ALL IN car;
 
  UPDATE 表2
SET  列名2 = 値
    WHERE
列名3 = (
SELECT 列名3
FROM表3
WHERE列名1 = car.列仮名1
);
CLOSE car;
END;

 のような感じになります。(省略してございますが)
missing FROM-clause entry in subquery for table "car"
 
 のエラーが「car.列名 で、カーソルの特定列名の値を取得」 という文章の指定が違うという意味かなと思い(carをテーブル別名とみなされているような気がして)、
カーソル内の列を取り出してSQLに使用するには、どんな記述になるのかなとご質問させていただいた次第でございます。

補足日時:2006/06/23 18:07
    • good
    • 0

「PostgreSQLはカーソルでの更新をサポートしていません」


ってことではないでしょうか?



以下公式マニュアルより
現時点では、PostgreSQLはカーソルでの更新をサポートしていません。したがって、FOR UPDATEを指定するとエラーメッセージが表示されます。

参考URL:http://www.postgresql.jp/document/pg813doc/html/ …
    • good
    • 0
この回答へのお礼

 ご回答ありがとうございましたm(_”_)m

お礼日時:2006/06/25 09:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!