2014-03-14 31 views
1

我更新在temp_docmeta表xprojecttype并试图通过包括"d.xproject_id NOT IN"条款忽略我下面的查询中的所有无效的电话号码,但它仍然抛出我01722. 00000“无效号码”。01722. 00000 - <code>"invalid number"</code>错误 - 在SQL更新

BEGIN 
    FOR X IN 
    (SELECT projecttype,pid,enddate FROM temp_project 
) 
    LOOP 
    UPDATE temp_docmeta d 
    SET d.xprojecttype  =X.projecttype 
    WHERE d.xproject_id =X.PID 
    AND X.projecttype  IS NOT NULL 
    AND X.enddate   > '10-MAR-14 00.00.00' 
    AND d.xproject_id NOT IN 
     (SELECT TO_NUMBER(xproject_id) 
     FROM temp_docmeta 
     WHERE REGEXP_LIKE(xproject_id, '[^0-9]+') 
    ); 
    END LOOP; 
END ; 

但是,当我用delete语句删除相同的一组记录,然后运行上述更新命令,它工作正常。

DELETE 
FROM temp_docmeta 
WHERE xproject_id IN 
    (SELECT xproject_id 
    FROM temp_docmeta 
    WHERE REGEXP_LIKE(xproject_id, '[^0-9]+') 
); 

我不想从我temp_docmeta表中删除上述记录,但需要更新temp_docmeta表中第一个查询。我该怎么做?

回答

0

您的查询试图改变TO_NUMBER所有的值,你不想

也许你应该尝试

AND d.xproject_id IN 
    (SELECT TO_NUMBER(xproject_id) 
    FROM temp_docmeta 
    WHERE NOT REGEXP_LIKE(xproject_id, '[^0-9]+') 
); 

但要看的顺序,TO_NUMBER和REGEXP_LIKE如何做

+0

不,这是行不通的。 –

+0

任何人都可以帮助解决这个问题吗?或者你可以告诉我一个替代方法来更新我的表中的xprojecttype列。 P.S-当我用delete语句删除同一组记录,然后运行上述更新命令时,它工作正常。 –

+0

@PulkitBhatia你尝试了上面的答案吗?它给出了任何错误?如果没有错误,那是什么不起作用? – Noel

0

我的更改了X.PID的数据类型,如下所示,to_char,但是,当我将xproject_id的数据类型更改为“to number”时,它不起作用。奇怪。不是吗? 或者我错过了什么?

BEGIN 
    FOR X IN 
    (SELECT projecttype,pid,enddate FROM temp_PROJECT where projecttype IS NOT NULL 
    AND enddate  > '10-MAR-14 00.00.00' 
    AND PID NOT LIKE '-1' 
) 
    LOOP 
    UPDATE temp_docmeta 
    SET xprojecttype  =X.projecttype 
    WHERE xproject_id =to_char(X.PID) 
    AND xproject_id in 
     (SELECT UNIQUE(xproject_id) 
     FROM temp_docmeta 
     WHERE REGEXP_LIKE(xproject_id, '[0-9]+') 
    ); 
    END LOOP; 
END;