2013-10-28 76 views
0

我有一張表,其中有很多列。出於某種原因,我需要從中獲取數據,然後分別在每個列值上做一些事情。所以我想這樣做:單獨瀏覽記錄的每一列

SELECT record FROM table 
FOREACH field of the record 
    do some stuff 

的「做一些東西」的一部分,應當按照列名做一些事情。

有沒有一種簡單的方法來執行PL/SQL中的這種瀏覽?

謝謝!

回答

1

不幸的是,你不能像這樣通過記錄的字段循環。但是,您可以使用DBMS_SQL遍歷所有返回的列並執行您所需的任何操作。檢查我的下面,基於此線程簡單的例子:Loop through columns of a record with DBMS_SQL

CREATE TABLE my_iter_tab_test (
    id NUMBER, 
    name VARCHAR2(20), 
    salary NUMBER 
); 

INSERT INTO my_iter_tab_test VALUES (1, 'Smith', 5000); 
INSERT INTO my_iter_tab_test VALUES (2, 'Brown', 6000); 

COMMIT; 

DECLARE 
    v_cur NUMBER; 
    v_temp NUMBER; 
    v_col_cnt NUMBER; 
    v_desc_tab_rec DBMS_SQL.DESC_TAB; 
    v_ret NUMBER; 
    v_v_val VARCHAR2(4000); 
BEGIN 
    v_cur := DBMS_SQL.OPEN_CURSOR; 

    DBMS_SQL.PARSE(v_cur, 'SELECT * FROM my_iter_tab_test', DBMS_SQL.NATIVE); 

    v_temp := DBMS_SQL.EXECUTE(v_cur); 

    DBMS_SQL.DESCRIBE_COLUMNS(v_cur, v_col_cnt, v_desc_tab_rec); 

    FOR v_i IN 1..v_col_cnt 
    LOOP 
    dbms_output.put_line(v_desc_tab_rec(v_i).col_name); 
    DBMS_SQL.DEFINE_COLUMN(v_cur ,v_i, v_v_val, 2000); 
    END LOOP; 

    LOOP 
    v_ret := DBMS_SQL.FETCH_ROWS(v_cur); 
    EXIT WHEN v_ret = 0; 

    FOR v_i IN 1..v_col_cnt 
    LOOP 
     DBMS_SQL.COLUMN_VALUE(v_cur, v_i, v_v_val); 
     DBMS_OUTPUT.PUT_LINE(v_desc_tab_rec(v_i).col_name || ' : ' || v_v_val); 
    END LOOP; 
    END LOOP; 

    DBMS_SQL.CLOSE_CURSOR(v_cur); 
END; 

輸出:

ID 
NAME 
SALARY 
ID : 1 
NAME : Smith 
SALARY : 5000 
ID : 2 
NAME : Brown 
SALARY : 6000

我想你想改變DEFINE_COLUMN適當的類型在您的最終解決方案。

+0

謝謝,這將做的伎倆! – Backslash36

相關問題