2016-04-28 158 views
0

我有一個需要查詢數據庫;從遊標中獲取,然後將這些數據放入嵌套表中。將此嵌套表放入另一個由ID索引的嵌套表中。PLSQL函數聲明嵌套表

的代碼如下:

FUNCTION get_all_dna_sample_data (db_numbers IN TYPES.batch_numbers) 
     RETURN TYPES.all_sample_tag_data 
    IS 

     TYPE REVERSE_BATCH_LOOKUP IS TABLE OF VARCHAR2(256) INDEX BY VARCHAR2(256); 
     reverse_batch_numbers REVERSE_BATCH_LOOKUP; 
     TYPE CUR_TYP is REF CURSOR; 
     c CUR_TYP; 
     db_ids   BATCH_IDS; 
     sample_id  VARCHAR2(256); 
     db_id   VARCHAR2(256); 
     dna_batch_id VARCHAR2 (256); 
     construct_id VARCHAR2 (256); 
     vr_ids   VARCHAR2 (256); 
     project_names VARCHAR2 (256); 
     concentration NUMBER; 
     volume   NUMBER; 
     all_tag_data TYPES.all_sample_tag_data; 
     sample_tag_data  TYPES.TAG_DATA; 
     sql_query  VARCHAR2 (1024); 

     loop_count  NUMBER; 
    BEGIN 

     db_ids := BATCH_IDS(); 
     loop_count := 1; 
     sample_id := db_numbers.FIRST; 
     UTILS.DEBUG_OUTPUT('Setting table size to ' || TO_CHAR(db_numbers.COUNT)); 
     db_ids.EXTEND(db_numbers.COUNT); 
     UTILS.DEBUG_OUTPUT('Table size is ' || TO_CHAR(db_ids.COUNT)); 

     LOOP 
      EXIT WHEN sample_id IS NULL; 
      UTILS.DEBUG_OUTPUT(sample_id || ' ' || db_numbers(sample_id)); 
      db_ids(loop_count) := db_numbers(sample_id); 
      sample_id := db_numbers.NEXT(sample_id); 
      reverse_batch_numbers(db_numbers(sample_id)) := sample_id; 
      loop_count := loop_count + 1; 
     END LOOP; 

     sql_query := 'SELECT dna_batch_id, 
      construct_id, 
      vr_ids, 
      project_names, 
      concentration, 
      volume 
     FROM ' || ucb_dna_data_table || ' d ' 
     || ' WHERE d.dna_batch_id MEMBER OF (:db_coll)'; 

     UTILS.DEBUG_OUTPUT ('query is ' || sql_query); 
     OPEN c FOR sql_query USING db_ids; 

     LOOP 
     FETCH c INTO dna_batch_id, construct_id, vr_ids, 
      project_names, concentration, volume; 
     --here we need to create a new tag_data collection 
     sample_tag_data := TYPES.TAG_DATA(); 
     sample_tag_data(TYPES.dna_batch_id_tag_name) := dna_batch_id; 
     sample_tag_data(TYPES.construct_id_tag_name) := construct_id; 
     sample_tag_data(TYPES.vr_ids_tag_name) := vr_ids; 
     sample_tag_data(TYPES.project_names_tag_name) := project_names; 
     sample_tag_data(TYPES.concentration_tag_name) := TO_CHAR(concentration); 
     sample_tag_data(TYPES.volume_tag_name) := TO_CHAR(volume); 
     all_tag_data(reverse_batch_numbers(dna_batch_id)) := tag_data; 
     EXIT WHEN c%NOTFOUND; 
     END LOOP; 

     RETURN all_tag_data; 
    END; 

基本上;這完全是一個簡單的問題 - 如何在代碼的中途創建一個新的嵌套表,這樣我就可以繼續創建新的集合對象並將它們放入返回的數據中。只需調用sample_tag_data:= TYPES.TAG_DATA();確實有效。

非常感謝您的幫助。

+0

你什麼錯誤?如何定義'tag_data'?從你如何使用它,它看起來像一個記錄類型,而不是嵌套表。 –

回答

1

Using PL/SQL Collections and Records 問題是什麼是TYPES.TAG_DATA?如果這是一個索引表(由VARCHAR2(...)VARCHAR2的表(...)指數),只需刪除該

sample_tag_data := TYPES.TAG_DATA(); 

,它應該工作,位數據將在每次更換取?! 如果你想sample_tag_data存儲到all_tag_data每個(與all_tag_data是索引表)獲取,增加新的變量

null_tag_data TYPES.TAG_DATA; 

變化「sample_tag_data:= TYPES.TAG_DATA();」用:

sample_tag_data := null_tag_data; 

和 'all_tag_data(reverse_batch_numbers(dna_batch_id)):= tag_data;'與:

all_tag_data (reverse_batch_numbers (dna_batch_id)) := sample_tag_data; 

如果使用嵌套表,則不能像索引表一樣使用它們。他們沒有索引。

一個小樣本,來說明,我的意思:

DECLARE 
    TYPE t_tag_names IS RECORD 
    (
     dna_batch_id_tag_name VARCHAR2 (40), 
     construct_id_tag_name VARCHAR2 (40), 
     vr_ids_tag_name   VARCHAR2 (40), 
     project_names_tag_name VARCHAR2 (40) 
    ); 

    TYPE t1 IS TABLE OF NUMBER 
     INDEX BY VARCHAR2 (20); 

    TYPE t2 IS TABLE OF t1 
     INDEX BY VARCHAR2 (20); 

    tag_names t_tag_names; 
    x   t1; 
    null_x  t1; 
    y   t2; 
BEGIN 
    tag_names.dna_batch_id_tag_name := 'batch_tag'; 
    tag_names.construct_id_tag_name := 'construct'; 
    tag_names.vr_ids_tag_name := 'vr'; 
    tag_names.project_names_tag_name := 'project'; 

    FOR i IN 1 .. 3 
    LOOP 
     x := null_x; 
     x (tag_names.dna_batch_id_tag_name) := 5 * i; 

     IF MOD (i, 2) <> 0 THEN 
     x (tag_names.construct_id_tag_name) := 2 * i; 
     END IF; 

     x (tag_names.vr_ids_tag_name) := i; 
     x (tag_names.project_names_tag_name) := 7 * i; 
     y (TO_CHAR (i)) := x; 
    END LOOP; 

    FOR i IN 1 .. 3 
    LOOP 
     x := y (i); 
     DBMS_OUTPUT.put (tag_names.dna_batch_id_tag_name || ':' || x (tag_names.dna_batch_id_tag_name) || ' '); 

     IF x.EXISTS (tag_names.construct_id_tag_name) THEN 
     DBMS_OUTPUT.put (tag_names.construct_id_tag_name || ':' || x (tag_names.construct_id_tag_name) || ' '); 
     END IF; 

     DBMS_OUTPUT.put_line (tag_names.vr_ids_tag_name || ':' || x (tag_names.vr_ids_tag_name) || ' ' || tag_names.project_names_tag_name || x (tag_names.project_names_tag_name)); 
    END LOOP; 
END; 
0

可能是你的意思是:

all_tag_data.EXTEND; 
all_tag_data (all_tag_data.LAST) := sample_tag_data ;