[英]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.