Plsql 遍历rowtype变量的字段

Plsql 遍历rowtype变量的字段,plsql,Plsql,我从tablesome\u table中选择了一行,并将其放入rowtype变量l\u current。现在,我想从头到尾遍历该变量中的字段,并获取字段名和值。 在下面的代码片段中,我在注释部分写下了我想用plsql做什么,但找不到如何做 declare l_current some_table%rowtype; begin for i in l_records.first .. l_records.last loop select *

我从table
some\u table
中选择了一行,并将其放入rowtype变量
l\u current
。现在,我想从头到尾遍历该变量中的字段,并获取字段名和值。 在下面的代码片段中,我在注释部分写下了我想用plsql做什么,但找不到如何做

declare
    l_current   some_table%rowtype;
begin
    for i in l_records.first .. l_records.last 
    loop
      select *
        into l_current
        from some_table
       where id = l_records(i).id;
--*******************
       for each field in l_current
       loop
         a := field.name;
         b := field.value;
       end loop;
--*******************
    end loop;
end;

因此,经过一点研究,我已经成功地实现了我想要的,但使用DBMS_SQL包的方式完全不同。下面是一个工作示例的片段:

      l_sql := '';
      l_sql := l_sql || 'select * ';
      l_sql := l_sql || '  from some_table where id = ' || l_records(i).ekd_id;

      l_cursorID := DBMS_SQL.OPEN_CURSOR;
      dbms_sql.parse( l_cursorID, l_sql, dbms_sql.native );
      dbms_sql.describe_columns( l_cursorID, l_column_count, l_descTbl );

      for j in 1..l_column_count
      loop
        dbms_sql.define_column( l_cursorID, j, l_columnValue, 2000 );
        l_key := l_descTbl(j).col_name;
        l_table(j + (l_counter * l_column_count)).kre_id := l_records(i).kre_id; --i + (l_counter * l_column_count)
        l_table(j + (l_counter * l_column_count)).field_id := j;
        l_table(j + (l_counter * l_column_count)).field_name := l_key;
      end loop;

      l_status := dbms_sql.execute(l_cursorID);
      l_status := DBMS_SQL.FETCH_ROWS(l_cursorID);

      for k in 1..l_column_count
      loop
        dbms_sql.column_value( l_cursorID, k, l_columnValue );
        l_value := l_columnValue;
        l_table(k + (l_counter * l_column_count)).field_value1 := l_value;
      end loop;

      DBMS_SQL.CLOSE_CURSOR(l_cursorID);

希望有人会觉得这很有用。

所以经过一点研究,我成功地实现了我想要的,但使用DBMS\U SQL包的方式完全不同。下面是一个工作示例的片段:

      l_sql := '';
      l_sql := l_sql || 'select * ';
      l_sql := l_sql || '  from some_table where id = ' || l_records(i).ekd_id;

      l_cursorID := DBMS_SQL.OPEN_CURSOR;
      dbms_sql.parse( l_cursorID, l_sql, dbms_sql.native );
      dbms_sql.describe_columns( l_cursorID, l_column_count, l_descTbl );

      for j in 1..l_column_count
      loop
        dbms_sql.define_column( l_cursorID, j, l_columnValue, 2000 );
        l_key := l_descTbl(j).col_name;
        l_table(j + (l_counter * l_column_count)).kre_id := l_records(i).kre_id; --i + (l_counter * l_column_count)
        l_table(j + (l_counter * l_column_count)).field_id := j;
        l_table(j + (l_counter * l_column_count)).field_name := l_key;
      end loop;

      l_status := dbms_sql.execute(l_cursorID);
      l_status := DBMS_SQL.FETCH_ROWS(l_cursorID);

      for k in 1..l_column_count
      loop
        dbms_sql.column_value( l_cursorID, k, l_columnValue );
        l_value := l_columnValue;
        l_table(k + (l_counter * l_column_count)).field_value1 := l_value;
      end loop;

      DBMS_SQL.CLOSE_CURSOR(l_cursorID);

希望有人会觉得这很有用。

PL/SQL语言没有这种类型的自省功能。您可以使用将光标解析为其列,并使用该类型做一些有趣的事情,但是PL/SQL希望在编译时知道它的记录类型。我自己从来没有这样做过,但我看到过使用Java(或任何其他可以连接到Oracle的语言)以编程方式生成记录操作PL/SQL代码的场景@WilliamRobertson是的,我正在研究:dbms\u sql.define\u column和dbms\u sql.column\u value。目前,这似乎是一个可靠的解决方法。PL/SQL语言没有这种类型的自省功能。您可以使用将光标解析为其列,并使用该类型做一些有趣的事情,但是PL/SQL希望在编译时知道它的记录类型。我自己从来没有这样做过,但我看到过使用Java(或任何其他可以连接到Oracle的语言)以编程方式生成记录操作PL/SQL代码的场景@WilliamRobertson是的,我正在研究:dbms\u sql.define\u column和dbms\u sql.column\u value。目前看来,这是一个可靠的解决办法。