我有一个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
此外,我还有另一个包含R
,C
和ATTRIB
列的表格,显然是ROW_ID
所指的WARN_ROW_ID
主键列。< / p>
在SQL中是否有办法使用最后一列的列中的数据动态地将STR_FORMAT
字符串转换为字符串?
答案 0 :(得分:2)
以下是使用Oracle REPLACE()
函数进行的一次尝试:http://www.sqlfiddle.com/#!4/7d3c4/3
这需要对警告消息中的每个$变量嵌套调用REPLACE
,因此不是通用的。对于这种事情,我认为你不应该在SQL中进行变量替换。提取警告消息以及$ R,$ C,$ ATTRIB等的值,并使用Velocity或FreeMarker等模板库进行变量替换。
鉴于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未找到”