Plsql 遍历rowtype变量的字段
我从tablePlsql 遍历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 *
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。目前看来,这是一个可靠的解决办法。