
pl/pgsqlで再帰呼び出しは可能でしょうか。
PostgreSQLのバージョンは9.2.3です。
作成しているファンクションは正方形の中心座標を求めてInsertするものです。
指定した回数だけ、再帰的に正方形を4分割にどんどん細分化していき、
それぞれの正方形の中心座標をInsertします。
4分割にした正方形をそれぞれ以下のように番号を振って説明します。
左上・・・(1)
右上・・・(2)
左下・・・(3)
右下・・・(4)
元の正方形を求めた後、(1)→(2)→(3)→(4)の順に再帰的にファンクションを呼び出します。
パラメータを「3回」以上にした場合は、(1)についてもまた4分割していきます。
ここで、パラメータを「1回」とした場合は、元の正方形の中心座標は当然Insertできます。
パラメータを「2回」とした場合、(1)の正方形の中心座標も求まりますが、
(1)の正方形については再帰の最終処理のため、Insert後にRETURNすることで
エラーとなっているのか、1つ目の正方形のレコードも(2)の正方形のレコードも
Insertされていません。
さらにはその「RETURN句」が元のファンクションすら「終了」させているようで、
(2)、(3)、(4)の正方形の処理が行われません。
このように再帰呼び出しをしたいと思っても、再帰中の処理を終わらせ、
呼び出し元に戻らせるはずのRETURN句が、一番最初のファンクションの「終了」と
理解されてしまい、pl/pgsqlでは再帰呼び出しは実現できないのでしょうか。
ファンクションのイメージは以下の通りです。
CREATE OR REPLACE FUNCTION Insert_squre(
IN kaisuu INT, --再帰的に呼び出す回数
IN count INT, --再帰回数をカウント
IN X1 INT, --正方形の左上の頂点のX座標
IN Y1 INT, --正方形の左上の頂点のY座標
IN X2 INT, --正方形の右下の頂点のX座標
IN Y2 INT --正方形の右下の頂点のY座標
)
RETURNS void AS $$
DECLARE
/* 変数定義 */
・・・・・
BEGIN
/* 中心座標を求める */
・・・・・
/* 中心座標をInsert */
・・・・・
/* kaisuu=countならばRETURN */
・・・・・
/* (1)の正方形について再帰処理 */
select Insert_squre(
IN kaisuu INT, --再帰的に呼び出す回数
IN count+1 INT, --再帰回数をカウント
IN X1 INT, --正方形の左上の頂点のX座標
IN Y1 INT, --正方形の左上の頂点のY座標
IN X3 INT, --正方形の右下の頂点のX座標
IN Y3 INT --正方形の右下の頂点のY座標
);
/* (2)の正方形について再帰処理 */
・・・・・
/* (3)の正方形について再帰処理 */
・・・・・
/* (4)の正方形について再帰処理 */
・・・・・
RETURN;
END;
$$ LANGUAGE PLpgSQL;
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
関数の呼び出し方に問題があります。
関数の呼び出し時には IN / OUT パラメータやデータ型の指定は不要です。/* (1)の正方形について再帰処理 */
SELECT insert_square(kaisuu, count + 1, x1, y1, x3, y3);
などと書き換えるとどうなるでしょうか。(2) ~ (4) についても同様です。
また、エラーメッセージが出力されていれば、提供してもらったほうが回答しやすいです。
あと、PostgreSQL には幾何データ型や幾何関数があるので、それらを使ったほうが関数をシンプルにできると思います。例えば、中心の座標を求めるcenterといった関数もあります。
参考URL:http://www.postgresql.jp/document/9.2/html/funct …
この回答への補足
ご回答ありがとうございます!
>関数の呼び出し方に問題があります。
>関数の呼び出し時には IN / OUT パラメータやデータ型の指定は不要です。
すみません、私の記載ミスで、再帰呼び出しの箇所にIN/OUT及びデータ型は記載していません。
>また、エラーメッセージが出力されていれば、提供してもらったほうが回答しやすいです。
初歩的な質問で申し訳ないのですが、標準出力には何も出力されません。
エラーとなっていることは確かなのですが、メッセージはどうすれば確認できますでしょうか。
>あと、PostgreSQL には幾何データ型や幾何関数があるので
そうなんですね。教えて頂きありがとうございます!参考になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 中学校 中1数学 比例のグラフの座標の読み取り 4 2023/03/28 12:26
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- 数学 数学B 正四面体の第4の頂点 3 2022/06/06 08:40
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- 数学 ある傾いた長方形の2点の座標を求める 4 2022/10/29 12:17
- 数学 数学1の問題がわかりません。 次の関数において、頂点の座標と、[]内のxの値に対するyの値を求めよ。 3 2023/02/13 00:36
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで最新のレコード...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
SQLサーバに対するSQL文で抽出...
-
CSVファイルを読み込んでテーブ...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
timestampのデータはどのように...
-
accessのデータをoracleへinser...
-
sqlに記述できない文字
-
同一テーブル内での比較(最新...
-
オラクルのUPDATEで複数テーブル
-
selectの単純繰り返し
-
PostgreSQL serial型の質問
-
データ削除とSQL*Loaderでのイ...
-
ACCESSのVBAにてExcelに行...
-
データ無し時は空白行にしたい...
-
oracle ora-02298
-
MySQLで数字の値のもののみを取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クエリ式でDcount の代わりは?
-
Accessで最新のレコード...
-
SELECTした結果をSELECTしたい!
-
SQLについて教えてください
-
年、月、日を取得する関数
-
SQL Server 2000 を使用してい...
-
データベースと連動したツリー表示
-
pl/pgsqlで再帰呼び出しは可能...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
PostgreSQLのtimestamp型で時間...
-
オラクルのUPDATEで複数テーブル
-
SQLをExcelで書いている人を良...
-
SQLで、Join句で結合したテ...
-
Accessの構成をコピーしたい
-
既存データをINSERT文にして出...
おすすめ情報