问题描述
嗨,汤姆,
如何利用合并语句中的ref游标中的查询。
在 “开” 条件下,它说 “Src.column_name” 是一个无效的标识符。
如何利用合并语句中的ref游标中的查询。
在 “开” 条件下,它说 “Src.column_name” 是一个无效的标识符。
create or replace PROCEDURE TingTong ( in_tax_year IN tdir_le_mast.tax_year%TYPE, in_link_name IN VARCHAR2 DEFAULT 0) IS type rc is ref cursor; l_cur rc; r_c1 tdir_le_mast%rowtype; BEGIN dbms_output.put_line('Before open cursor.'); open l_cur for 'SELECT TAX_YEAR, LEID, CDR_NO, ENTITY_NAME, FUNC_CURR, GE_GECS_FLAG, HO_LEID, HO_CDR_NO, DATE_OF_INCORPORATION, COUNTRY_INCORPORATED, US_TAX_TYPE, CLASSIFICATION, DASTM, SCHD_O_REQD, PFIC, ADDR_LINE1_1A, ADDR_LINE2_1A, ADDR_LINE3_1A, LAST_USER_UPDATE, LAST_DATE_UPDATE, INACTIVE_FLAG, LAST_OPTION_ID, SCHD_P_REQD, PRIORYEAR_FUNC_CURR, FILING_GROUP, LOCAL_TAX_TYPE, ENTITY_TYPE, CDR_YORN, EIN, ACQUISITION_DATE, SHORT_PERIOD_LEID, IS_COMPONENT, SCENARIO, REPORTING_PERIOD, HO_REPORTING_PERIOD, EFILE_ID, PARENT_ELIM_FLAG, FSE_YORN, DRE_CDR_NO, DRE_LEID, DRE_REPORTING_PERIOD FROM tdir_le_mast@'||in_link_name|| ' WHERE tax_year =' ||in_tax_year; dbms_output.put_line('Before Fetch.'); fetch l_cur into r_c1; loop exit when l_cur%notfound; dbms_output.put_line('Test Roll.'); MERGE INTO tdir_le_mast dst USING (SELECT r_c1.TAX_YEAR, r_c1.LEID, r_c1.CDR_NO, r_c1.ENTITY_NAME, r_c1.FUNC_CURR, r_c1.GE_GECS_FLAG, r_c1.HO_LEID, r_c1.HO_CDR_NO, r_c1.DATE_OF_INCORPORATION, r_c1.COUNTRY_INCORPORATED, r_c1.US_TAX_TYPE, r_c1.CLASSIFICATION, r_c1.DASTM, r_c1.SCHD_O_REQD, r_c1.PFIC, r_c1.ADDR_LINE1_1A, r_c1.ADDR_LINE2_1A, r_c1.ADDR_LINE3_1A, r_c1.LAST_USER_UPDATE, r_c1.LAST_DATE_UPDATE, r_c1.INACTIVE_FLAG, r_c1.LAST_OPTION_ID, r_c1.SCHD_P_REQD, r_c1.PRIORYEAR_FUNC_CURR, r_c1.FILING_GROUP, r_c1.LOCAL_TAX_TYPE, r_c1.ENTITY_TYPE, r_c1.CDR_YORN, r_c1.EIN, r_c1.ACQUISITION_DATE, r_c1.SHORT_PERIOD_LEID, r_c1.IS_COMPONENT, r_c1.SCENARIO, r_c1.REPORTING_PERIOD, r_c1.HO_REPORTING_PERIOD, r_c1.EFILE_ID, r_c1.PARENT_ELIM_FLAG, r_c1.FSE_YORN, r_c1.DRE_CDR_NO, r_c1.DRE_LEID, r_c1.DRE_REPORTING_PERIOD FROM dual)src ON (src.tax_year = dst.tax_year ) WHEN MATCHED THEN UPDATE SET dst.TAX_YEAR = src.TAX_YEAR, dst.LEID=src.LEID, dst.CDR_NO=src.CDR_NO, dst.ENTITY_NAME=src.ENTITY_NAME, dst.FUNC_CURR=src.FUNC_CURR, dst.GE_GECS_FLAG=src.GE_GECS_FLAG, dst.HO_LEID=src.HO_LEID, dst.HO_CDR_NO=src.HO_CDR_NO, dst.DATE_OF_INCORPORATION=src.DATE_OF_INCORPORATION, dst.COUNTRY_INCORPORATED=src.COUNTRY_INCORPORATED, dst.US_TAX_TYPE=src.US_TAX_TYPE, dst.CLASSIFICATION=src.CLASSIFICATION, dst.DASTM=src.DASTM, dst.SCHD_O_REQD=src.SCHD_O_REQD, dst.PFIC=src.PFIC, dst.ADDR_LINE1_1A=src.ADDR_LINE1_1A, dst.ADDR_LINE2_1A=src.ADDR_LINE2_1A, dst.ADDR_LINE3_1A=src.ADDR_LINE3_1A, dst.LAST_USER_UPDATE=src.LAST_USER_UPDATE, dst.LAST_DATE_UPDATE=src.LAST_DATE_UPDATE, dst.INACTIVE_FLAG=src.INACTIVE_FLAG, dst.LAST_OPTION_ID=src.LAST_OPTION_ID, dst.SCHD_P_REQD=src.SCHD_P_REQD, dst.PRIORYEAR_FUNC_CURR=src.PRIORYEAR_FUNC_CURR, dst.FILING_GROUP=src.FILING_GROUP, dst.LOCAL_TAX_TYPE=src.LOCAL_TAX_TYPE, dst.ENTITY_TYPE=src.ENTITY_TYPE, dst.CDR_YORN=src.CDR_YORN, dst.EIN=src.EIN, dst.ACQUISITION_DATE=src.ACQUISITION_DATE, dst.SHORT_PERIOD_LEID=src.SHORT_PERIOD_LEID, dst.IS_COMPONENT=src.IS_COMPONENT, dst.SCENARIO=src.SCENARIO, dst.REPORTING_PERIOD=src.REPORTING_PERIOD, dst.HO_REPORTING_PERIOD=src.HO_REPORTING_PERIOD, dst.EFILE_ID=src.EFILE_ID, dst.PARENT_ELIM_FLAG=src.PARENT_ELIM_FLAG, dst.FSE_YORN=src.FSE_YORN, dst.DRE_CDR_NO=src.DRE_CDR_NO, dst.DRE_LEID=src.DRE_LEID, dst.DRE_REPORTING_PERIOD=src.DRE_REPORTING_PERIOD WHEN NOT MATCHED THEN INSERT (dst.TAX_YEAR, dst.LEID, dst.CDR_NO, dst.ENTITY_NAME, dst.FUNC_CURR, dst.GE_GECS_FLAG, dst.HO_LEID, dst.HO_CDR_NO, dst.DATE_OF_INCORPORATION, dst.COUNTRY_INCORPORATED, dst.US_TAX_TYPE, dst.CLASSIFICATION, dst.DASTM, dst.SCHD_O_REQD, dst.PFIC, dst.ADDR_LINE1_1A, dst.ADDR_LINE2_1A, dst.ADDR_LINE3_1A, dst.LAST_USER_UPDATE, dst.LAST_DATE_UPDATE, dst.INACTIVE_FLAG, dst.LAST_OPTION_ID, dst.SCHD_P_REQD, dst.PRIORYEAR_FUNC_CURR, dst.FILING_GROUP, dst.LOCAL_TAX_TYPE, dst.ENTITY_TYPE, dst.CDR_YORN, dst.EIN, dst.ACQUISITION_DATE, dst.SHORT_PERIOD_LEID, dst.IS_COMPONENT, dst.SCENARIO, dst.REPORTING_PERIOD, dst.HO_REPORTING_PERIOD, dst.EFILE_ID, dst.PARENT_ELIM_FLAG, dst.FSE_YORN, dst.DRE_CDR_NO, dst.DRE_LEID, dst.DRE_REPORTING_PERIOD ) VALUES (src.TAX_YEAR, src.LEID, src.CDR_NO, src.ENTITY_NAME, src.FUNC_CURR, src.GE_GECS_FLAG, src.HO_LEID, src.HO_CDR_NO, src.DATE_OF_INCORPORATION, src.COUNTRY_INCORPORATED, src.US_TAX_TYPE, src.CLASSIFICATION, src.DASTM, src.SCHD_O_REQD, src.PFIC, src.ADDR_LINE1_1A, src.ADDR_LINE2_1A, src.ADDR_LINE3_1A, src.LAST_USER_UPDATE, src.LAST_DATE_UPDATE, src.INACTIVE_FLAG, src.LAST_OPTION_ID, src.SCHD_P_REQD, src.PRIORYEAR_FUNC_CURR, src.FILING_GROUP, src.LOCAL_TAX_TYPE, src.ENTITY_TYPE, src.CDR_YORN, src.EIN, src.ACQUISITION_DATE, src.SHORT_PERIOD_LEID, src.IS_COMPONENT, src.SCENARIO, src.REPORTING_PERIOD, src.HO_REPORTING_PERIOD, src.EFILE_ID, src.PARENT_ELIM_FLAG, src.FSE_YORN, src.DRE_CDR_NO, src.DRE_LEID, src.DRE_REPORTING_PERIOD ); end loop; close l_cur; Exception when others then dbms_output.put_line('Test failed.'||SQLCODE||':'||SQLERRM); END; / ---------------------------------------- DBMS Output for the code: if I used SRC in the "ON" of Merge statement. ---------------------------------------- Before open cursor. Before Fetch. Test Roll. Test failed.-904:ORA-00904: "SRC"."TAX_YEAR": invalid identifier复制
专家解答
您能否删除 “当其他人” 语句,然后运行此语句并向我们显示整个错误堆栈。
然后我们可以看到到底发生了什么
=
在合并中,您正在从dual中选择变量的内容。仅仅因为 * 变量 * 的名称与您的列名匹配,并不意味着这些列将自动别名。您需要添加别名,例如
然后我们可以看到到底发生了什么
=
在合并中,您正在从dual中选择变量的内容。仅仅因为 * 变量 * 的名称与您的列名匹配,并不意味着这些列将自动别名。您需要添加别名,例如
SQL> create table t1 ( tax_year int, leid int, cdr_no int, DRE_REPORTING_PERIOD int ); Table created. SQL> insert into t1 values (1,1,1,1); 1 row created. SQL> create table t2 ( tax_year int, leid int, cdr_no int, DRE_REPORTING_PERIOD int ); Table created. SQL> insert into t2 values (1,1,1,1); 1 row created. SQL> SQL> SQL> set serverout on SQL> declare 2 type rc is ref cursor; 3 l_cur rc; 4 r_c1 t1%rowtype; 5 6 BEGIN 7 dbms_output.put_line('Before open cursor.'); 8 open l_cur for 'SELECT TAX_YEAR, 9 LEID, 10 CDR_NO, 11 DRE_REPORTING_PERIOD 12 FROM t1'; 13 14 dbms_output.put_line('Before Fetch.'); 15 loop 16 fetch l_cur into r_c1; 17 exit when l_cur%notfound; 18 dbms_output.put_line('Test Roll.'); 19 20 MERGE INTO t2 dst 21 USING (SELECT r_c1.TAX_YEAR tax_year, <==== 22 r_c1.LEID leid, <==== 23 r_c1.CDR_NO cdr_no, <==== 24 r_c1.DRE_REPORTING_PERIOD DRE_REPORTING_PERIOD <==== 25 FROM dual) src 26 ON (src.tax_year = dst.tax_year ) 27 WHEN MATCHED 28 THEN 29 UPDATE SET dst.LEID=src.LEID, 30 dst.CDR_NO=src.CDR_NO, 31 dst.DRE_REPORTING_PERIOD=src.DRE_REPORTING_PERIOD 32 WHEN NOT MATCHED 33 THEN 34 INSERT (dst.TAX_YEAR, 35 dst.LEID, 36 dst.CDR_NO, 37 dst.DRE_REPORTING_PERIOD 38 ) 39 VALUES (src.TAX_YEAR, 40 src.LEID, 41 src.CDR_NO, 42 43 src.DRE_REPORTING_PERIOD 44 ); 45 46 end loop; 47 close l_cur; 48 49 END; 50 / Before open cursor. Before Fetch. Test Roll. PL/SQL procedure successfully completed.复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle DataGuard高可用性解决方案详解
孙莹
426次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
385次阅读
2025-04-15 17:24:06
墨天轮个人数说知识点合集
JiekeXu
363次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
357次阅读
2025-04-08 09:12:48
Oracle SQL 执行计划分析与优化指南
Digital Observer
327次阅读
2025-04-01 11:08:44
Oracle 19c RAC更换IP实战,运维必看!
szrsu
296次阅读
2025-04-08 23:57:08
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
293次阅读
2025-03-24 09:42:53
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
287次阅读
2025-03-19 14:41:51
oracle定时任务常用攻略
virvle
286次阅读
2025-03-25 16:05:19
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
271次阅读
2025-04-15 14:48:05