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

質問編集履歴

4

内容の編集

2021/08/10 11:51

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -53,7 +53,7 @@
53
53
  open cur_manager;
54
54
  fetch cur_manager into rec_manager;
55
55
  loop
56
- --値の入力チェックや編集を行う
56
+ --値の入力チェックや編集を行う(15項目)
57
57
  --項目の入力チェックは省略しています
58
58
  --値をセット
59
59
  tmp_test.test1 = rec_manager.first_name;

3

チェックや編集内容を更新

2021/08/10 11:51

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -45,6 +45,8 @@
45
45
  rec_manager record;
46
46
  tmp_test test%rowtype;
47
47
  rec_test record;
48
+ fnc_return text;
49
+ err_msg text;
48
50
 
49
51
  begin
50
52
 
@@ -58,13 +60,16 @@
58
60
  if rec_manager.id = 1 then
59
61
  tmp_test.test_num = rec_manager.age;
60
62
  -- 別functionで年齢から西暦等を取得する処理
61
- -- select fnc_get_seireki(rec_manager.age) into tmp_test.test4;
63
+ -- select fnc_get_seireki(rec_manager.age) into fnc_return;
64
+
65
+ --エラーが発生している場合
66
+ if fnc_return = 'true' then
67
+ err_msg = '西暦が取得できません';
68
+ else
69
+ tmp_test.test2 = fnc_return;
62
70
  end if;
63
71
  --...
64
72
 
65
-
66
-
67
-
68
73
  // rec_test = tmp_test; --恐らくエラーが発生している
69
74
  end loop;
70
75
 

2

文法の修正

2021/08/10 11:50

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -29,12 +29,13 @@
29
29
  );
30
30
  ```
31
31
  ```Postgres
32
- CREATE OR REPLACE FUNCTION fnc_main(id text)
32
+ CREATE OR REPLACE FUNCTION fnc_main(user_id text)
33
33
  RETURNS character varying
34
34
  LANGUAGE plpgsql
35
35
  AS $function$
36
36
  declare
37
37
 
38
+ -- データが30万件ほどある
38
39
  cur_manager cursor is
39
40
  select
40
41
  first_name
@@ -50,14 +51,24 @@
50
51
  open cur_manager;
51
52
  fetch cur_manager into rec_manager;
52
53
  loop
54
+ --値の入力チェックや編集を行う
53
- --項目の入力チェックは省略しています
55
+ --項目の入力チェックは省略しています
54
56
  --値をセット
55
57
  tmp_test.test1 = rec_manager.first_name;
58
+ if rec_manager.id = 1 then
59
+ tmp_test.test_num = rec_manager.age;
60
+ -- 別functionで年齢から西暦等を取得する処理
61
+ -- select fnc_get_seireki(rec_manager.age) into tmp_test.test4;
62
+ end if;
56
63
  --...
64
+
65
+
66
+
67
+
57
- rec_test = tmp_test;
68
+ // rec_test = tmp_test; --恐らくエラーが発生している
58
69
  end loop;
59
70
 
60
- insert into test values(rec_test);
71
+ //insert into test values(rec_test); --恐らくエラーが発生している
61
72
 
62
73
  return '';
63
74
  end;

1

誤字を修正しました。

2021/08/10 11:32

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  <実装したい背景>30万件ほどのデータのselectをカーソルにて行い、loop内で1件ずつinsertしたところ、タイムアウトしてしまったためです。insert文を大量に発行していることが原因だと考えています。
4
4
  また、複雑なチェック処理やデータの加工を行っている関係上、insert前に1件ずつの処理が必要です。
5
- そのため、「insert ~ select into~」で一括インサートが難しい状況です。
5
+ そのため、「insert ~ select」で一括インサートが難しい状況です。
6
6
 
7
7
  <試したこと>
8
8
  Oracleのバルクインサートのようなものが使えないかと考えましたが、