![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_03.png?e8efa67)
こんにちは
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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- 英語 私の車は、購入してから7年目になるが、これまでに車検を3回受けた。の英訳 11 2022/06/13 03:39
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 英語 現在完了の「継続」ではなく「経験」の期間を表す前置詞について 2 2022/05/06 11:39
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
SELECTした結果に行番号を求めたい
-
UPDATEの更新前の値を取得したい
-
where notにつて
-
複数の条件に該当する結果を、...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
joinの場合のテーブル名の別名...
-
既存データをINSERT文にして出...
-
2つのテーブルをLIKE演算子のよ...
-
group byで指定したカラム以外...
-
テーブル定義書(Oracle) 【IX】...
-
オラクルのUPDATEで複数テーブル
-
次の時間帯の勝率の合計を求め...
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
JDBCを使ってdate型へのINSERT...
-
【VB】セルが空になるまで処理...
-
MySQLで数字の値のもののみを取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT INTOで一度に複数の変数...
-
SELECTした結果に行番号を求めたい
-
複数の条件に該当する結果を、...
-
データの入れ替えを同時に行な...
-
UPDATEの更新前の値を取得したい
-
テーブル間の差分抽出方法は?...
-
副問合せで複数列の値リストの...
-
この切り絵の元絵あれば下さい…!
-
SQL 表の結合
-
SQLで任意の列の最大値の定数は...
-
ダブリ数字の有無の確認にのマ...
-
SQLで小数点の計算がしたいです。
-
FETCH した行が取り出せない
-
pg/plsqlでのカーソルのLIK...
-
PLPGSQLでの複数行複数列
-
複数カラムでdistinct
-
数値を単一引用符で囲むのはど...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
おすすめ情報