2012-11-05 206 views
0

我有一個WARNINGS_INFO表,它包含有關特定警告消息(如代碼和級別)的一些信息以及描述如何打印輸出消息的字符串。在Oracle中的參數化查詢

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指的是。

SQL中有沒有一種方法可以動態地將STR_FORMAT字符串轉換爲字符串,並使用最後一個表的列中的數據?

回答

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找不到」

+0

感謝您的非常完整的答案。實際上,我的想法是動態地用'SOMETHING'列值替換'$ SOMETHING'。不幸的是,你的解決方案需要我事先知道所有'$ variables',我不知道。 – Teejay

+1

是的,我認爲那會是問題,這就是我說的「不是普通目的」時所指的。我無法想出一個合理的方式來在SQL中執行此操作,對不起。 –

+0

感謝您的貢獻:)我會在代碼級別上做到這一點,因爲此刻我不能使用外部庫。 – Teejay