背景说明:
系统升级在机构表里面添加了一个序列号字段用于标识机构的层级关系
例如:
A机构: orgSeq = ‘00’
A的子机构B1: orgSeq = ‘00-01’
B的子机构C1: orgSeq = ‘00-01-01’
A的子机构B2: orgSeq = ‘00-02’
在将数据迁移到新库的时候由于旧版数据库不存在orgSeq所以在新库中orgSeq=null
在数据库中机构有一个parentOrgId标识自己的父机构
通过Oracle函数来执行orgSeq自动填充,顺便复习一下函数的使用
CREATE OR REPLACE
FUNCTION CREATE_ORG_SEQ RETURN VARCHAR2
IS
CURSOR orgRowCursor IS SELECT * FROM ORG; -- 游标变量
myOrg ORG%ROWTYPE; --行变量
orgParent ORG%ROWTYPE;
org ORG%ROWTYPE;
orgSeq VARCHAR2(256);
parentOrgId VARCHAR2(256);
nextParentOrgId VARCHAR2(256);
parentOrgCode VARCHAR2(256);
BEGIN
DBMS_OUTPUT.ENABLE(buffer_size => null);
OPEN orgRowCursor;
LOOP
FETCH orgRowCursor INTO org; -- 获取每一行
EXIT WHEN orgRowCursor%NOTFOUND; -- 退出条件
myOrg := org; -- 赋值
orgSeq := myOrg.org_code; -- 获取当前行的机构编码
parentOrgId := myOrg.parent_org_id; -- 获取当前行的机构的父机构Id
LOOP -- 开始循环,向上迭代找父机构,直到父机构的id=‘0’ 或者等自己id
IF parentOrgId = '0' THEN
EXIT;
END IF;
IF parentOrgId = myOrg.org_id THEN
orgSeq := myOrg.org_code || '-' || orgSeq;
EXIT;
END IF;
IF parentOrgId <> '0' THEN -- 父机构id不等于0
SELECT * INTO myOrg FROM ORG WHERE ORG_ID = parentOrgId; -- 根据父机构的id查找父机构
orgSeq := myOrg.org_code || '-' || orgSeq; -- 拼接一下orgSeq
parentOrgId := myOrg.parent_org_id; -- 把当前行赋值为父机构继续迭代
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(orgSeq);
UPDATE ORG SET ORG_SEQ = orgSeq WHERE org_id = org.org_id;
END LOOP;
CLOSE orgRowCursor; --关闭游标
RETURN NULL;
END;