在EXECUTE IMMEDIATE SELECT中使用NVL时出现无效的标识符错误

时间:2017-05-01 14:23:02

标签: oracle

create or replace PROCEDURE P_STAGE_LOAD(
    in_S IN VARCHAR2,
    in_D     IN VARCHAR2,
    in_T   IN VARCHAR2)
IS
 v_ERRM VARCHAR2(32000);
BEGIN
  IF in_TBL_NAME ='TRAN_CUSTOMER' THEN
    EXECUTE immediate 'INSERT INTO  TRAN_CUSTOMER 
      (CUSTOMER_ID,AUTH_ID,OTHER_ID,TRAN_TYPE,AUDIT_TS)    
      SELECT CUSTOMER_ID,AUTH_ID,OTHER_ID,NVL(TRAN_TYPE,'PRIMARY'),
         SYSDATE 
    FROM '||in_S||'.'||in_T||'@'||in_D;
    EXECUTE immediate 'COMMIT';

这会在运行时给出Invalid Identifier错误。但是SELECT查询运行良好。 我想处理NULL的{​​{1}},并在TRAN_TYPE时解码为PRIMARY。 目标表NULL将此列为TRAN_CUSTOMER列。

有什么遗漏吗?

1 个答案:

答案 0 :(得分:1)

您需要为PRIMARY使用两个单引号,因为第一个单引号结束EXECUTE IMMEDIATE字符串。

在该行中使用类似下面的内容。

EXECUTE immediate 'INSERT INTO  TRAN_CUSTOMER 
      (CUSTOMER_ID,AUTH_ID,OTHER_ID,TRAN_TYPE,AUDIT_TS)    
      SELECT CUSTOMER_ID,AUTH_ID,OTHER_ID,NVL(TRAN_TYPE,''PRIMARY''),
         SYSDATE 
    FROM '||in_S||'.'||in_T||'@'||in_D;