回答編集履歴
2
追加
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
追加
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
|
+
|