質問編集履歴

5

2022/01/18 14:21

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 引数を使用したviewの動的作成でエラーが発生します
1
+ viewの作成でエラーが発生します
test CHANGED
@@ -1,239 +1,118 @@
1
- function内で、引数を使ったviewを作成したいのですが、エラーが出てしまいます。
1
+ function内で、viewを作成したいのですが、エラーが出てしまいます。
2
-
3
- view作成時に引数は使用できないのでしょうか?
4
-
5
-
6
-
7
-
8
2
 
9
3
  呼び出し元から渡される引数からviewを作成することは必須ですが、
10
-
11
4
  functionの利用は必須ではありません。
12
5
 
13
-
14
-
15
6
  試したことは以下の通りです。
16
-
17
7
  ①viewの作成時に引数を使用。
18
-
19
8
  ②execute formatを使用。
20
-
21
9
  ③return queryでデータを取得し、取得したデータをもとにviewを作成。
22
10
 
23
11
 
24
-
25
-
26
-
27
12
  ソースは以下の通りです。
28
-
29
13
  ```ここに言語を入力
30
-
31
14
  --①〜③共通
32
-
33
15
  --データを取得するテーブル
34
-
35
16
  create table test(
36
-
37
17
  test_id numeric,
38
-
39
18
  test_name text,
40
-
41
19
  test_target date
42
-
43
20
  );
44
21
 
45
-
46
-
47
22
  insert into test values(1,'target',cast('2022/01/01' as date));
48
-
49
23
  insert into test values(2,'not_target',cast('2022/01/31' as date));
50
-
51
24
  ```
52
25
 
53
-
54
-
55
26
  --①の処理を行うfunction
56
-
57
27
  ```ここに言語を入力
58
-
59
28
  CREATE OR REPLACE FUNCTION fnc_main(p_date date)
60
-
61
29
  RETURNS integer
62
-
63
30
  LANGUAGE plpgsql
64
-
65
31
  AS $function$
66
-
67
-
68
32
 
69
33
  declare
70
34
 
71
-
72
-
73
35
  begin
74
-
75
36
  create or replace view view_test as
76
-
77
37
  select test_id,test_name
78
-
79
38
  from test
80
-
81
39
  where test_target = p_date;
82
40
 
83
-
84
-
85
41
    return 0;
86
-
87
42
  end;
88
43
 
89
44
 
90
-
91
-
92
-
93
45
  /** select fnc_main(cast('2022/01/01' as date)) を
94
-
95
46
  実行すると下記エラー
96
-
97
47
  Query 1 ERROR: ERROR: column "p_date" does not exist
98
-
99
48
  LINE 4: where test_target = p_date
100
-
101
49
  ^
102
-
103
50
  QUERY: create or replace view view_test as
104
-
105
51
  select test_id,test_name
106
-
107
52
  from test
108
-
109
53
  where test_target = p_date
110
-
111
54
  CONTEXT: PL/pgSQL function fnc_main(date) line 8 at SQL statement
112
-
113
55
  **//
114
56
 
115
57
 
58
+ $function$
59
+ ```
60
+ --②の処理を行うfunction
61
+ ```ここに言語を入力
62
+ CREATE OR REPLACE FUNCTION fnc_main2(p_date date)
63
+ RETURNS integer
64
+ LANGUAGE plpgsql
65
+ AS $function$
66
+
67
+ declare
68
+
69
+ begin
70
+ execute format(
71
+ 'create or replace view view_test as'
72
+ ' select test_id,test_name'
73
+ ' from test'
74
+ ' where test_target = $1')
75
+ using p_date;
76
+
77
+ return 0;
116
78
 
117
79
 
80
+ /** select fnc_main2(cast('2022/01/01' as date)) を
81
+ 実行すると下記エラー
82
+ Query 1 ERROR: ERROR: there is no parameter $1
83
+ LINE 1: ...as select test_id,test_name from test where test_target = $1
84
+ ^
85
+ QUERY: create or replace view view_test as select test_id,test_name from test where test_target = $1
86
+ CONTEXT: PL/pgSQL function fnc_main3(date) line 7 at EXECUTE
87
+ **//
88
+
89
+ end;
118
90
 
119
91
  $function$
120
92
 
121
93
  ```
122
94
 
123
- --の処理を行うfunction
95
+ --の処理を行うfunction
124
-
125
96
  ```ここに言語を入力
126
-
127
- CREATE OR REPLACE FUNCTION fnc_main2(p_date date)
97
+ CREATE OR REPLACE FUNCTION fnc_main3(p_date date)
128
-
129
- RETURNS integer
98
+ RETURNS table(out_test_id numeric, out_test_name text)
130
-
131
99
  LANGUAGE plpgsql
132
-
133
100
  AS $function$
134
-
135
-
136
101
 
137
102
  declare
138
103
 
139
-
140
-
141
104
  begin
142
105
 
143
- execute format(
106
+ return query(
107
+ select test_id,test_name
108
+ from test
109
+ where test_target = p_date);
144
110
 
145
- 'create or replace view view_test as'
146
-
147
- ' select test_id,test_name'
148
-
149
- ' from test'
150
-
151
- ' where test_target = $1')
152
-
153
- using p_date;
154
-
155
-
156
-
157
- return 0;
158
-
159
-
160
-
161
-
162
-
163
- /** select fnc_main2(cast('2022/01/01' as date)) を
111
+ /** select fnc_main3(cast('2022/01/01' as date)) を
164
-
165
- 実行すると下記エラー
166
-
167
- Query 1 ERROR: ERROR: there is no parameter $1
168
-
169
- LINE 1: ...as select test_id,test_name from test where test_target = $1
170
-
171
- ^
172
-
173
- QUERY: create or replace view view_test as select test_id,test_name from test where test_target = $1
174
-
175
- CONTEXT: PL/pgSQL function fnc_main3(date) line 7 at EXECUTE
112
+ データは取得できるけれど、呼び出し元(function)で、returnされたデータからviewを作成できないのではないか?
176
-
177
113
  **//
178
-
179
-
180
114
 
181
115
  end;
182
116
 
183
-
184
-
185
117
  $function$
186
-
187
-
188
-
189
118
  ```
190
-
191
-
192
-
193
- --③の処理を行うfunction
194
-
195
- ```ここに言語を入力
196
-
197
- CREATE OR REPLACE FUNCTION fnc_main3(p_date date)
198
-
199
- RETURNS table(out_test_id numeric, out_test_name text)
200
-
201
- LANGUAGE plpgsql
202
-
203
- AS $function$
204
-
205
-
206
-
207
- declare
208
-
209
-
210
-
211
- begin
212
-
213
-
214
-
215
- return query(
216
-
217
- select test_id,test_name
218
-
219
- from test
220
-
221
- where test_target = p_date);
222
-
223
-
224
-
225
- /** select fnc_main3(cast('2022/01/01' as date)) を
226
-
227
- データは取得できるけれど、呼び出し元(function)で、returnされたデータからviewを作成できないのではないか?
228
-
229
- **//
230
-
231
-
232
-
233
- end;
234
-
235
-
236
-
237
- $function$
238
-
239
- ```

4

2022/01/07 08:55

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
 
6
6
 
7
+
8
+
7
9
  呼び出し元から渡される引数からviewを作成することは必須ですが、
8
10
 
9
11
  functionの利用は必須ではありません。

3

誤字

2022/01/07 08:55

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 引数を使用したviewの動的作成方法
1
+ 引数を使用したviewの動的作成でエラーが発生します
test CHANGED
File without changes

2

誤字

2022/01/07 00:49

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- viewの動的作成方法
1
+ 引数を使用したviewの動的作成方法
test CHANGED
File without changes

1

誤字

2022/01/07 00:48

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -192,7 +192,7 @@
192
192
 
193
193
  ```ここに言語を入力
194
194
 
195
- CREATE OR REPLACE FUNCTION fnc_main2(p_date date)
195
+ CREATE OR REPLACE FUNCTION fnc_main3(p_date date)
196
196
 
197
197
  RETURNS table(out_test_id numeric, out_test_name text)
198
198