【问题标题】:Browsing each column of a record separately分别浏览记录的每一列
【发布时间】:2013-10-29 01:54:54
【问题描述】:

我有一个包含 很多 列的表格。出于某种原因,我需要从中获取数据,然后分别对每个列值执行一些操作。所以我想做这样的事情:

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

“做一些事情”部分应该根据列名做一些事情。

有没有一种简单的方法可以在 PL/SQL 中执行这种浏览?

谢谢!

【问题讨论】:

    标签: plsql


    【解决方案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;
    

    输出:

    身份证
    姓名
    薪水
    编号:1
    姓名:史密斯
    薪水:5000
    编号:2
    名称:棕色
    工资:6000

    我猜您可能希望在最终解决方案中将 DEFINE_COLUMN 更改为正确的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多