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

回答編集履歴

2

追加

2016/10/19 04:38

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -60,3 +60,31 @@
60
60
  select test_sp_func9('上田一郎');
61
61
  ```
62
62
 
63
+ SqlServerも作成しました。久々で自信はありませんが、動く様です。
64
+
65
+ ```
66
+ WITH EMP_CTE(id, jyoshi, buka)
67
+ AS
68
+ (
69
+ SELECT
70
+ id,
71
+ jyoshi,
72
+ buka
73
+ FROM
74
+ testAA
75
+ WHERE jyoshi = '上田一郎'
76
+
77
+ UNION ALL
78
+
79
+ SELECT
80
+ testAA.id,
81
+ testAA.jyoshi,
82
+ testAA.buka
83
+ FROM
84
+ testAA
85
+ INNER JOIN EMP_CTE
86
+ ON testAA.jyoshi = EMP_CTE.buka
87
+ )
88
+ --
89
+ DELETE FROM testAA WHERE id in (SELECT id FROM EMP_CTE);
90
+ ```

1

追加

2016/10/19 04:38

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -33,4 +33,30 @@
33
33
  #実行
34
34
  set max_sp_recursion_depth=12;
35
35
  CALL sample03 ('上田一郎');
36
- ```
36
+ ```
37
+
38
+
39
+ postgresでも作成してみました。指定された上司のレコードから、上司部下の関係のテーブルを最深階層(部下がいない)までを読み、そこから逆に上に戻りながら削除を行う動きとなります。
40
+
41
+ ```postgres
42
+ #ストアド
43
+ CREATE OR REPLACE FUNCTION test_sp_func9(in_name TEXT)
44
+ RETURNS INT AS $$
45
+
46
+ DECLARE rc tableA%rowtype;
47
+ DECLARE _ret int;
48
+ BEGIN
49
+
50
+ FOR rc IN SELECT * FROM tableA WHERE joshi=in_name LOOP
51
+ SELECT test_sp_func9 (rc.buka) INTO _ret;
52
+ DELETE FROM tableA WHERE joshi=rc.joshi AND buka=rc.buka;
53
+ END LOOP;
54
+ RETURN 0;
55
+
56
+ END;
57
+ $$ LANGUAGE plpgsql;
58
+
59
+ #実行
60
+ select test_sp_func9('上田一郎');
61
+ ```
62
+