热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle动态记录过程或函数的参数

这可能会有帮助。我之前写了这个是因为我懒得添加调试:-)它只是输出的东西,你可以剪切粘贴到代码中:SQLCREATEORREPLACE2functionparam_debu

嗨,汤姆。
是否有任何方法可以将函数和过程的参数记录在包内或作为独立对象,而不必写入每个参数名及其值。
我想到了一些泛型的东西,我可以把它放入过程/函数中,它自动获取参数和它们的值,并将它们记录到表中。

专家解答


这可能会有帮助。我之前写了这个是因为我懒得添加调试: -)它只是输出的东西,你可以剪切粘贴到代码中:


SQL> CREATE OR REPLACE
2 function param_debug(p_package_name varchar2, p_owner varchar2 default null) return clob is
3 l_owner varchar2(30);
4 l_clob clob;
5 l_prev_obj varchar2(30) := '*';
6
7 procedure wrt(m varchar2) is
8 x int := length(m);
9 begin
10 dbms_lob.writeappend( l_clob,x,m);
11 end;
12 begin
13 dbms_lob.createtemporary(l_clob,true);
14
15 select owner into l_owner
16 from dba_objects
17 where object_name = upper(p_package_name)
18 and (
19 ( p_owner is not null and owner = upper(p_owner) )
20 or ( p_owner is null )
21 )
22 and object_type in ('PROCEDURE','FUNCTION','PACKAGE');
23
24 for i in ( select rownum r, d.* , max(case when argument_name is not null and
25 data_type not in ('REF','REF CURSOR') and
26 in_out in ('IN','IN/OUT') and
27 data_level = 0 then
28 length(argument_name) else 0 end) over (partition by subprogram_id) +
29 max(case when argument_name is not null and
30 data_type in ( 'PL/SQL TABLE'
31 ,'TABLE'
32 ,'VARRAY') and
33 in_out in ('IN','IN/OUT') and
34 data_level = 0 then
35 6 else 0 end) over (partition by subprogram_id) as arglen
36 from dba_arguments d
37 where package_name = upper(p_package_name)
38 and owner = l_owner
39 order by subprogram_id, position
40 ) loop
41 if to_char(i.subprogram_id) != l_prev_obj then
42 wrt(chr(10)||chr(10)||chr(10)||' msg(''Start: '||i.object_name||''');'||chr(10));
43 l_prev_obj := i.subprogram_id;
44 end if;
45
46 if i.argument_name is not null and
47 i.data_type not in ('REF','REF CURSOR') and
48 i.in_out in ('IN','IN/OUT') and
49 i.data_level = 0 then
50
51 if i.data_type in ( 'BINARY_DOUBLE'
52 ,'BINARY_FLOAT'
53 ,'BINARY_INTEGER'
54 ,'PLS_INTEGER'
55 ,'CHAR'
56 ,'FLOAT'
57 ,'INTERVAL DAY TO SECOND'
58 ,'INTERVAL YEAR TO MONTH'
59 ,'NUMBER'
60 ,'RAW'
61 ,'ROWID'
62 ,'TIME'
63 ,'TIME WITH TIME ZONE'
64 ,'TIMESTAMP'
65 ,'TIMESTAMP WITH LOCAL TIME ZONE'
66 ,'TIMESTAMP WITH TIME ZONE'
67 ,'VARCHAR2'
68 ,'UROWID') then
69 wrt(' msg('''||rpad(lower(i.argument_name),i.arglen)||'=>''||'||lower(i.argument_name)||');'||chr(10));
70 elsif i.data_type = 'DATE' then
71 wrt(' msg('''||rpad(lower(i.argument_name),i.arglen)||'=>''||to_char('||lower(i.argument_name)||',''yyyy-mm-dd hh24:mi:ss''));'||chr(10));
72 elsif i.data_type = 'PL/SQL BOOLEAN' then
73 wrt(' msg('''||rpad(lower(i.argument_name),i.arglen)||'=>''||case '||lower(i.argument_name)||' when false then ''FALSE'' when true then ''TRUE'' else ''NULL'' end);'||chr(10));
74 elsif i.data_type in ( 'PL/SQL TABLE'
75 ,'TABLE'
76 ,'VARRAY') then
77 wrt(' msg('''||rpad(lower(i.argument_name||'.count'),i.arglen)||'=>''||'||lower(i.argument_name)||'.count);'||chr(10));
78
79 else
80 wrt(' msg('''||rpad(lower(i.argument_name),i.arglen)||'=>***please fill in***);'||chr(10));
81 end if;
82 end if;
83 end loop;
84
85 return l_clob;
86 exception
87 when too_many_rows then
88 return 'More than one copy of package '||p_package_name||' found. Please specify an owner as well '||chr(10)||
89 'for example, PARAM_DEBUG(''MY_PKG'',''SCOTT'')';
90 end;
91 /
Function created.

这是我写的一个包裹

SQL>
SQL> create or replace
2 package PKG is
3 type t_assoc_array is table of int index by pls_integer;
4
5 procedure proc1(p_parm1 int, p_parm2 varchar2, p_parm3 date);
6
7 procedure proc2(p_parm1 int, p_parm2 t_assoc_array);
8 end;
9 /
Package created.
SQL>
SQL>
SQL> create or replace
2 package body PKG is
3 procedure proc1(p_parm1 int, p_parm2 varchar2, p_parm3 date) is
4 begin
5 null;
6 end;
7
8 procedure proc2(p_parm1 int, p_parm2 t_assoc_array) is
9 begin
10 null;
11 end;
12
13 end;
14 /
Package body created.

我调用“Param_debug”过程,给我一些基本的调试代码,我可以将这些代码剪切/粘贴到例程中

SQL> select param_debug('PKG') from dual;
PARAM_DEBUG('PKG')
--------------------------------------------------------------------------------
msg('Start: PROC1');
msg('p_parm1=>'||p_parm1);
msg('p_parm2=>'||p_parm2);
msg('p_parm3=>'||to_char(p_parm3,'yyyy-mm-dd hh24:mi:ss'));
msg('Start: PROC2');
msg('p_parm1 =>'||p_parm1);
msg('p_parm2.count=>'||p_parm2.count);
1 row selected.
SQL>

在我的例子中,我有一个通用的“msg”例程来处理调试,但是显然,您可以根据自己的喜好对其进行调整。

推荐阅读
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
author-avatar
想太多先生的微博
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有