在该过程中,我想调用一个调试过程,其中一个参数是一个包含该记录的所有字段名称和值的文本字符串.
例如:
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 onsql> 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 = 10Dname = ACCOUNTINGLOC = NEW YORKPL/sql procedure successfully completed.sql>
嗯,有点作品(如果这就是你问的那个).当然,这只是一个例子,如果你想获得一些非常聪明的东西,你必须修改它(提示:DATE列).
总结以上是内存溢出为你收集整理的oracle – 如何动态获取记录中的字段名称和值全部内容,希望文章能够帮你解决oracle – 如何动态获取记录中的字段名称和值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)