

こんにちは
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が不慣れで、ネットで調べては色々変えてやってみているのですが、ここで詰まってしまいました。
カーソル内のカラムの取得方法についてご教示下さる方が居れば助かります。
No.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();
ありがとうございます。
plpgsqlを使えるように設定したりと時間がかかり、お礼が遅くなってしまいました。
今の所、まだ処理中で結果が返ってきておりませんが、エラーが出ておりませんので大丈夫のようです。
oracle→ポスグレの移行をしているのですが、勉強することが山ほどありそうです。
今回はありがとうございました。
No.2
- 回答日時:
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に使用するには、どんな記述になるのかなとご質問させていただいた次第でございます。
No.1
- 回答日時:
「PostgreSQLはカーソルでの更新をサポートしていません」
ってことではないでしょうか?
以下公式マニュアルより
現時点では、PostgreSQLはカーソルでの更新をサポートしていません。したがって、FOR UPDATEを指定するとエラーメッセージが表示されます。
参考URL:http://www.postgresql.jp/document/pg813doc/html/ …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
PostgresSQLで自動計算
-
フラグをたてるってどういうこ...
-
追加クエリで重複データなしで...
-
【sqlite3】deleteしても.dbフ...
-
ExcelのMatch関数のようなもの...
-
dumpでインデックスだけ抜きたい
-
エクセルVBA 10分後にエクセル...
-
グループ単位での表示?
-
serial型について
-
オラクルのUPDATEで複数テーブル
-
テーブル定義書(Oracle) 【IX】...
-
VBAでの行数を揃える方法
-
SQLサーバに対するSQL文で抽出...
-
UPDATEで既存のレコードに文字...
-
Accessの構成をコピーしたい
-
データベース ユーザの「このユ...
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
UPDATEの更新前の値を取得したい
-
複数の条件に該当する結果を、...
-
SELECTした結果に行番号を求めたい
-
データの入れ替えを同時に行な...
-
ダブリ数字の有無の確認にのマ...
-
プログラムよりファンクション...
-
PLPGSQLでの複数行複数列
-
副問合せで複数列の値リストの...
-
Pro*CでのSQL文について
-
where notにつて
-
パターンマッチング
-
SQLで小数点の計算がしたいです。
-
oleDBでnumeric形式の小数部分...
-
FETCH した行が取り出せない
-
複数カラムでdistinct
-
テーブル間の差分抽出方法は?...
-
SQLで任意の列の最大値の定数は...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
おすすめ情報