functionの戻り値を複数取得する方法をご教示ください。
メインのfunctionからサブのfunctionを呼び出しています。
サブ内でテーブルをselectした結果をメインに返却します。
調べたところ、戻り値の型はrecord型、テーブル型が使えそうでしたので、テーブル型で返却しています。
返却値をメインで取得することはできましたが、返却値を単一項目に分解して取得できません。
サブには主キーを全て渡すため、単一レコードが返却されます。
<質問事項>
1:メインで「テーブル名.項目名」の形で取得することは可能でしょうか。
2:サブで単一行にもかかわらずloopをかけることに違和感を感じます。
3:サブの戻り値のrecord型、テーブル型の違いがよくわかりません。
作成中のモジュールは以下の通りです。
//データを取得するテーブル CREATE TABLE manager ( id text, first_name text, age numeric, tel text ); INSERT INTO manager (id, first_name, age, tel) VALUES ('1', '名字', 30, '090-9999-9999'); //データを登録するテーブル CREATE TABLE test ( test1 text, test2 text, test_num numeric, test4 text );
- メインのファンクション
PL/pgSQL
1CREATE OR REPLACE FUNCTION fnc_main(id text) 2 RETURNS character varying 3 LANGUAGE plpgsql 4AS $function$ 5 6declare 7 8 manager record; 9 tmp_manager manager%rowtype; 10 11begin 12 13-- 1:getmanagerの戻り値全てを取得できるが、1カラムにまとまってしまう 14-- 取得値:("(1,名字,30)") 15select getmanager(id) into manager; 16insert into test values(manager,null,null,null); 17 18-- 2:項目ごとに値を取得できるが、項目数分selectを書く必要がある? 19select (getmanager(id)).out_id into manager; 20insert into test values(manager.out_id,null,null,null); 21 22-- 3:1と同じ 23select getmanager(id) into tmp_manager; 24insert into test values(tmp_manager,null,null,null); 25 26-- 4:エラー「record "tmp_manager" has no field "out_name"」 27--select (getmanager(id)).out_name into tmp_manager; 28--insert into test values(tmp_manager.out_name,null,null,null); 29 30return ''; 31end; 32 33$function$ 34
- サブのファンクション
PL/pgsql
1CREATE OR REPLACE FUNCTION getmanager(p_id text) 2 RETURNS TABLE(out_id character varying, out_name character varying, out_age numeric) 3 LANGUAGE plpgsql 4 STRICT 5AS $function$ 6 7declare 8 rec record; 9 10BEGIN 11 12-- テスト用に簡略しています。joinやwhereを複数使用予定です 13 For rec IN SELECT id, first_name, age FROM manager 14 Loop 15 out_id = rec.id; 16 out_name = rec.first_name; 17 out_age = rec.age; 18 19 return next; 20 End Loop; 21 return; 22 23END; 24 25$function$ 26
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/08/01 05:25
2021/08/01 05:41 編集
退会済みユーザー
2021/08/01 06:10
2021/08/01 06:28
退会済みユーザー
2021/08/01 06:32