2010-03-08 73 views
1

我想了解一些建議的方法將驗證存儲爲CSV的字段與包含適當值的表格的對比情況。儘管這是需要的,但不能將CSV列表拆分爲另一個相關表格。在下面的示例數據中,我將嘗試捕獲小部件A的代碼99.驗證列數據與另一個表存儲爲CSV

下面是一個示例數據表示形式。

Table: Widgets 

WidgetName WidgetCodeList 
A   1, 2, 3 
B   1 
C   2, 3 
D   99 

Table: WidgetCodes 

WidgetCode 
1 
2 
3 

較早的方法是查詢CSV列使用各種字符串操作和CONNECT_BY_LEVEL但是性能沒有acceptible行。

回答

1

你可以嘗試一個管道函數(這裏的橫向連接):

SQL> WITH widgets AS (
    2  SELECT 'A' WidgetName, '1, 2, 3' WidgetCodeList FROM dual 
    3  UNION ALL SELECT 'B', '1' FROM DUAL 
    4  UNION ALL SELECT 'C', '2, 3' FROM DUAL 
    5  UNION ALL SELECT 'D', '99' FROM DUAL 
    6 ), widgetcodes AS (
    7  SELECT ROWNUM widgetcode from dual CONNECT BY LEVEL <= 3 
    8 ) 
    9 SELECT w.widgetname, 
10   to_number(s.column_value) missing_widget 
11 FROM widgets w 
12   CROSS JOIN TABLE(demo_pkg.string_to_tab(w.WidgetCodeList)) s 
13 WHERE NOT EXISTS (SELECT NULL 
14      FROM widgetcodes ws 
15      WHERE ws.widgetcode = to_number(s.column_value)); 

WIDGETNAME MISSING_WIDGET 
---------- -------------- 
D      99 

該轉換字符串到表流水線功能的一個例子見this other SO

0

在PL/SQL,你可以利用的Apex實用的一個分隔的字符串轉換爲PL/SQL集合是這樣的:

procedure validate_csv (p_csv varchar2) 
is 
    v_array apex_application_global.vc_arr2; 
    v_dummy varchar2(1); 
begin 
    v_array := apex_util.string_to_table(p_csv, ', '); 
    for i in 1..v_array.count 
    loop 
     begin 
     select null 
     into v_dummy 
     from widgetcodes 
     where widgetcode = v_array(i); 
     exception 
     when no_data_found then 
      raise_application_error('Invalid widget code: '||v_array(i)); 
     end;   
    end loop; 
end;