質問するログイン新規登録

回答編集履歴

5

推敲

2018/09/06 13:44

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  end;
42
42
  $$ language plpgsql;
43
43
  ```
44
- ※戻り値がrecordの場合利用する側で項目名を指定する必要があるので面倒です。
44
+ ※戻り値の型がrecordの場合利用する側で項目名を指定する必要があるので面倒です。
45
45
  ```SQL
46
46
  select * from sample('para') as xxx(a,b,c)
47
47
  ```

4

追記

2018/09/06 13:44

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -15,4 +15,34 @@
15
15
  複数項目の戻り値がある場合の`returns`の型は`record`です。(独自のtypeも指定できます)
16
16
  なので「**型が違う**」というエラーなのです。
17
17
 
18
- 結論としては、記述は変更せざるをえないという事です。
18
+ 結論としては、記述は変更せざるをえないという事です。
19
+ 追記
20
+ --
21
+ postgresのストアドの戻りは、単一行であったり複数行であったりはしますが、表だと考えて下さい。
22
+ SQL内で使用するものなので、そういった考えです。
23
+ functionの異常はSQLSTATEで判断するようにします。
24
+ ストアド内で`raise`により例外を発生させ([40.8. エラーとメッセージ](https://www.postgresql.jp/document/9.4/html/plpgsql-errors-and-messages.html))
25
+ 呼び出し元でSQLSTATEによる判定を行うようにします。
26
+
27
+ 最終的にはレコードセットを返却するという事なので、参考までに
28
+ ```SQL
29
+ create or replace function sample(
30
+  i_prm in varchar
31
+ )
32
+ returns setof record as
33
+ $$
34
+ declare
35
+ begin
36
+ if ??? then
37
+ raise SQLSTATE '99999';
38
+ return;
39
+ end if;
40
+ return query select a,b,c from xxx where yyy=i_prm ;
41
+ end;
42
+ $$ language plpgsql;
43
+ ```
44
+ ※戻り値がrecordの場合利用する側で項目名を指定する必要があるので面倒です。
45
+ ```SQL
46
+ select * from sample('para') as xxx(a,b,c)
47
+ ```
48
+ typeを定義してrecordの代わりに指定すると、テーブルをselectするのと変わりがありません

3

修正

2018/09/06 13:41

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -15,21 +15,4 @@
15
15
  複数項目の戻り値がある場合の`returns`の型は`record`です。(独自のtypeも指定できます)
16
16
  なので「**型が違う**」というエラーなのです。
17
17
 
18
- エラーにならない記述は、以下のようになります。
19
- ```SQL
20
- create or replace function sample(
21
- i_prm in varchar,
22
- o_rs out varchar,
23
- c_ok out varchar
24
- )
25
- returns record as
26
- $$
27
- declare
28
- begin
29
- o_rs := '最終的にはここをレコードセットにしたい';
30
- c_ok := 'ok'
31
- return;
32
- end;
33
- $$ language plpgsql;
34
- ```
35
18
  結論としては、記述は変更せざるをえないという事です。

2

追記

2018/09/06 12:56

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -31,4 +31,5 @@
31
31
  return;
32
32
  end;
33
33
  $$ language plpgsql;
34
- ```
34
+ ```
35
+ 結論としては、記述は変更せざるをえないという事です。

1

推敲

2018/09/06 12:55

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  どういうことかと言うと、`returns`で指定するのは**戻り値の型**です。
14
14
  `returns varchar` と指定した場合は、戻り値は単一の項目でなければなりません。
15
- 複数項目の戻り値がある場合の`returns`の型は`record`です。
15
+ 複数項目の戻り値がある場合の`returns`の型は`record`です。(独自のtypeも指定できます)
16
16
  なので「**型が違う**」というエラーなのです。
17
17
 
18
18
  エラーにならない記述は、以下のようになります。