1

Oracleクエリから列名と対応するテーブル名を抽出するアプローチ/コードスニペットが必要です。クエリ、および結果として列とテーブルの名前は実行時に変更され、一部の列名は通常計算されます。つまり、関数にラップされ、エイリアスが付けられます。正規表現を使用してさまざまな文字列トークン化手法を試して、予想される出力に従ってこれを分離しましたが、これまでのところ、うまくいきません! 例えば:

select mandate_name, investment_sub_team_name,
fn_sum(REG_INV_CMP_AUM) REG_INV_CMP_AUM, 
fn_sum(NON_REG_INV_CMP_AUM) NON_REG_INV_CMP_AUM
from DM_SAI_VALUATIONS_STEP3
where position_interval_type = 'E'
and position_type = 'T'
group by mandate_name, investment_sub_team_name;

列の出力を次のようにします。

mandate_name
投資サブチーム名
fn_sum(REG_INV_CMP_AUM)
fn_sum(NON_REG_INV_CMP_AUM)

上記の注: エイリアスではなく、関数を含む列が必要です

上記のすべての列に対して、テーブル名を DM_SAI_VALUATIONS_STEP3 として出力したい

クエリは xml 出力の一部であるため、編集できません。したがって、エイリアスを変更することはできません。2 番目のポイントは、クエリからテーブル名を抽出することです。列とテーブルを含むクエリは異なるため、文字列トークンの位置など、何もハードコーディングできないという事実を考慮してください。それらをトークン化するための一般的なアプローチを探しています。したがって、私が期待する列出力に対して、テーブル名も必要です..それは常にfrom句の1つのテーブルだけに行くので、それを抽出することは問題になりません.

期待される出力:

Column Name                          Table Name
-----------                          ----------
mandate_name                         DM_SAI_VALUATIONS_STEP3
investment_sub_team_name             DM_SAI_VALUATIONS_STEP3
fn_sum(REG_INV_CMP_AUM)              DM_SAI_VALUATIONS_STEP3
fn_sum(NON_REG_INV_CMP_AUM)          DM_SAI_VALUATIONS_STEP3

任意のヘルプ PR ポインターをいただければ幸いです。

4

3 に答える 3

1

また、一般的には不可能であることに同意します。しかし、おそらく解決策は、XML メッセージの作成者と連絡を取り、別のプロトコルに同意してから、SELECT事前にステートメントを完成させることです。彼がコラムを送ることに同意します。

これが不可能で、クエリがどのように作成されるかについて特定の前提を置きたい場合は、 をセパレータとして使用して、 のselect前後でトークン化できます。しかし、私が知っている限りでは、正規表現の部分文字列コマンドでは実際にそれを行うことはできません。PL/SQL関数を少し書く必要があると思います。from,

ただし、fromキーワードが選択する列の一部である可能性があることに注意してください。突然次のようなクエリを受け取ったらどうしますか。

select 
  something, 
  (select count(*) from othertable) as cnt, 
  andfromthiscolumn xyz 
from mytable

したがって、ここでの私のヒントは、組織的に整理してから、不可能なことをコーディングしようとすることです。

于 2012-08-22T18:54:10.617 に答える
0

クエリ文字列の構造があまり変わらないことがわかっている場合は、次のようにすることができます。

set serveroutput on
set termout on
clear
declare
  v_str varchar2(500) := 'select mandate_name, investment_sub_team_name,
fn_sum(REG_INV_CMP_AUM) REG_INV_CMP_AUM, 
fn_sum(NON_REG_INV_CMP_AUM) NON_REG_INV_CMP_AUM
from DM_SAI_VALUATIONS_STEP3
where position_interval_type = ''E''
and position_type = ''T''
group by mandate_name, investment_sub_team_name;';
  v_tmp varchar2(500);
  v_cols varchar2(500);
  v_table varchar2(500);
begin
  v_tmp := replace( v_str, 'select ','');
  v_tmp := substr( v_tmp, 1, instr(v_tmp, 'where')-1);

  dbms_output.put_line('original query: '||v_str);  

  v_cols := substr (v_tmp, 1, instr(v_tmp, 'from')-1);
  dbms_output.put_line('column names: '||v_cols);


  v_table := substr(v_tmp, instr(v_tmp, 'from ')+4, 500);
  dbms_output.put_line('table name: '||v_table);
end;
于 2012-08-22T18:52:18.607 に答える