问题描述
嗨,
我有这个参数表tb_parameter。
我想创建一个过程pl/sql来做到这一点:
插入表名称 (column_tab) 值
从view_name @ dblink中选择列视图
对于参数表tb_parameter的每一行。
我需要一个dblink来访问视图
-我尝试了这个,但它不起作用
错误 (40,1): PL/SQL: SQL语句已忽略
错误 (40,13): PL/SQL: ORA-00942: 表或视图不存在
我有这个参数表tb_parameter。
+----+----------+-----+-----------+--------------------------------------------------------------------------------------- | ID_SRC| TABLE_NAME | VIEW_NAME | COLUMN_VIEW | COLUMN_TABLE +----+----------+-----+-----------+--------------------------------------------------------------------------------------- | 1 | CUSTOMER | VIEW_CUSTOMER | id,name,reference | id,name,reference | 2 | PRODUCT | VIEW_PRODUCT | id_product,type_product | id_product,type_product | 3 | OWNER | VIEW_OWNER | id_owner,product_owned | id_owner,product_owned | 4 | CITY | VIEW_CITY | name,adress | name,adress |----+----------+-----+-----------+---------------------------------------------------------------------------------------------+复制
我想创建一个过程pl/sql来做到这一点:
插入表名称 (column_tab) 值
从view_name @ dblink中选择列视图
对于参数表tb_parameter的每一行。
我需要一个dblink来访问视图
-我尝试了这个,但它不起作用
错误 (40,1): PL/SQL: SQL语句已忽略
错误 (40,13): PL/SQL: ORA-00942: 表或视图不存在
create or replace PROCEDURE pr_load_tab IS v_views tb_parameter.view_name%TYPE; v_tab tb_parameter.table_name%TYPE; v_column_view tb_parameter.column_view%TYPE; v_column_table tb_parameter.column_table%TYPE; v_source tb_parameter.id_src%TYPE; i NUMBER(2) := 0; CURSOR c1 IS SELECT view_name FROM tb_parameter where id_src=v_source; CURSOR c2 IS select table_name from tb_parameter where id_src=v_source; CURSOR c3 IS select column_view from tb_parameter where id_src=v_source; CURSOR c4 IS select column_table from tb_parameter where id_src=v_source; CURSOR c5 IS select column_table from tb_parameter where id_src=v_source; BEGIN OPEN c1; OPEN c2; OPEN c3; OPEN c4; LOOP FETCH c1 INTO v_views; FETCH c2 INTO v_tab; FETCH c3 INTO v_column_view; FETCH c4 INTO v_column_table; IF (c1%FOUND) AND (c2%FOUND) AND (c3%FOUND) AND (c4%FOUND)THEN v_source := v_source +1; INSERT INTO v_tab VALUES (v_column_table); ELSE EXIT; END IF; END LOOP; CLOSE c1; CLOSE c2; CLOSE c3; CLOSE c4; END; /复制
专家解答
如果在 * 编译 * 时不知道表名和列名,则需要使用动态SQL来构建insert语句,例如:
SQL> declare 2 l_table varchar2(100) := 'EMP'; 3 l_query varchar2(32767) := 'select * from '||l_table; 4 5 l_theCursor integer default dbms_sql.open_cursor; 6 l_descTbl dbms_sql.desc_tab; 7 l_colCnt number; 8 l_insert varchar2(4000) := 'insert into '||l_table||' select '; 9 begin 10 dbms_sql.parse( l_theCursor, l_query, dbms_sql.native ); 11 dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl ); 12 13 for i in 1 .. l_colCnt loop 14 l_insert := l_insert || case when i > 1 then ',' end|| l_descTbl(i).col_name; 15 end loop; 16 l_insert := l_insert || chr(10) ||' from '||l_table||'@dblink'; 17 dbms_output.put_line(l_insert); 18 end; 19 / insert into EMP select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP@dblink复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
597次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
576次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
491次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
474次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
459次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
436次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
434次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
420次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
368次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05