0

我有一个WARNINGS_INFO表,其中包含有关特定警告消息的一些信息,例如它的代码和级别,以及一个描述如何打印输出消息的字符串。

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

假设我有一个表GENERATED_WARNINGS,其中包含从 SQL 批处理生成的所有警告:

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

另外,我还有另一个表,其中包含 columns RC并且ATTRIB显然是一个ROW_ID主键列WARN_ROW_ID

SQL 中有没有办法将STR_FORMAT字符串动态转换为包含最后一个表列中的数据的字符串?

4

1 回答 1

2

这是使用 OracleREPLACE()函数进行的一次尝试:http ://www.sqlfiddle.com/#!4/7d3c4/3

这需要对REPLACE警告消息中的每个 $variable 进行嵌套调用,因此不是通用的。对于这种事情,我认为您不应该在 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 回答