これはまだ100%ネイティブSQLでは実行できません。これらの過度に動的な状況は、通常回避するのが最善です。複雑なコードの を追加するよりも少し余分なタイピングが一般的に優れています。
本当に例外的なケースがあり、そこに価格を支払うつもりなら、はです。 100%天然SQLは使用しませんが、Oracle Data Cartridgeフレームワークを使用してデータベースを拡張するため、「純粋な」SQLと見なすことができます。
私のオープンソースプロジェクトMethod4を使用して、SQLで動的SQLを実行できます。 Githubの手順に従って、オブジェクトをダウンロードしてインストールします。コードは辛いほど複雑ですが、運良くあなたはそのほとんどを理解する必要はありません。列名のカスタマイズを開始するには、以下の簡単な変更だけが必要です。
法4変更
新しい列名を保持する変数を作成します。それをファイルMETHOD4_OT.TPBの12行目の関数ODCITableDescribeの宣言セクションに追加します。
v_new_column_name varchar2(32);
古い列を新しい列にマップするSQL文を作成します。これを行31に追加します。行31では、列ごとに実行されます。新しい変数名を参照するために
--Get mapped column name if it exists. If none, use the existing name.
select nvl(max(target_column_name), r_sql.description(i).col_name)
into v_new_column_name
from column_names
where source_column_name = r_sql.description(i).col_name;
変更行42:今
substr(v_new_column_name, 1, 30),
マッピング表
drop table column_names;
create table column_names
(
source_column_name varchar2(30),
target_column_name varchar2(30),
constraint column_names_pk primary key(source_column_name)
);
insert into column_names values('A1234', 'BETTER_COLUMN_NAME');
insert into column_names values('B4321', 'Case sensitive column name.');
クエリ例
いずれかからの列名キューあなたが望むどんな値にでも魔法のように変更することができます。これは単純にテキスト置換を使用するのではありません。 *
の列も変更されます。
SQL> select * from table(method4.query('select 1 a1234, 2 b4321, 3 c from dual'));
BETTER_COLUMN_NAME Case sensitive column name. C
------------------ --------------------------- ----------
1 2 3
警告が
OracleのSQLは、恐ろしく複雑で、それは多くの潜在的な問題を抱えている場合は上の層を構築する試みです。たとえば、パフォーマンスは確かに遅くなります。私は多くの単体テストを作成しましたが、正しく動作しない奇妙なデータ型があると確信しています。 (しかし、見つけたら、Githubの問題を作成して修正してください。)
私の経験上、人々はこのタイプの動的な行動を求めるときには、通常はその価値がありません。時には少し余分なタイピングが最善の解決策です。
ありがとうJon!私はあなたの返信に時間をかけていただきありがとうございます&このショットを与えるでしょう。私が動的な解決策を探している理由は、このクエリを実行する必要があるたびに(それはしばしばですが)、新しい列名を持つ新しい表に対してです。 –