0

WARNINGS_INFOコードやレベルなどの特定の警告メッセージに関する情報と、出力メッセージの印刷方法を説明する文字列を含むテーブルがあります。

  ID  |     CODE       | LEVEL | STR_FORMAT
------|----------------|-------|----------------------------------------------
  5   | attrib_missing |   3   | On cell $R:$C, attribute $ATTRIB not found

GENERATED_WARNINGSSQLバッチから生成されたすべての警告を含むテーブルがあると仮定します。

  WARN_ID  |  WARN_ROW_ID   
-----------|---------------
    5      |      32      

Rまた、列を持つ別のテーブルがCありATTRIB、明らかに、ROW_IDを参照する主キー列がありWARN_ROW_IDます。

STR_FORMATSQLに、最後のテーブルの列のデータを使用して文字列を文字列に動的に変換する方法はありますか?

4

1 に答える 1

2

OracleREPLACE()関数を使用した1つの刺し傷は次のとおりです。http ://www.sqlfiddle.com/#!4 / 7d3c4 / 3

これには、警告メッセージの$ variableごとにネストされた呼び出しが必要であるREPLACEため、汎用ではありません。この種のことについては、SQLで変数の置換を行うべきではないと思います。警告メッセージと$R、$ C、$ ATTRIBなどの値を抽出し、VelocityFreeMarkerなどのテンプレートライブラリを使用して変数の置換を行います。

与えられたDDL:

create table WARNINGS_INFO (
  ID INTEGER PRIMARY KEY,
  C_CODE VARCHAR2(20),
  I_LEVEL INTEGER,
  STR_FORMAT VARCHAR2(255)
);

insert into WARNINGS_INFO values (
  5, 'attrib_missing', 3, 'On cell $R:$C attribute $ATTRIB not found'
);

create table GENERATED_WARNINGS (
  WARN_ID INTEGER NOT NULL,
  WARN_ROW_ID INTEGER
);

insert into GENERATED_WARNINGS values (5, 32);

create table WARNING_MAP (
  ROW_ID INTEGER PRIMARY KEY,
  R INTEGER,
  C INTEGER,
  ATTRIB VARCHAR2(20)
);

insert into WARNING_MAP values (32, 42, 99, 'FOOBAR');

次のクエリは、パラメータの置換を行います。

select
  replace(
    replace(
      replace(str_format, '$R', wm.r),
      '$C', wm.c),
    '$ATTRIB', wm.attrib) as formatted
from warnings_info wi
join generated_warnings gw on wi.id = gw.warn_id
join warning_map wm on wm.row_id = gw.warn_row_id
;

これからの出力は次のようになります:「セル42:99に属性FOOBARが見つかりません」

于 2012-11-05T16:47:08.923 に答える