oracle - oracle连接条件中的case语句

标签 oracle join dynamic-sql case-when

我有以下过程,其中我在sql查询中动态使用数据库链接,并且我遇到了尝试在连接条件中使用case语句的情况,因为取决于我必须使用的数据库链接表处于连接条件,但我收到错误 ORA-06512“缺少右括号”

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)';

关于oracle - oracle连接条件中的case语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011657/

相关文章:

hadoop - HIVE中的MAP SIDE JOIN中的错误

sql - T-SQL : How to use parameters in dynamic SQL?

java - Java 中动态 SQL 库的比较

oracle - 简单类型别名 - Oracle 最佳实践

mysql - 优化Mysql JOIN查询速度

postgresql - 大数据集的空间连接查询优化

database - EXECUTE <query-string> USING value1... 在第一个替换占位符 ($1) 上阻塞

oracle - oracle 数据库中特定表的脚手架 dbcontext 抛出与该表无关的错误

oracle - SAS 错误处理 - 在数据步骤之后检查是否引发错误

Perl DBI - 使用多条语句运行 SQL 脚本