在Oracle PL / SQL Script中,将所有记录的[FIeldX]值设置为相同的值?

时间:2015-04-28 20:40:09

标签: database oracle plsql oracle11g

我编写了一个Oracle数据库转换脚本,它将数据从以前的单个表传输到带有主表和多个子/引用/维护表的新数据库中。当然,这种更标准化的布局(以前可能有Bob/Storage Room/Ceiling作为[Location]值)具有比旧表更多的字段,因此无法完全转换。

目前,我已在每个子表中插入了一个记录值(例如{}} [NO_CONVERSION_DATA]。对于我的主表,我需要将(例如)[Color_ID]设置为22,[Type_ID]设置为57,因为这些新字段没有显式转换(每年,所有这些记录都会更新,之后下一次更新所有记录都将存在正确的字段值,因此占位符值/记录[NO_CONVERSION_DATA]将从子表中删除。

我同样需要设置[Status_Id]类似以下内容(不工作):

INSERT INTO TABLE1 (STATUS_ID)
VALUES
    -- Status was not set as Recycled, Disposed, etc. during Conversion
    IF STATUS_ID IS NULL THEN
        (CASE
            -- [Owner] field has a value, set ID to 2 (Assigned)
            WHEN RTRIM(LTRIM(OWNER)) IS NOT NULL THEN 2
            -- [Owner] field has no value, set ID to 1 (Available)
            WHEN RTRIM(LTRIM(OWNER)) IS NULL THEN 1
        END as Status)

任何人都可以更熟悉Oracle& PL / SQL协助我在这里尝试做什么的语法/布局?

好的,我想出了如何将2个特定列设置为所有行的相同值:

UPDATE TABLE1
SET COLOR_ID = 24;
UPDATE INV_ASSETSTEST
SET TYPE_ID = 20;

我仍然试图根据STATUS_ID字段[OWNER]中的值设置NULL/NOT NULL。下面的Coco的解决方案看起来很擅长(关于他的评论,而不是发布的解决方案本身),但是下面导致我的NON-NULLABLE列中的每一个都被标记并且语句将不会执行:

INSERT INTO TABLE1(STATUS_ID)
    SELECT CASE 
        WHEN STATUS_ID IS NULL THEN
            CASE
                WHEN TRIM(OWNER) IS NULL THEN 1
                WHEN TRIM(OWNER) IS NOT NULL THEN 2
            END
    END FROM TABLE1;

我试过拼凑一个类似的UPDATE声明,但到目前为止还没有运气。

1 个答案:

答案 0 :(得分:0)

试试这个

INSERT INTO TABLE1 (STATUS_ID)
VALUES
    (
    case
        when TATUS_ID IS NULL THEN
        (CASE
            -- [Owner] field has a value, set ID to 2 (Assigned)
            WHEN RTRIM(LTRIM(OWNER)) IS NOT NULL THEN 2
            -- [Owner] field has no value, set ID to 1 (Available)
            WHEN RTRIM(LTRIM(OWNER)) IS NULL THEN 1
        END )
    end);