如何从user_table中选择tablename

时间:2013-08-09 17:26:18

标签: sql database oracle plsql

我的系统上有dinamics表,它更改了名称上的一个数字,所以我没有固定名称。我希望选择持续表格,但只选择表格的名称来选择此表格。

SELECT * FROM ((SELECT * FROM (select a.tablespace_name || '.' || a.table_name AS TABLE_NAME
from user_tables a
wherE a.tablespace_name='USERNAME'
and a.table_name like '%_DIN'
ORDER BY TABLE_NAME DESC)
WHERE ROWNUM = '1'))
例如,

。 表名

SELECT * FROM (select a.tablespace_name || '.' || a.table_name AS TABLE_NAME
    from user_tables a
    wherE a.tablespace_name='USERNAME'
    and a.table_name like '%_DIN'
    ORDER BY TABLE_NAME DESC)
    WHERE ROWNUM = '1'

返回: 7_DIN

是我的表空间中一个表的名称  我想取这个名字并选择这个表。

类似

select * from 7_DIN

所有声明

1 个答案:

答案 0 :(得分:1)

以下是一步一步的代码,您可以在this SQLFiddle中对其进行测试。

用于测试的样本表:

create table t1(n number)
/
create table t2(n number)
/
create table t13(n number)
/
insert into t1(n) values(1)
/
insert into t2(n) values(2)
/
insert into t13(n) values(13)
/

声明用作选择结果的类型,与具有动态名称的表的行类型相同:

create or replace type t_row as object(n number)
/
create or replace type t_rowlist as table of t_row
/

搜索最后一个表并从中选择数据到集合中的函数,然后将集合作为表数据返回:

create or replace function get_last_data return t_rowlist
as
  v_table varchar2(30);
  v_rows  t_rowlist;
begin

  select table_name into v_table from (
    select * from user_tables where table_name like 'T%'
    order by lpad(substr(table_name,2),40,'0') desc
  )  
  where rownum = 1;

  execute immediate 'select t_row(n) from '|| v_table
  bulk collect into v_rows;

  return v_rows;

end;
/

根据功能数据创建视图:

create or replace view last_data_view as
  select * from table(get_last_data)
/

仅当动态表没有大量数据时才能正常工作 否则最好使用流水线功能。为此,只需使用以下代码替换函数实现:

create or replace function get_last_data_pipe 
return t_rowlist pipelined
as
  v_table  varchar2(30);
  v_row    t_row;
  v_cursor sys_refcursor;
begin

  select table_name into v_table from (
    select * from user_tables where table_name like 'T%'
    order by lpad(substr(table_name,2),40,'0') desc
  )  
  where rownum = 1;

  open v_cursor for 'select t_row(n) from '|| v_table;

  loop
    fetch v_cursor into v_row;
    exit when v_cursor%notfound;
    pipe row(v_row);
  end loop;

  close v_cursor;

  return;
end;

Link来测试SQLFiddle。