2013-03-19 51 views
2

有人可以澄清下面的PL/SQL代碼在做什麼?它看起來好像assets_type是base_Asset的表。這是否使它成爲一張桌子?這是PL/SQL表中的表(如果不是這樣的代碼是怎麼回事?)

我有困難的時候,這個可視化時,彗星填充數據:

assets(v_ref_key)(dbfields(i).field) := rtrim(replace(strbuf_long2,'''','''''')); 

這是類似於二維數組?這是否意味着填充索引爲v_ref_key的資產(臨時)表中的字段列?

PROCEDURE LOAD 
IS 

TYPE dbfields_rec IS RECORD (field   dbfields.field%TYPE, 
         article_title dbfields.title%TYPE, 
         image_title dbfields.title%TYPE); 
TYPE dbfields_type IS TABLE OF dbfields_rec INDEX BY BINARY_INTEGER; 
TYPE base_Asset IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(32); 
TYPE assets_type IS TABLE OF asset_type INDEX BY VARCHAR2(4000); 
dbfields      dbfields_type; 
assets     assets_type; 
v_ref_key    assets.ref_key%TYPE; 


-- CLIPPED Populate dbfields array code 
-- It correctly populates 

    FOR i IN 1..dbfields.COUNT LOOP 
    BEGIN 
     sqlbuf := '(select rtrim(ufld3), ' || dbfields(i).field || 
        ' as col_label from assetstable ' || 
         ' where rtrim(ufld3) = ' || '''' || in_id || '''' || ')'; 
     OPEN assets_cur FOR 
      sqlbuf; 
     LOOP 
      FETCH assets_cur INTO v_ref_key, strbuf_long2; 
      EXIT WHEN assets_cur%NOTFOUND;     

      IF (trim(strbuf_long2) is not null and dbfields(i).field is not null) THEN 
      assets(v_ref_key) (dbfields(i).field) 
       := rtrim(replace(strbuf_long2,'''','''''')); 
      END IF; 
     END LOOP; 
     close assets_cur; 
    END; 
    END LOOP; 
END LOAD; 
+2

甜蜜的憐憫...... – 2013-03-19 18:24:00

+1

「asset_type」在哪裏定義?我沒有在聲明中看到它。 – OldProgrammer 2013-03-19 21:02:22

+0

這看起來很像處理EAV風格的數據庫模式所需的那種代碼。 「dbfields」等 – 2013-03-20 03:13:53

回答

3

PL/SQL確實只提供一維數組 - 但在陣列中的每個元素允許是另一個數組,如果你想的是像多維數組的人。

下面是一個非常人爲的例子來說明:

DECLARE 

    TYPE rows_type IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(4000); 

    TYPE spreadsheet_type IS TABLE OF row_type INDEX BY VARCHAR2(4000); 

    spreadsheet spreadsheet_type; 

BEGIN 

    spreadsheet ('row 1') ('column A') := 'XYZ'; 

END; 

第一('row 1')被索引到spreadsheet_type陣列,這將保持爲特定的「行」中的所有列;而第二個('column A')是rows_type數組的索引。

這個實現的「多維」方面並不完美,但是:當你可以用一整排的工作,如果你想要的,如:

my_row rows_type; 
... 
my_row := spreadsheet ('row 1'); 

你不能挑選特定列 - 沒有辦法將特定索引的行中的所有元素的集合引用到rows_type中。你必須做一些事情,比如創建另一個類型並循環遍歷第一個數組。

相關問題