oracle过程中数据库链接的标识符错误无效



我有下面的过程,我将传递db链接作为参数并创建动态sql语句。在执行该过程时,我得到错误为ORA-00904: "DB_CONNECTION_NAME": invalid identifier。我已经声明了变量,但仍然会出现这个错误。

CREATE OR REPLACE PROCEDURE "EXT_SDR_RECEIVED"(in_db_link IN VARCHAR2)
AS
  last_sm_id         NUMBER := 0;
  last_capt_date     DATE;
  l_sql              VARCHAR2(5000);
  db_connection_name VARCHAR2(100);
  BEGIN
    SELECT db_link INTO db_connection_name
    FROM rator_monitoring_configuration.db_connection
    WHERE db_link = in_db_link;
    --DELETE DATA FROM TEMP_SDR_RECEIVED
    DELETE FROM temp_sdr_received WHERE create_date < SYSDATE - 7;
    -- first retrieve the last id (of the newest record) which has been imported at last extraction
    SELECT last_task_id INTO last_sm_id 
    FROM capturing WHERE db_table = 'TEMP_SDR_RECEIVED';
    SELECT capturing_date INTO last_capt_date
    FROM capturing WHERE db_table = 'TEMP_SDR_RECEIVED';
    dbms_output.PUT_LINE('DB' || db_connection_name);
    -- retrieve all new records from remote SDR_O2 table and insert it into TEMP_SDR_RECEIVED where ID is greater than LAST_SM_ID
    l_sql := 'INSERT INTO TEMP_SDR_RECEIVED(ID,RATING_CODE,A_NUMBER,CREATE_DATE,VOUCHER_ATTEMPT_ID,RATOR_BRAND_ID,BRAND_ID,STATUS_DESCRIPTION,ACCOUNT_PAYMENT_ID,SUBSCRIPTION_ID,DB_LINK)
              SELECT SD.ID,SD.RATING_CODE,SD.A_NUMBER,to_date(substr(SD.ID, 1, 8), ''YYYYMMDD''),VA.ID,VA.BRAND_ID,BR.BRAND_ID,VA.STATUS_DESCRIPTION,VA.ACCOUNT_PAYMENT_ID,VA.SUBSCRIPTION_ID,DB_CONNECTION_NAME
                FROM SDR_O2@' || db_connection_name || ' SD
                JOIN VOUCHER_ATTEMPT@' || db_connection_name || ' VA
                  ON SD.ID = VA.SDR_ID,
                     RATOR_MONITORING_CONFIGURATION.BRAND BR
               WHERE VA.BRAND_ID IS NOT NULL
                 AND BR.RATOR_BRAND_ID = VA.BRAND_ID
                 AND SD.RATING_CODE=''VOUCHER'' 
                 AND VA.STATUS_DESCRIPTION = ''USSD voucher''
                 AND SD.ID > LAST_SM_ID';
    EXECUTE IMMEDIATE l_sql;
  END ext_sdr_received;

您在动态查询的选择部分引用DB_CONNECTION_NAME(注意VA.SUBSCRIPTION_ID)。您的3个表中有任何一个有该列吗?我怀疑不是。

我怀疑您想选择DB_CONNECTION_NAME变量中的值。要做到这一点,请将动态查询中SELECT的最后一部分更改为:

'...,VA.SUBSCRIPTION_ID, ''' || DB_CONNECTION_NAME || '''
...

您可能还想了解execute immediate如何支持参数绑定,以便在可能的情况下避免编写这种难看的字符串串联代码。

另外,我注意到您正在混合联接符号。这是在找麻烦。坚持使用ANSI JOIN语法。

相关内容

  • 没有找到相关文章

最新更新