简体   繁体   English

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

[英]Invalid identifier error in oracle procedure for database link

I have below procedure for which i am passing db link as a parameter and create dynamic sql statement. 我有以下过程,为此我将数据库链接作为参数传递并创建动态sql语句。 While executing the procedure i am getting error as ORA-00904: "DB_CONNECTION_NAME": invalid identifier . 执行该过程时,我收到错误消息ORA-00904: "DB_CONNECTION_NAME": invalid identifier I have declared the variable but still i am getting this error. 我已经声明了变量,但是仍然出现此错误。

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;

You are referencing DB_CONNECTION_NAME in the select part of your dynamic query (look after VA.SUBSCRIPTION_ID). 您正在动态查询的选择部分中引用DB_CONNECTION_NAME (请注意VA.SUBSCRIPTION_ID)。 Do any of your 3 tables have that column? 您的3个表格中是否有该列? I suspect not. 我怀疑不是。

I suspect that you wanted to select the value in the DB_CONNECTION_NAME variable instead. 我怀疑您想在DB_CONNECTION_NAME变量中选择值。 To do that, change that last part of the SELECT in your dynamic query like this: 为此,请在动态查询中更改SELECT最后一部分,如下所示:

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

You may also want to look into how execute immediate supports parameter binding, so that, where possible, you can avoid having to write this ugly string concatenation code. 您可能还希望研究execute immediate如何支持参数绑定,以便在可能的情况下避免编写此丑陋的字符串连接代码。

Also, I notice you are mixing join notations. 另外,我注意到您正在混合联接符号。 That's asking for trouble. 那是麻烦。 Stick to ANSI JOIN syntax. 坚持ANSI JOIN语法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM