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)';
我有以下过程,其中我在 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)';