0

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

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

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

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

谢谢 !

4

1 回答 1

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
姓名
薪水
编号:1
姓名:史密斯
薪水:5000
编号:2
名称:棕色
薪水:6000

我猜你会想DEFINE_COLUMN在你的最终解决方案中将其更改为适当的类型。

于 2013-10-28T17:54:54.597 回答