回答編集履歴

5

推敲

2018/09/06 13:44

投稿

sazi
sazi

スコア25302

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  ```
86
86
 
87
- ※戻り値がrecordの場合利用する側で項目名を指定する必要があるので面倒です。
87
+ ※戻り値の型がrecordの場合利用する側で項目名を指定する必要があるので面倒です。
88
88
 
89
89
  ```SQL
90
90
 

4

追記

2018/09/06 13:44

投稿

sazi
sazi

スコア25302

test CHANGED
@@ -33,3 +33,63 @@
33
33
 
34
34
 
35
35
  結論としては、記述は変更せざるをえないという事です。
36
+
37
+ 追記
38
+
39
+ --
40
+
41
+ postgresのストアドの戻りは、単一行であったり複数行であったりはしますが、表だと考えて下さい。
42
+
43
+ SQL内で使用するものなので、そういった考えです。
44
+
45
+ functionの異常はSQLSTATEで判断するようにします。
46
+
47
+ ストアド内で`raise`により例外を発生させ([40.8. エラーとメッセージ](https://www.postgresql.jp/document/9.4/html/plpgsql-errors-and-messages.html))
48
+
49
+ 呼び出し元でSQLSTATEによる判定を行うようにします。
50
+
51
+
52
+
53
+ 最終的にはレコードセットを返却するという事なので、参考までに
54
+
55
+ ```SQL
56
+
57
+ create or replace function sample(
58
+
59
+  i_prm in varchar
60
+
61
+ )
62
+
63
+ returns setof record as
64
+
65
+ $$
66
+
67
+ declare
68
+
69
+ begin
70
+
71
+ if ??? then
72
+
73
+ raise SQLSTATE '99999';
74
+
75
+ return;
76
+
77
+ end if;
78
+
79
+ return query select a,b,c from xxx where yyy=i_prm ;
80
+
81
+ end;
82
+
83
+ $$ language plpgsql;
84
+
85
+ ```
86
+
87
+ ※戻り値がrecordの場合利用する側で項目名を指定する必要があるので面倒です。
88
+
89
+ ```SQL
90
+
91
+ select * from sample('para') as xxx(a,b,c)
92
+
93
+ ```
94
+
95
+ typeを定義してrecordの代わりに指定すると、テーブルをselectするのと変わりがありません

3

修正

2018/09/06 13:41

投稿

sazi
sazi

スコア25302

test CHANGED
@@ -32,38 +32,4 @@
32
32
 
33
33
 
34
34
 
35
- エラーにならない記述は、以下のようになります。
36
-
37
- ```SQL
38
-
39
- create or replace function sample(
40
-
41
- i_prm in varchar,
42
-
43
- o_rs out varchar,
44
-
45
- c_ok out varchar
46
-
47
- )
48
-
49
- returns record as
50
-
51
- $$
52
-
53
- declare
54
-
55
- begin
56
-
57
- o_rs := '最終的にはここをレコードセットにしたい';
58
-
59
- c_ok := 'ok'
60
-
61
- return;
62
-
63
- end;
64
-
65
- $$ language plpgsql;
66
-
67
- ```
68
-
69
35
  結論としては、記述は変更せざるをえないという事です。

2

追記

2018/09/06 12:56

投稿

sazi
sazi

スコア25302

test CHANGED
@@ -65,3 +65,5 @@
65
65
  $$ language plpgsql;
66
66
 
67
67
  ```
68
+
69
+ 結論としては、記述は変更せざるをえないという事です。

1

推敲

2018/09/06 12:55

投稿

sazi
sazi

スコア25302

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  `returns varchar` と指定した場合は、戻り値は単一の項目でなければなりません。
28
28
 
29
- 複数項目の戻り値がある場合の`returns`の型は`record`です。
29
+ 複数項目の戻り値がある場合の`returns`の型は`record`です。(独自のtypeも指定できます)
30
30
 
31
31
  なので「**型が違う**」というエラーなのです。
32
32