Oracle中的参数化查询

时间:2012-11-05 12:06:43

标签: sql sql-parametrized-query

我有一个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      

此外,我还有另一个包含RCATTRIB列的表格,显然是ROW_ID所指的WARN_ROW_ID主键列。< / p>

在SQL中是否有办法使用最后一列的列中的数据动态地将STR_FORMAT字符串转换为字符串?

1 个答案:

答案 0 :(得分:2)

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

这需要对警告消息中的每个$变量嵌套调用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未找到”