oracle存储过程中查询动态表名

有34个表,每个表的表名格式为aa***bb ,其中***是六位数字,从别的表中可以查到。
现在想写个存储过程,目的就是想从这34个表中分别查询出来其中的两个字段的值,然后插入到别的表中。

先建立结果表,也就是存放你最终结果的表

 create table test
(a varchar2(100),
b varchar2(100));

然后建立存储过程

create procedure p_insert
as
cursor cur_tbname is 
select 'insert into test select col1,col2 from '||table_name 
from user_tables where table_name like 'AA____BB';--这个位置的表名必须大写的A和B,col1和col2换成你实际的字段名称
begin
 open cur_tbname;
      loop
 fetch cur_tbname into v_sql;
 exit when cur_tbname%notfound;
        execute immediate v_sql;
 commit;
      end loop;
end;

 

我最终没测试,你自己测试一下,看哪有问题吧

追问

我从别的表中查询到***在哪儿执行的? 怎么组装成一个新表名的呢?

追答

你从

user_tables 里查不到你的那些表名吗?

 

你把这句单独运行一下

select 'insert into test select col1,col2 from '||table_name 
from user_tables where table_name like 'AA____BB';col1和col2给换一下追问

user_tables 中存的不是表名。user_tables中的code字段存的只是表名中间的一部分。这34个表名是拼起来的 格式是 aacodebb 。

追答

我给你发你查收一下,浏览器右上角

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-01
EXECUTE IMMEDIATE sql_test;
sql_test为动态拼接的字符串

第2个回答  2013-11-01
你没描述清楚:从34个表中分别查询出来其中的两个字段的值?什么意思,你一次查询34个表?追问

执行34次查询,查询出来34组数据

追答

可是你所有表里面的字段名称都是一样的吗?

追问

是的。这34个表就名称不一样,表结构都一样。

追答

你用union关键字吧,
先select 'select col1,col2 from '||table_name||' union '
from user_tables where table_name like 'AA____BB';这样会得到34个结果,然后那最后一个结果的union 关键字去掉就得到了你要的结果了,然后你想把结果放到表里面还不简单啊?

oracle存储过程中查询动态表名
create table test(a varchar2(100),b varchar2(100));然后建立存储过程 create procedure p_insertascursor cur_tbname is select 'insert into test select col1,col2 from '||table_name from user_tables where table_name like 'AA___BB';--这个位置的表名必须大写的A和B,col1和col2...

oracle动态表名查询 如何写sql语句或者存储过程实现: 根据某张表中的某...
begin for cur in(select id,flag fromu a)loop if cur.flag=0 then select * from b;...else select * from C;...end if;end loop;end;

oracle存储过程如何动态修改表名关联查询
用动态sql拼接语句就好了!VSQL varchar2(2000)day varchar2(2);begin day:= to_char(sysdate-1,'dd');VSQL:=' selectsum(sms.send_count) into sa_send_cnt from core_school sc inner join sms_mt_send sms on sc.school_id = sms.school_id inner join sms_mt_send_det...

如何在oracle存储过程中执行动态sql语句
时需要在oracle 存储过程中执行动态SQL 语句 ,例如表名是动态的,或字段是动态的,或查询命令是动态的,可用下面的方法:set serveroutput ondeclaren number;sql_stmt varchar2(50);t varchar2(20);beginexecute immediate 'alter session set nls_date_format=''YYYYMMDD''';t := 't_' || sy...

Oracle存储过程中如何把表名写在变量里面进行查询该表?
create or replace procedure p_XX(tabName in varchar2) is type t_cursor is ref cursor;v_cursor t_cursor;v_SQLStatement varchar2(300);begin v_SQLStatement = 'select xx from '||tabName ;open v_cursor for v_SQLStatement;loop fetch v_cursor into XXX;exit when v_cur...

oracle 怎么在存储过程中查询数据
oracle数据库中,已建立好的存储过程信息存储在系统表ALL_SOURCE 中,需要用sysdba身份登录数据库,进行查询操作,SQL命令如下:1 2 3 4 5 SELECT line,text FROM ALL_SOURCE WHERE TYPE='PROCEDURE'AND NAME='过程名称'AND OWNER='用户名'ORDER BY line;存储过程分成多行,每一行会存储为一条数据...

oracle PL\/sql 如果一张表的每行数据是另一个表的列名 怎么用存储过 ...
oracle动态游标举例:-- i_address 是存储过程的输入参数,o_cur是存储过程的输出游标参数,用以获取返回的结果集!CREATE OR REPLACE PROCEDURE xue_userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR)IS sqlstr VARCHAR2(200); -- 定义变量,用以存放SQL语句 BEGIN sqlstr := 'SELECT ...

oracle的存储过程里面怎样引用表的名称?
在Oracle中这样写是不行的,在存储过程中所有查询返回的结果或结果集都必须有接受变量,如果你的存储过程是返回一个记录集,必须定一个ref的游标变量,使用open cursor for select。。。这样的格式才能返回数据集

如何使用oracle存储过程查询某张表的所有信息
先定义一个系统游标(sys_refcursor),然后将返回的记录集放到这个游标中。例如:CREATE OR REPLACE procedure test (ret out sys_refcursor)as begin open ret for select col_name from table;end test;

oracle 怎么查找哪一个包中使用了一个表(表我是知道哪一个的)_百度知...
drop和create是不可能在包里处理的。你就查select、 update 和 delete,之后跟的就是表名,这个是查包里用了多少个表,都是哪些表。如果反过来查,一个表被多少个包,存贮过程等使用了,那就更简单了,用Toad for Oracle,在编辑器里打上表名后F4,点那个used by就OK了。

相似回答