編寫儲存過程將異常節點移動到新建的乙個節點下

2021-09-02 02:19:37 字數 3438 閱讀 5822

-- 在處理之前,新節點的相關資訊已經插入到表中了

-- v_normal_node_res_id: 唯一正常的節點的res_id

-- v_new_node_res_id: 新建的節點的res_id

-- 功能:將異常節點及其子節點移動到新建的乙個節點,作為其子節點

-- 注意:需要獲取新節點的級別,比如說為3

--則需要做的操作如下:

/*(1)找到需要更新的記錄

a.排除正常節點及其子節點 特點:res_tree_level3_id=v_normal_node_res_id

b.排除新節點 特點:res_tree_level3_id=v_new_node_res_id

c.排除一二級節點 特點:res_tree_level3_id=0

(2)更新記錄:需要更新哪些字段(以下是針對需要更新的節點)

a.對於與新節點同級別的節點,需要將其parent_res_id設定為新節點的res_id

b.對於所有節點,需要更新

設定res_level:= res_level + 1;

res_tree_level3_id := 新節點的res_id

res_tree_level4_id :=res_tree_level3_id

res_tree_level5_id :=res_tree_level4_id

。。。res_tree_level12_id:=res_tree_level1_id

直到該節點的res_level,都要進行更新

實際的寫**的時候,需要逆序複製,否則值會被覆蓋

*/create or replace function func_move_abnormal_node_to_new_node(v_normal_node_res_id imos_id, v_new_node_res_id imos_id)

returns integer

as$body$

declare

v_rec_tbl_res record; -- 儲存當前節點資訊

v_current_node_res_id imos_id; -- 當前節點res_id

v_current_node_res_level int32; -- 當前節點res_level

v_tmp_counter int:=0; -- 計數器

v_str_sql_cmd text; -- 暫存動態sql

v_str_cmd text; -- 暫存動態sql

v_int_level_of_new_node int:=0; -- 新節點的級別,也等於正常節點的級別

v_rec record;

begin

select res_level into v_int_level_of_new_node from tbl_res where res_id=v_new_node_res_id; -- 獲取新節點的級別res_level==正常節點的級別

v_str_cmd = 'select res_id, res_level from tbl_res ';

v_str_cmd = v_str_cmd || ' where res_tree_level'||v_int_level_of_new_node||'_id <> ' || v_normal_node_res_id ; --去除正常節點及其子節點

v_str_cmd = v_str_cmd || ' and res_tree_level' ||v_int_level_of_new_node||'_id <> 0 '; --去除一級、二..v_int_level_of_new_node-1級節點

v_str_cmd = v_str_cmd || ' and res_tree_level' ||v_int_level_of_new_node||'_id <> ' || v_new_node_res_id ; --去除新上任的v_int_level_of_new_node級節點

--修改parent_res_id

for v_rec in (select res_id from tbl_res where res_level=v_int_level_of_new_node and res_id<>v_new_node_res_id and res_id <> v_normal_node_res_id )

loop

update tbl_res set parent_res_id=v_new_node_res_id where res_id=v_rec.res_id;

end loop;

-- 獲取哪些記錄需要進行處理

for v_rec_tbl_res in execute v_str_cmd

loop

-- 獲取當前節點res_id

v_current_node_res_id=v_rec_tbl_res.res_id;

-- 更新新節點同級 & 異常節點的parent_res_id為v_new_node_res_id

-- 更新當前節點res_tree_level[v_int_level_of_new_node]~res_tree_level[v_rec_tbl_res.res_level+1]以及res_level

v_tmp_counter=v_rec_tbl_res.res_level+1;

v_str_sql_cmd='update tbl_res set ';

while v_tmp_counter > v_int_level_of_new_node

loop

v_str_sql_cmd = v_str_sql_cmd ||'res_tree_level'|| v_tmp_counter || '_id = res_tree_level' || (v_tmp_counter-1) || '_id,' ;

v_tmp_counter = v_tmp_counter -1;

end loop;

v_str_sql_cmd = v_str_sql_cmd || 'res_level=res_level+1, res_tree_level'||v_int_level_of_new_node||'_id='||v_new_node_res_id;

v_str_sql_cmd = v_str_sql_cmd || ' where res_id = '|| v_current_node_res_id|| '; ';

execute v_str_sql_cmd;

end loop;

return 0;

end;

$body$

language plpgsql ;

-- select * from tbl_res;

-- select * from func_move_abnormal_node_to_new_node(10023,10024);

將neo4j的乙個節點上的關係移動到另乙個節點上

將neo4j中乙個節點的全部關係移動到另乙個節點上面,採用先建立新關係,之後刪除原先的關係的方式 1 def move relations source node id,target node id,graph none 2 3將 source node id 上所有的關係移動到 target no...

儲存過程編寫的乙個經驗

儲存過程最好只有乙個返回值的select語句,讓系統直接判斷出儲存過程返回的字段。前面這個寫法在sql query中沒有任何問題,但在 開發程式中有時就不能返回結果。不良寫法 create procedure p employee id int asif id 1 select name,age f...

乙個將資料分頁的儲存過程

create procedure sp page tb varchar 50 表名 col varchar 50 按該列來進行分頁 coltype int,col 列的型別,0 數字型別,1 字元型別,2 日期時間型別 orderby bit,排序,0 順序,1 倒序 collist varchar...