如何使用存储在其中的点而不会抛出错误的记录? (在PLSQL中)

时间:2014-02-18 14:51:52

标签: oracle plsql procedure

我在一个程序中有以下循环来扰乱PII。问题是IV_USER存储为带有名称的点的James.T.Sanders。这导致我得到ORA-00904:"詹姆斯"。" T"。"桑德斯":无效的标识符

有解决方法吗?

        OPEN user_list FOR 'select IV_USER FROM EXT_USER.PORTAL_ACCOUNTS';
        LOOP
        FETCH user_list INTO user_list_rec;
            execute immediate 'update EXT_USER.PORTAL_ACCOUNTS set PERSON_ID=:ssan_new WHERE IV_USER='||user_list_rec.IV_USER||' ' USING ssan_new;
            ssan_new := ssan_new + 1;

        END LOOP;

如果需要进一步澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

我认为WHERE条件中的作业错过了单一行情!

由于Query构造为String,因此分配VARCHAR变量只需粘贴WHERE IV_USER = James.T.Sanders之类的值即可。它必须用作绑定变量或用单引号括起来!

    OPEN user_list FOR 'select IV_USER FROM EXT_USER.PORTAL_ACCOUNTS';
    LOOP
    FETCH user_list INTO user_list_rec;
        execute immediate 'update EXT_USER.PORTAL_ACCOUNTS set PERSON_ID=:ssan_new WHERE IV_USER='''||user_list_rec.IV_USER||''' ' USING ssan_new;
        ssan_new := ssan_new + 1;

    END LOOP;

OR(没有动态 SQL for UPDATE,Ofcourse可以在没有动态SQL的情况下使用许多解决方案)

    OPEN user_list FOR 'select IV_USER FROM EXT_USER.PORTAL_ACCOUNTS';
    LOOP
    FETCH user_list INTO user_list_rec;
        update EXT_USER.PORTAL_ACCOUNTS set PERSON_ID = ssan_new WHERE IV_USER = user_list_rec.IV_USER;
        ssan_new := ssan_new + 1;

    END LOOP;