2016-07-14 11 views
3

他のテーブルの名前を格納するテーブルがあります。同様他のテーブルから名前を取得したテーブルに対してsqlクエリを実行する方法

COL_TAB 
-------------- 
TABLE_NAME 
-------------- 
TAB1 
TAB2 
TAB3 

私は何をしたい、私はこのようなテーブル上のSQLクエリを実行したい、ということ

SELECT * FROM (SELECT TABLE_NAME from COL_TAB WHERE TABLE_NAME = 'TAB1') 

おかげ

+0

SQLブロックを試すことができます。 –

+0

手続きでは簡単にこれを行うことができます。手順なしでこれを行う方法はありますか? – Pirate

+2

いいえ、ありません。 SQLでは、文が実際に実行される前にすべての表(および列)が認識されている必要があります(実際には悪い設計のような音が必要なデータベース・モデル)。 –

答えて

1

ダイナミックを使用できるOracle SQLクエリですOracle Data CartridgeとANY *タイプを使用して、表名を作成します。しかし、これらの高度な機能を使用する前に、一歩踏み込んで、これが本当に必要かどうかを尋ねてください。

本当にというSQLのステートメントがその動的である必要がありますか?通常、これは、異なるタイプの照会を提出できるアプリケーションによって処理される方が適しています。予期しないタイプを処理できる多くのアプリケーションプログラミング言語とツールキットがあります。これがデータベース専用操作の場合は、通常は結果がどこかに格納されます。この場合、PL/SQLと動的SQLははるかに簡単です。

完全に動的なSQL文が必要なまれなケースがあると確信できるなら、私のオープンソースプロジェクトMethod4のようなものが必要になります。ダウンロードしてインストールし、以下のコードを試してください。

スキーマのセットアップ

create table tab1(a number); 
create table tab2(b number); 
create table tab3(c number); 
insert into tab1 values(10); 
insert into tab2 values(20); 
insert into tab3 values(30); 
create table col_tab(table_name varchar2(30), id number); 
insert into col_tab values('TAB1', 1); 
insert into col_tab values('TAB1', 2); 
insert into col_tab values('TAB1', 3); 
commit; 

クエリ

select * from table(method4.dynamic_query(
q'[ 
    select 'select * from '||table_name sql 
    from col_tab 
    where id = 1 
]')); 

結果:

A 
-- 
10 

あなたは、クエリ内のクエリは非常に困難であることをすぐに発見するでしょう。これを実行する方がずっと簡単ですが、設計変更が必要な場合があります。

+0

クエリから条件を削除するとどうなりますか? selectクエリはすべてのテーブルで実行されますか? – Pirate

+0

はい、複数のテーブルで動作します。ただし、列の型は各行で同じでなければなりません。 –

0

私はこれをテストするために手でデータベースを持っていないが、私はあなたがこのような何かを探していると思う:

DECLARE 
    -- Create a cursor on the table you are looking through. 
    CURSOR curTable IS 
     SELECT * 
     FROM MainTable; 

    recTable curTable%ROWTYPE; 
    vcQuery  VARCHAR2(100); 
BEGIN 
    -- Loop through all rows of MainTable. 
    OPEN curTable; 
    LOOP 
     FETCH curTable INTO recTable; 
     EXIT WHEN curTable%NOTFOUND; 

     -- Set up a dynamic query, with a WHERE example. 
     vcQuery := 'SELECT ColumnA, ColumnB FROM ' || recTable.Table_Name || ' WHERE 1 = 1'; 

     -- Execute the query. 
     OPEN :dyn_cur FOR vcQuery; 
    END LOOP; 
    CLOSE curTable; 
END; 
/
-1

この

CREATE OR REPLACE PROCEDURE TEST IS 
    sql_stmt VARCHAR2(200); 
    V_NAME  VARCHAR2(20); 
BEGIN 
    sql_stmt := 'SELECT * FROM '; 
    EXECUTE IMMEDIATE sql_stmt|| V_NAME; 
END; 

アップデートをお試しください select文はプロシージャでは機能しません。 SQL Serverの中

あなたはあなたがそれを行うための手順や機能の動的SQLが必要

Declare @name varchar2(50) 

Select @name='Select * from '+TABLE_NAME from COL_TAB WHERE TABLE_NAME = 'TAB1' 

EXEC(@name); 
+0

ええ、私は手順を使用せずにそれをしたいです。 – Pirate

+1

それは動作しません。 PL/SQLのどこかに結果を格納せずに、ストアド・プロシージャ内で単に 'SELECT'文を実行することはできません。少なくとも、参照カーソルなどが必要です。 –

+0

はい、select文はプロシージャでは機能しません。 SQL Serverで あなたはSQLブロックを試すことができます 宣言@nameのVARCHAR2(50) 選択@名= 'SELECT *から' + TABLE_NAME COL_TABからTABLE_NAME = 'TAB1' EXEC(@name)。 – user2101963

関連する問題