質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

4078閲覧

PL/pgSQLでクエリで返した戻り値を参照したい

L.J

総合スコア2

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/11/02 06:09

前提・実現したいこと

SQLファイル内でファンクションを実行し、複数行(クエリ)で帰ってくる戻り値をそれぞれ参照したい。

■ファイル構成
. D:\SQLTEST
.  ├ POWERSHELL
.  │ └ TEST.ps1
.  └ SQL
.   └ TEST.sql

該当のソースコード

FUNCTION

1CREATE OR REPLACE FUNCTION test_function() 2RETURNS SETOF CHARACTER VARYING 3AS $$ 4DECLARE 5 return_cd varchar; 6 return_text1 varchar; 7 8BEGIN 9 -- 変数初期化 10 return_cd := '0'; 11 return_text1 := ''; 12 13 SELECT test_col INTO col1 FROM test_tab; 14 15 IF return_cd = '0' 16 THEN 17 return_text1 := '正常終了'; 18 RETURN QUERY VALUES (return_cd),(return_text1); 19 END IF; 20 21EXCEPTION 22 WHEN OTHERS THEN 23 return_cd := '1'; 24 return_text1 := '異常終了'; 25 RETURN QUERY VALUES (return_cd),(return_text1); 26 27END; 28$$ 29LANGUAGE 'PLPGSQL'; 30

まず、FUNCTIONでは、上記のように正常終了・異常終了にかかわらず戻り値をクエリで設定しています。

■実行結果(正常終了)

1 | 0
2 | 正常終了

■実行結果(異常終了)

1 | 1
2 | 異常終了

PSQL

1DO $$ 2DECLARE 3 wk_return_cd varchar; 4 wk_return_text1 varchar; 5 6BEGIN 7 select * from test_function() 8 into wk_return_cd, wk_return_text1; -- ここがまず上手くいかない 9 10 IF wk_return_cd = '1' 11 THEN 12 -- なんらかのエラーを記述 13 END IF; 14 15END $$; 16

そして、ファンクションの予備元であるPSQL側で、ファンクションの実行結果を参照して、
return_cdが 1 なら エラー、としたいのですが、
まず into でそれぞれ変数に入れることができません。
(戻り値が 複数列ではなく複数行のため、だと思います)

実行結果の欄にあるとおり、複数行で戻り値が返ってくるため、intoがうまく動かないのですが
なにか解決策はありますでしょうか。

ご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

別に複数行返す必要は無いのではないですか。

SQL

1CREATE OR REPLACE FUNCTION test_function() 2RETURNS CHARACTER VARYING[] 3AS $$ 4DECLARE 5BEGIN 6 SELECT test_col INTO col1 FROM test_tab; 7 RETURN array['0', '正常終了']::CHARACTER VARYING[]; 8 9EXCEPTION 10 WHEN OTHERS THEN 11 RETURN array['1', '異常終了']::CHARACTER VARYING[]; 12END; 13$$ 14LANGUAGE 'plpgsql';

SQL

1DO $$ 2DECLARE 3 wk_return_cd varchar; 4 wk_return_text1 varchar; 5 6BEGIN 7 select result[1], result[2] from test_function() as tf(result) 8 into wk_return_cd, wk_return_text1; -- ここがまず上手くいかない 9 10 IF wk_return_cd = '1' 11 THEN 12 -- なんらかのエラーを記述 13 END IF; 14 15END $$;

投稿2021/11/02 07:24

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L.J

2021/11/02 08:01

ご回答いただきありがとうございます。 なるほど、複数行ではなく配列で戻り値を設定するということですね。 実際に手元の環境で試してみて、実現したい通りの動きになることが確認できました。 PostgreSQLに不慣れなため、質問の意図がわかりにくかったかもしれませんが、とても助かりました。 ありがとうございました!
sazi

2021/11/02 08:15 編集

function の戻り値がsetofの場合、受け取る場合にはFetchが必要になりますので、質問の内容からは配列の方が扱いやすいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問