oracle连接条件中的case语句

Case statement in join condition in oracle

我有以下过程,其中我在 sql 查询中动态使用 db link 并且我有我试图在连接条件中使用 case statement 的情况,因为取决于db link 我必须在连接条件中使用 table 但我收到错误 ORA-06512 "missing right parenthesis"

PROCEDURE "EXT_I_IN"(IN_I_ID IN NUMBER DEFAULT 0) AS

    err_code VARCHAR(100);
    err_msg VARCHAR(100);         
     l_sql VARCHAR2(5000);
     l_sql1 VARCHAR2(5000);

    BEGIN       

    FOR I_ROW IN I_CUR
    LOOP

    l_sql:='INSERT INTO I_IN(ID,DB_LINK)
    Select DISTINCT(INC.ID),:IN_DB_LINK  FROM
    IN_I@'||IN_DB_LINK||' IC JOIN 
    (CASE WHEN :DB_NAME = ''IDB'' THEN IC.INC@'||IN_DB_LINK||' ELSE IN.INC@'||IN_DB_LINK||' END) IDL
    ';

    DBMS_OUTPUT.PUT_LINE('lsql' || l_sql);
    execute immediate l_sql using IN_DB_LINK;

    END EXT_I_IN;'

这看起来很奇怪,您不能在 JOIN 中使用 CASE:

 (CASE WHEN :DB_CONNECTION_NAME = ''FONIC_RETAIL'' THEN RATOR_FONIC_CDR.INVOICE_DETAIL_LINE@'||IN_DB_LINK||' ELSE RATOR_CDR.INVOICE_DETAIL_LINE@'||IN_DB_LINK||' END) IDL

但是您可以在构建查询时检查此条件:

l_sql:='INSERT INTO TEMP_TOPUP_DRC_IN(ID,INVOICE_DETAIL_LINE_ID,STATUS,BILLING_GROUP_ID,DB_LINK)
    Select DISTINCT(INC.ID),INC.INVOICE_DETAIL_LINE_ID,INC.STATUS,IDL.BILLING_GROUP_ID,:IN_DB_LINK  FROM
    IN_NODE_CHARGE@'||IN_DB_LINK||' INC JOIN ';
CASE WHEN IN_DB_LINK = 'FONIC_RETAIL' THEN l_sql := l_sql || ' RATOR_FONIC_CDR.INVOICE_DETAIL_LINE@'||IN_DB_LINK;
     ELSE l_sql := l_sql || ' RATOR_CDR.INVOICE_DETAIL_LINE@'||IN_DB_LINK;
END CASE;
l_sql := ' IDL ON INC.INVOICE_DETAIL_LINE_ID = IDL.ID
    JOIN ACCOUNT_PAYMENT@'||IN_DB_LINK||' AP ON IDL.BILLING_RECORD_ID = AP.ID
      WHERE AP.PAYMENT_TYPE_ID = 24
      AND INC.STATUS IN (1,3,6,2,4,14,20,21,100,101,102)';