1

テーブル Table_A から列を選択する必要がありますが、同じスキーマ Table_B を持つ別のテーブルがあります。クエリは、from テーブルを動的に決定する必要があります。例のために。Table_A にさらに行がある場合は Table_A を使用し、それ以外の場合は Table_B を使用します。

この select employee、salary、id from ( condition to count rows and select the table )table;のようなクエリを実行します。

これは、カーソルと EXECUTE IMMEDIATE を使用せずに可能ですか??.

4

2 に答える 2

2

通常、このようなことには動的 SQL を使用します。それには、DBMS_SQLパッケージを使用するかEXECUTE IMMEDIATEOPEN <<cursor>> FOR <<SQL statement string>>.

本当に静的 SQL を使用したい場合は、両方のテーブルにクエリを実行して、1 セットの結果のみを返すことができます。これが本当に理にかなっている状況を想像することはできませんが、あなたは確かにそれを行うことができます

FOOとテーブルを作成しFOO2ます。 FOO22行から1行までありますFOO

SQL> create table foo( col1 number );

Table created.

SQL> create table foo2( col1 number );

Table created.

SQL> insert into foo values( 1 );

1 row created.

SQL> insert into foo2 values( 1 );

1 row created.

SQL> insert into foo2 values( 2 );

1 row created.

クエリを実行します。これにより、すべてのデータが返されますFOO2

SQL> ed
Wrote file afiedt.buf

  1  select col1
  2    from (select the_union.*,
  3                 max(cnt) over () max_cnt
  4            from (select col1, count(*) over () cnt from foo
  5                  union all
  6                  select col1, count(*) over () from foo2) the_union)
  7*  where cnt = max_cnt
SQL> /

      COL1
----------
         1
         2

にさらに行を挿入しますFOO。これで、同じクエリですべてのデータが返されますFOO

SQL> insert into foo values( 3 );

1 row created.

SQL> insert into foo values( 5 );

1 row created.

SQL> commit;

Commit complete.

SQL> select col1
  2    from (select the_union.*,
  3                 max(cnt) over () max_cnt
  4            from (select col1, count(*) over () cnt from foo
  5                  union all
  6                  select col1, count(*) over () from foo2) the_union)
  7   where cnt = max_cnt;

      COL1
----------
         1
         3
         5

しかし、私が言ったように、これを行うことが実際に理にかなっている状況を理解することはできません.

于 2012-12-04T19:45:25.450 に答える
0

あなたが本当にやろうとしていることは完全に推測していますが、同義語を使いたいと思っています。TableA と TableB を使用する必要がある場合にトリガーされる何らかのイベントがあると推測しています。TableA を指すシノニム "my_table" を作成し、ビューを "my_table" から選択します。次に、ビューが代わりに TableB を指すようにするときはいつでも、シノニムを TableB を指すように切り替えるだけで、ビューに対して何もする必要はありません。

詳細については、コンセプト ガイドの同義語を参照してください。

于 2012-12-04T21:09:34.547 に答える