在Oracle数据库

时间:2017-11-14 17:58:27

标签: sql oracle stored-procedures database-migration sql-scripts

我在SQL和程序方面没有多少实际操作。我需要一个迁移脚本,其中我需要根据其他两个表中的数据更新或插入表。

  

组织:
id 名称 pid
1 org1 null
2    org2 null
3    org3 1
4    org4 2

     

Org_Channel:
org_id 频道
1 CH_100
2    CH_101

组织表具有父子自引用关系。 (在父母的情况下,pid null )。 Org_Channel 仅为 组织的映射表。

现在我有第三个表 Org_Settings ,其中我需要根据上述两个表来迁移数据。此处的每条记录都表示一个组织ID,一个以通道名称为前缀的设置名称(对于子组织,这将是父组织org.channel)和一个标志。我需要一个迁移SQL脚本/程序,设置 Sign_On 每个组织 'Y'启用

目前的表格如下:

  

Org_Settings:
org_id s_name 已启用
1 CH_100_Sign_On N
1 CH_100_X_O Y   
4 CH_101_Sign_On Y


现在 Org_Settings 可能包含也可能不包含每个组织的条目。此外,我需要进行迁移,如果Sign_On存在条目,则需要更新 enabled = Y 。这样结果将是:

  

Org_Settings:
org_id s_name 已启用
1 CH_100_Sign_On Y
2 CH_101_Sign_On Y   
3 CH_100_Sign_On Y
4 CH_101_Sign_On ÿ


我可以想到伪代码,如:

for i in each org
    var pid = getPid(i)
    var id = (null == pid) ? i : pid
    var channel = getChannel(id);
    var sname = channel + "_Sign_On"
    if(settingsEntryExists(i, sname))
        updateSettingsEnable(i, sname, 'Y')
    else
        insertSettings(i, sname, 'Y')

1 个答案:

答案 0 :(得分:1)

试试这个MERGE INTO声明。如果条目存在,我不理解更新为'Y'的逻辑,如果不存在则插入'Y'。和简单插入不一样吗?还是我错过了什么? 。如果有一些遗漏信息可以澄清我上面的问题,您可以稍微调整一下这个查询。

SQLFiddle

MERGE 
INTO    Org_Settings d 
USING   ( select 
                org.id org_id, 
                ch.channel|| 
                '_Sign_On' s_name , 
                'Y'        enabled 
        FROM 
                Organization org
        JOIN    Org_Channel  ch ON NVL(org.pid,id) = ch.org_id
        )s 
ON ( d.org_id  = s.org_id 
                AND d.s_name = s.s_name )
WHEN MATCHED THEN 
UPDATE SET d.enabled = 'Y' 
WHEN NOT MATCHED THEN 
INSERT
        (org_id,s_name,enabled 
        ) VALUES 
        (s.org_id,s.s_name,s.enabled 
        );