0

これは可能ですか?ORACLE 10g を使用しています。

例: A01、A02、A03、A04........A50 という名前の 50 個のテーブルがあります。

そして、これらすべてのテーブルには「同じ列名」があります。例: 名前、年齢、場所

(注: 列名は同じですが、列の値は異なります)。

ENDで...列からすべてのデータを表示したい:名前、年齢、場所から文字Aで始まるすべてのテーブル。

(注 2: 文字 A で始まるすべてのテーブルは静的ではありません。動的であるため、さまざまな変更が発生する可能性があります。例: A01 から A10 を削除し、A99 を追加することができます)。

明確にしておらず申し訳ありません。

4

4 に答える 4

2
DECLARE
  TYPE CurTyp IS REF CURSOR;
  v_cursor    CurTyp;
  v_record    A01%ROWTYPE;
  v_stmt_str  VARCHAR2(4000);
BEGIN
  for rec in (
      select table_name 
      from user_tables 
      where table_name like 'A%'
  ) loop
    if v_stmt_str is not null then
      v_stmt_str := v_stmt_str || ' union all ';
    end if;
    v_stmt_str := v_stmt_str || 'SELECT * FROM ' || rec.table_name;
  end loop;

  OPEN v_cursor FOR v_stmt_str;

  LOOP
    FETCH v_cursor INTO v_record;
    EXIT WHEN v_cursor%NOTFOUND;
    -- Read values v_record.name, v_record.age, v_record.location
    -- Do something with them
  END LOOP;

  CLOSE v_cursor;
END;
于 2013-03-11T03:46:30.597 に答える
0

これにより、必要なすべてのテーブルが返されます。

select table_name
from user_tables
where table_name like 'A__';

これから、次のように動的 SQL ステートメントを作成できます。

select listagg('select * from '||table_name,' union all ') within group(order by table_name)
from user_tables
where table_name like 'A__'

これは、すべてのテーブルとユニオンを含む SQL ステートメントを実際に返します。

select * from A01 union all select * from A02 union all select * from A03

最後に、ネイティブの動的 SQL を介してこれを実行します。PL/SQLでそれを行うことができるので、関数が必要です:

create function getA
    query varchar2(32000);
begin
    select listagg('select * from '||table_name,' union all ') within group(order by table_name)
    into query
    from user_tables
    where table_name like 'A__';
    open res for query;
    return res;
end;

手動で行っていることは基本的にパーティショニングと呼ばれることに注意してください.Oracleは、すぐに使用できる非常に優れたサポートをすでに提供しています. つまり、超巨大なテーブルのように見えるものを持つことができますが、技術的には、パーティション分割基準によって分割された一連の小さなテーブル (および小さなインデックス) として格納されます。たとえば、何百万もの支払いレコードがある場合、それを年ごとに分割することができます。この方法では、1 つの物理テーブルに適切なデータ セットのみが含まれます。それでも、これを自由に選択できます。他のパーティションからデータをヒットしている場合は、Oracle がそれらを引き込みます。

于 2016-03-17T00:29:59.477 に答える
0

私の理解によると、Aで始まるテーブルのすべての列名を表示したい場合は、以下を試してください

select column_name,table_name from user_tab_cols where table_name like 'A%';

要件がそれ以外の場合は、明確に指定してください。

于 2013-03-11T02:42:24.143 に答える
0

あなたが正しく理解し、テーブルの数が一定である場合は、VIEW一度作成できます

CREATE VIEW vw_all
AS
SELECT name, age, location FROM A01
 UNION ALL
SELECT name, age, location FROM A01
 UNION ALL
...
SELECT name, age, location FROM A50
 UNION ALL

そして、それを使用してください

SELECT * 
  FROM vw_all
 WHERE age < 35
 ORDER BY name
于 2013-03-11T02:49:48.333 に答える