oracle 动态添加字段名,oracle – 如何动态获取记录中的字段名称和值

这是一种方法.包规范包含一个变量,其类型与我们将在过程中使用的变量匹配.

SQL> set serveroutput on

SQL> create or replace package pkg_xxx

2 as

3 dept_rec dept%rowtype;

4 end;

5 /

Package created.

SQL> create or replace procedure xxx (pi_record in dept%rowtype)

2 as

3 text varchar2 (10000) := null;

4 l_str varchar2 (200);

5 l_var varchar2 (200);

6 begin

7 pkg_xxx.dept_rec := pi_record;

8

9 for cur_r in ( select column_name

10 from user_tab_columns

11 where table_name = 'DEPT'

12 order by column_id)

13 loop

14 l_str :=

15 'begin '

16 || ':x := to_char(pkg_xxx.dept_rec.'

17 || cur_r.column_name

18 || '); '

19 || 'end; ';

20

21 execute immediate l_str using out l_var;

22

23 text := text || chr (10) || cur_r.column_name || ' = ' || l_var;

24 end loop;

25

26 dbms_output.put_line (text);

27 end;

28 /

Procedure created.

现在,让我们将一些东西传递给程序,看看会发生什么:

SQL> declare

2 cursor c1

3 is

4 select *

5 from dept

6 where deptno = 10;

7

8 c1r c1%rowtype;

9 begin

10 open c1;

11 fetch c1 into c1r;

12 close c1;

13

14 xxx (c1r);

15 end;

16 /

DEPTNO = 10

DNAME = ACCOUNTING

LOC = NEW YORK

PL/SQL procedure successfully completed.

SQL>

嗯,有点作品(如果这就是你问的那个).当然,这只是一个例子,如果你想获得一些非常聪明的东西,你必须修改它(提示:DATE列).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用的是 Oracle 数据库,并且在表的字段定义添加文注释,那么在使用 JDBC API 获取列名时,会返回文注释而不是字段名。 这是因为 Oracle 数据库,列名和列注释是分开存储的。JDBC API 获取列名时,使用的是 `ALL_TAB_COLUMNS` 视图,而该视图的 `COLUMN_NAME` 列对应的是列的注释,而不是列名。如果您需要获取列名而不是注释,可以使用 `ALL_TAB_COLS` 视图,该视图的 `COLUMN_NAME` 列对应的是列名。 以下是一些示例代码: ```java // 假设您已经连接到了数据库,使用了 PreparedStatement 执行 SQL 查询 PreparedStatement statement = connection.prepareStatement("SELECT * FROM my_table"); // 获取 ResultSetMetaData 对象,使用它来获取列名 ResultSetMetaData metaData = statement.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { // 使用 ALL_TAB_COLS 视图获取列名 String columnName = metaData.getTableName(i) + "." + metaData.getColumnName(i); // 处理列名,比如输出到控制台 System.out.print(columnName + "\t"); } System.out.println(); // 遍历查询结果数据 ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { // 使用 ResultSet 对象获取数据,可以使用列名或者列的索引 String column1Data = resultSet.getString("column1"); int column2Data = resultSet.getInt(2); // 处理数据,比如输出到控制台 System.out.println(column1Data + "\t" + column2Data); } // 记得关闭 ResultSet 和 PreparedStatement 对象 resultSet.close(); statement.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值