设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: google 娱乐 服务 百度
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2021-05-14 12:06 所属栏目:[站长百科] 来源:网络整理
导读:我有一个过程,它接收170列的记录作为输入参数(它基于表的结构). 在该过程中,我想调用一个调试过程,其中一个参数是一个包含该记录的所有字段名称和值的文本字符串. 例如: CREATE OR REPLACE PROCEDURE xxx (pi_record IN table_name%ROWTYPE) as text VARC

我有一个过程,它接收170列的记录作为输入参数(它基于表的结构).

在该过程中,我想调用一个调试过程,其中一个参数是一个包含该记录的所有字段名称和值的文本字符串.

例如:

CREATE OR REPLACE PROCEDURE xxx (pi_record IN table_name%ROWTYPE) as
    text VARCHAR2(10000) := NULL;
BEGIN
    ...
    text := 'pi_record.column1 = ' || pi_record.column1 || CHR(13) ||
            'pi_record.column2 = ' || pi_record.column2 || CHR(13) ||
            ...
            'pi_record.column170 = ' || pi_record.column170;
    logging_procedure (text);
    ...
END;

有没有简单的方法以动态方式实现这一点(循环记录字段名称和值)而不枚举所有这些?

也许是这样的:

CREATE OR REPLACE PROCEDURE xxx (pi_record IN table_name%ROWTYPE) as
    text VARCHAR2(10000) := NULL;
BEGIN
    ...      
    LOOP in pi_record.columns
        text := text || CHR(13) || pi_record.column.name || ' : ' || pi_record.column.value
    END LOOP

    logging_procedure (text);
    ...
END;

非常感谢,

解决方法

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

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列).

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读