调试Oracle 之一 基础篇

oracle存储过程的调试 本文主要介绍如何在PL/SQL Developer中如何调试oracle的存储过程。1.    打开PL/SQL Developer如果在机器上安装了PL/SQL Developer的话,打开PL/SQL Developer界面输入用户名,密码和host名字,这个跟在程序中web.config中配置的完全相同,点击确定 找到需要调试的存储过程所在的包(Pac 阅读详情

Author:  Lv, Haibo.

前言

 “多年之后,面对枪决行刑队,奥雷良诺•布恩迪亚上校将会想起,他父亲带他去见识冰块的那个遥远的下午”。

《百年孤独》的这个开头堪称经典。倒序的方法,加上时间状语“多年之后”,苍桑感一下子就出来了。何况又是面对行刑队,悲剧感也很强烈。要知道文学作品最能打动人心的,就是悲剧。比如,我至今还记得最短、最悲伤的爱情小说:

“我爱你!!!”

“滚。”

全篇只有四个字,但悲剧色彩强烈。一下子让我想到了我哪坎坷的青少年时期。

好了,不扯了,大家没有看错,这是一篇技术文章。我们言归正传。

“多年之后,麻木的面对一个个一筹莫展的Oracle难解之谜时,我总会想起来,当年我是如何积极的想成为一名DBA”。

 

第一节  调试Oracle:DBA的新领域

职业的发展,总会经历一段特殊的时间段,有叫“舒适区”,有叫“天花板”。总之,就是你感觉前进困难、进步无门,而待在原地则很舒适,那么恭喜你,你就在处在这段区域中了。

我是2004年开始转DBA,2005年正式成为DBA。5年后,2010年,我进入了我的“舒适”区。我感觉处理Oracle故障也就哪么几种方式,搞不定的问题丢给Oracle售后。我也想着进一步去钻研Oracle的原理、进一步提升自己的技能。但毕竟看不到源码,只能根据有限的几条Dump命令去探索,如同隔靴搔痒、雾里看花一般,这样研究出来的“底层原理”,准确性都不好确定,更别谈用这样的原理去排故、调优。

好像有一道无形的天花板,挡住了我的前进之路一般。既然前进无门,原地踏步又很舒适,还有谁会想着前进呢?

这时回想当年自己彻夜钻研Oracle技术,好似隔世一般。

当年我热火朝天的从开发转到DBA时,一定没有料到最终会是这样的结果。我就像奥雷良诺•布恩迪亚上校,被枪决在技术的天花板前。或者,也可以换种好听点的说法,成为在舒适区的温水中,被煮死的青蛙。

微博上有人辟谣,温水煮不死青蛙。我也是这样认为的,青蛙又不傻,当水温升高到一定程度时,难道它不会跳出来?

无论温水煮不煮的死青蛙,但温水一定煮的死人。我不想被温水煮死。

还有人为鸵鸟辟谣,传说当危险来临时,鸵鸟会把头埋到沙子中。由此还产生了一个新词:鸵鸟心态。我也一直认为,鸵鸟如果真的哪么傻,它是如何在这个充满竞争的星球存活亿万年的。

同样,鸵鸟有没有鸵鸟心态不太清楚,人多多少少都会有的。

 

我想打破我的天花板,我不想用鸵鸟心态去面对问题,我更不想待在“温水舒适区”等死。如何跳离“温水”呢?

答案就是:“调试Oracle”。

调试Oracle真的有这么神奇吗。是的。它可以有助于我们打破天花板,帮助我们跳离“温水”。当然前提是你要先有跳出温水的意愿。

如果非要让我用一句话总结“调试Oracle”的最大用途,我觉得,就是这7个动人的字:“明明白白我的心。”

 

维护Oracle这种大型软件,仅仅会运用它提供的命令是远远不够的,必须要了解它底层的原理。

比如,我知道体温超过38度可以吃两片白加黑,如果咳嗽的话可以来一瓶川贝枇杷膏,……,根据常识,我知道身体常见的症状要吃什么药,我能当医生吗?我当了医生你敢让我看病吗?

多多少少,我们要了解一下身体的运行原理,才能当医生。

比如体温升高我们可以去验个血,看一下白细胞比例,如果偏高,说明有病菌,属于病毒性感冒。原理是白细胞是杀死病菌的,如果体内病菌增多,人体就会产生更多的白细胞,杀死病菌。所以观察到白细胞增多,就意味着身体检测到病菌入侵了。

这种情况下如果体质好的话,就不必吃药,等着体内的白细胞自己杀掉所有的病菌。如果体质不好,可以吃一些抗菌药,等等。

我不是医生,也没学过医,上面这些都是道听途说,不知道对不对。只是拿来做个比喻。

Oracle的运维,道理差不多的。会使用Oracle提供的命令只是学习Oracle的第一步,必须要懂得原理,才能慢慢提高自己。

但Oracle毕竟是闭源软件,又看不到源代码,要如何去分析、挖掘它的原理呢?“调试Oracle”就是用来打开这个黑盒子的,掌握了它,我们就可以随意挖掘你感兴趣的原理。

 

本来我想用一两个例子,快速展示一下调试Oracle的神奇之处。但发现这可能比较困难,因为我必须从头说起,如果没有一点基础,你可能很难明白我们接下来要说的案例。下面,我们先来了解一下DTrace的基础。

 

DTrace是一门简单的语言,了解任何语言,都要先从Hello World开始,要不然,就会显的你很不专业。我当然不能坏了规矩。

 

第二节 DTrace基础:Hello World

DTrace是一个调试工具,它的原理我们可以这样理解,Solaris在其内部,增加了N多的触发器,这些触发器平时是Disable的,对性能没有任何影响。你可以通过DTrace,Enable某些触发器。并且,在Enable的同时,还可以为这些触发器指定动作。

比如,有一个I/O触发器,你用DTrace Enable了它,同时,你定义动作,“每次发生I/O时,显示出I/O大小”。当然,还可以定义更复杂的动作,显示I/O的内容、甚至修改I/O数据。进程想往磁盘中写个A,你可以用DTrace,将A换成B。当然,我们调试进程,一般不需要修改,只需要观察。(偶而也需要修改,比如,有时我们要修改DBWR、LGWR等Oracle核心进程的触发时间,从3秒改成我们需要的时间。)

这就是DTrace的原理。我们将上文中的术语换成DTrace中的术语,触发器就是Probe,可以译为探针。探针并时都是关闭的,也就是Disable的。我们可以使用DTrace,打开探针,并为探针指定动作。当探针被触发,你通过DTrace为探针定义的动作,就会被执行。

 

好了,让我们从Hello World开始吧。下面是DTrace版的“Hello World”:

在root下,vi test1.d,输入如下命令:

BEGIN

{

    printf("hello world,www.ebay.com ");

    exit(0);

}

 

如下执行此脚本:

# dtrace -s test1.d

结果显示:

dtrace: script 'test1.d' matched 1 probe

CPU     ID                    FUNCTION:NAME

  3      1                       :BEGIN hello world,www.ebay.com

 

上面就是显示结果了。下面对于脚本程序和输出结果,略加说明:

1、BEGIN:它是DTrace的探针之一。也是最简单的探针。它不和操作系统任何操作关联,一般它用来做DTrace程序运行的初始化工作。BEGIN探针中的代码,会在DTrace程序开始时运行。

2、大括号:如我们所见,探针名之下,就是大括号。这足以说明DTrace的设计者是C语言迷,将C语言的格式带入到了DTrace中来。

3、大括号中间的语句:这就是我们为BEGIN探针定义的动作了。包含两条语句,显示和退出。每条语句之后以;号结尾。

4、关于这两条语句,我就不再多说了,printf,在此的使用方法,完全和C语言一样。

5、两注意事项,(1)、大小写是敏感的。(2)、如果不加exit(0)的话,此程序运行完将不会退出。可以手工Ctrl+C退出。

输出结果的说明:

1、CPU列为3,说明此DTrace程序在运行时,刚好在3号CPU上执行命令。

2、ID列是探针编号。

3、FUNCTION:NAME,:BEGIN,探针名相关信息,这个后面再详细说。

4、最后无列名的部分,hello world,www.ebay.com,就是我们程序的输出结果了。

 

最后,每次运行此程序时,都要dtrace -s,太麻繁了。我们可以添加一个#!/usr/sbin/dtrace -s在程序头,如下所示:

 

#!/usr/sbin/dtrace -s

 

BEGIN

{

    printf("hello world,www.ebay.com ");

    exit(0);

}

 

保存,使用chmod 755 test1.d,赋上去可执行权限,如下方式执行:

 

# ./test1.d

dtrace: script './test1.d' matched 1 probe

CPU     ID                    FUNCTION:NAME

  0      1                        :BEGIN hello world,www.ebay.com

 

第三节  详述探针(Probe)

完整的探针描述符,绝对不止上节我们遇到的BEGIN这么简单。它包括PROVIDER(提供器),MODULE(模块名),FUNCTION(函数名)和NAME(探针名称)四部分。BEGIN只是最简单的一个特例。

PROVIDER是最上层的名称,比如有IO PROVIDER,进程PROVIDER,等等。每种PROVIDER根据其包含的探针不同,又分为N种MODULE。MODULE之中又包含各种FUNCTION,最后的NAME是探针名,通常是进入、开始、退出、完成这些东西,在进入一个FUNCTION(函数)、退出函数、完成函数等等动作发生时被触发。

简单点说,PROVIDER、MODULE、FUNCTION、NAME就像姓、名、字、号,姓李,名白字太白,号诗仙。PROVIDER为李,MODULE为白,FUNCTION为太白,NAME为诗仙。

也就是说,它们都是“名字”的不同部分,不必理解的太为复杂。

我们以IO为例,简单试验下有意义的跟踪。操作系统中大部分IO事件的开始处,有这样一个探针:

 

io:genunix:bdev_strategy:start

 

io是PROVIDER,genunix是MODULE。bdev_strategy是FUNCTION,所有串行磁盘I/O事件将调用bdev_strategy函数完成。最后一个,start,bdev_strategy函数入口处的探针。

我们可以这样称呼它,io提供器下的genunix模块中的bdev_strategy函数上的start探针。或者,直接称它为io:genunix:bdev_strategy:start探针。

 

一个探针的称呼其实无所谓。了解Solaris一供为我们提供了什么PROVIDER(提供器),这些提供器下都有什么MODULE(模块),这些模块中都有什么FUNCTION(函数),以及这些函数上都有什么探针,这才是重要的。关于这点,我们可以参考《Solaris 动态跟踪指南》,这是本书像一本字典,详细介绍了所有的提供器、模块等等。其实它就是DTrace的官方文档。难得Oracle还有翻译的如此好的文档。

 

好,先以io:genunix:bdev_strategy:start探针为例子,测试一下吧:

 

vi test2.d

 

#!/usr/sbin/dtrace -s

 

BEGIN

{

    i=0;

}

 

io:genunix:bdev_strategy:start

{

    printf("%d number physio IO",i);

    i++;

}

 

保存,chmod 755 test2.d,这是执行的结果:

# ./test2.d

dtrace: script './test2.d' matched 2 probes

CPU     ID                    FUNCTION:NAME

  1    781              bdev_strategy:start 0 number physio IO

  1    781              bdev_strategy:start 1 number physio IO

  1    781              bdev_strategy:start 2 number physio IO

  1    781              bdev_strategy:start 3 number physio IO

  1    781              bdev_strategy:start 4 number physio IO

  1    781              bdev_strategy:start 5 number physio IO

……………………

每有一次IO,程序会都会显示一行,“  1    781              bdev_strategy:star”,这一部分是固定输出,这一部分其实可以用一个参数关掉。参数我们以后再说。后面“ 0 number physio IO”,是我们程序的输出结果。

如果我们不按Ctrl+C,程序会一直显示下去。每有一次串行IO发生,准确说是每调用一次bdev_strategy函数,探针被触发一次,就会显示一行。

 

只显示IO的次数,也没啥意义。其实我们可以显示更多的东西。但要对IO类探针进一步了解些。

bdev_strategy既然被叫作函数,是函数的话,当然有参数。它一共有3个参数,参数1是bufinfo_t型的结构,参数2是devinfo_t型结构,参数3是fileinfo_t型结构。可以参见《Solaris 动态跟踪指南》 356页。

另外,结构,Struct,C语言的基本东西。不会的话,去看看潭浩强的C语言吧。二级C语言,我想我们都应该没啥问题吧。确定写DTrace脚本,连二级C都不需要,只需要对C语言有最基本的了解即可。

这三个结构当中,fileinfo_t包含的有I/O所针对的文件名,请允许我粘一段《Solaris 动态跟踪指南》 359页的内容,fileinfo_t结构的定义:

typedef struct fileinfo

{

        string fi_name;         /* name (basename of fi_pathname) */

        string fi_dirname;         /* directory (dirname of fi_pathname) */

        string fi_pathname;         /* full pathname */

        offset_t fi_offset;         /* offset within file */

        string fi_fs;                 /* filesystem */

        string fi_mount;         /* mount point of file system */

} fileinfo_t;

 

在此,照顾一下不会C语言的人,简单说明一下,如果我们要访问结构中的内容,格式是“结构名.域”,或者“结构指针->域”。在DTrace中,我们得到的一般都是指针。

好,下面我们改一下脚本程序:

 

io:genunix:bdev_strategy:start

{

    printf("%s",args[2]->fi_pathname);

}

 

args[2],是bdev_strategy函数的第三个参数,这是Dtrace中的固定用法。DTrace中还会有一些类似的固定用法,可以参考《Solaris 动态跟踪指南》P68页,内置变量。我们以后还会用到一些其他的。

在bdev_strategy函数中,第三个参数是fileinfo_t型的指针,也就是说,我们可以用“args[2]->域”的格式,访问fileinfo_t型结构中的域。我们此外访问的域是fi_pathname,也就是文件的完整路径加名字,形式就是如上面所示:args[2]->fi_pathname。

 

这是我执行后的结果:

# ./test2.d

dtrace: script './test2.d' matched 2 probes

CPU     ID                    FUNCTION:NAME

  2        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

  2        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

  0        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

  0        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

  1        781              bdev_strategy:start <none>

  1        781              bdev_strategy:start <none>

  1        781              bdev_strategy:start <none>

  1        781              bdev_strategy:start <none>

  1        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

  1        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

  1        781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl

 

可以看到,有很多控制文件的写。随带说一下,我这个测试库很闲,没有任何操作。但你可以看着表统计一下,不超过3秒,肯定会有一次控制文件的IO操作。原因是什么,我就不用再说了吧。

再进一步的,Oracle每次控制文件的IO是多大呢? IO的大小在bufinfo_t结构中的b_bcount域,你可以查看《Solaris 动态跟踪指南》 356页,为了节省篇幅,我就不再粘过来了。bufinfo_t结构的指针,是bdev_strategy的第一个参数,也就是args[0]。因此,我们可以如下再次修改代码:

io:genunix:bdev_strategy:start

{

    printf("%s %d",args[2]->fi_pathname,args[0]->b_bcount);

}

这是我的执行结果:

  1    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192

  2    781              bdev_strategy:start /var/tmp/Exwla4xc 8192

  2    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/redo03 4096

  1    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192

  1    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192

  1    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192

 

控制文件的IO大小,很整齐的都是8192字节,8K,控制文件的块大小。出乎我意料的是,有一个Redo文件:redo03,它的IO大小是4096。我以前一直以为,应该是512才对,因为Solaris下,Redo的块大小就是512字节啊(我碰到的系统,好像只有HP的不是512)。

 

不急,我们还没有搞清楚这些IO是读还是写呢,说不定是归档的读Redo IO呢。还是bufinfo_t结构,b_flags域,说明了IO类型。关于这个域,在操作系统内部定义了几个标志(就是用#define 定义的),B_WRITE代表IO是写,B_READ代表是读,还有些其他的,自己到357页查吧。

我将代码修改如下,添加上去IO类别的判断:

 

io:genunix:bdev_strategy:start

{

    printf("%s %d %s",args[2]->fi_pathname,args[0]->b_bcount,args[0]->b_flags&B_READ?"R":"W" );

}

 

args[0]->b_flags&B_READ?"R":"W",这种使用形式,条件表达式,是我们以后常用的形式,因为DTrace中没有if、while等流程控制语句,所以条件表达式将是if的常用替代者,但它必竟替代不了复杂的控制语句。

仍然是为了程序不太好的人,介绍一下这个条件表达式:“条件?值1?值2”,将条件为True,值1为整个条件表达式的值。否则,值2为整个条件表达式的值。

 

这是执行结果:

  3    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

  3    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

  2    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/redo01 4096 W

  1    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

  1    781              bdev_strategy:start /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

………………

 

控制文件IO也全是写,还有,中间的Redo文件IO,是我专门修改1行,Commit一下产生的,IO大小是4096字节,而且是写IO。看来,的确是LGWR在写Redo01。我们可以观察一会儿,不难发现Redo文件有512字节IO,这是Oracle最小的I/O了。

我们为io:genunix:bdev_strategy:start处的探针定义了动作,当运行此DTrace脚本时,我们就开启了探针io:genunix:bdev_strategy:start。但有些IO,并不是通过bdev_strategy函数完成的,探针io:genunix:bdev_strategy:start捕获不到这些IO。为了开启更多的探针、捕获更多的IO操作,在完整的探针描述符中,我们可以确实部分内容,下面,如下修改程序:

io:genunix::start

{

    printf("%s %d %s",args[2]->fi_pathname,args[0]->b_bcount,args[0]->b_flags&B_READ?"R":"W" );

}

 

脚本程序运行后的提示:

# ./test2.d

dtrace: script './test2.d' matched 4 probes

CPU     ID                    FUNCTION:NAME

  2        782              bdev_strategy:start cmdk0 /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

 

  2        782              bdev_strategy:start cmdk0 /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

 

  2        782              bdev_strategy:start cmdk0 /export/home/oracle/opt/dbdata/h1/control01.ctl 8192 W

 

其中,第一行“dtrace: script './test2.d' matched 4 probes”,说明一共开启了4个探针,比之前的测试,多开启了两个探针。

我们还可以进一步省略,io:::start,这将开启7个探针。我就不再测试了。但我们不能写成:::start,或io:::这样的形式。

我们还可以使用通配符,如“i*:::start”,这就是打开所有i开头的提供器中的所有模块、所有函数的Start探针。当然,我们也可以在模块、函数名中,使用通配符,但不能在探针名中使用通配符。比如,这样将是错误的:“io:::st*”。通配符还可以是问号,比如:“i?:::start”。 * 号代表所有字符,一个 ? 号,只能代表一个字符。

探针的使用,说的也就差不多了,最后再来一个总结,我们如何知道Solaris有哪些探针,当然,我们可以查看《Solaris 动态跟踪指南》。除了这个之外,dtrace -l 命令可以查看所有的探针:

 

# dtrace -l|wc -l

   51805

 

我使用的Solaris中,一共有5万多个探针。

我们还可以显示某一个提供器下所有探针,这样更有针对性,比如,显示io提供器下有什么模块、函数、探针:

 

# dtrace -lP io

   ID   PROVIDER            MODULE                          FUNCTION NAME

  767         io                   genunix                           biodone done

  768         io                   genunix                           biowait wait-done

  769         io                   genunix                           biowait wait-start

  780         io                   genunix                    default_physio start

  781         io                   genunix                     bdev_strategy start

  782         io                   genunix                           aphysio start

 2530         io                     nfs                          nfs4_bio done

 2531         io                     nfs                          nfs3_bio done

 2532         io                     nfs                           nfs_bio done

 2533         io                     nfs                          nfs4_bio start

 2534         io                     nfs                          nfs3_bio start

 2535         io                     nfs                           nfs_bio start

 

不多,io提供器下,只有13个探针。

好了,基础就补到这。其实从这里的简单例子,我们已经可以分析挖掘很多的东西了。但这些东西找个其他的IO跟踪工具也可以跟踪出来。下面,正式内容开始,我们开始调试Oracle。这是别的工具所完成不了的。

 

精彩内容,请期待“调试Oracle之二:实例篇。”

 

* 本文版权和/或知识产权归eBay Inc所有。如需引述,请和联系我们DL-eBay-CCOE-Tech@ebay.com。本文旨在进行学术探讨交流,如您认为某些信息侵犯您的合法权益,请联系我们DL-eBay-CCOE-Tech@ebay.com,并在通知中列明国家法律法规要求的必要信息,我们在收到您的通知后将根据国家法律法规尽快采取措施。

【ShaderToy】开篇 写在前面呜呼,好久没有写博客了,好惭愧。题外话,感觉越大就越想家,希望可以一直和家人在一起,哪怕只是坐在一起不说话也觉得很温暖,一想到要分开眼睛就开始酸,哎。开学还是爬上来老实更新博客学习吧~今天爬上来一看,发现优快云的博客编辑终于更新了!进步总是好的,以前的编辑器实在很捉急。使用这种标记语言的确方便了很多,但好像颜色字体没法设置?程序员果然对美观没什么追求。ShaderToy如果你还没听过Sha 阅读详情

相关推荐

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3639

oracle 存储过程或函数的调试过程

第一步: 选择调试模式 第二步: 输入测试数据 第三步: 点击开始调试器 第四步: 输入要显示的变量名 第五步: 第六步: 逐步点击单步调试,并查看变量的变化 第七步: 不断重复前六步,直到函数或存储过程调试完成。

小虚竹的专栏 3万+

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2385

Oracle 函数

数据库中函数包含四个部分:声明、返回值、函数体和异常处理。--没有参数的函数begin--带有IN参数的函数beginexceptionraise_application_error(-20001, '你输入的ID无效!');

qq_62687015的博客 4505

python爬虫入门教程(非常详细)

爬虫指的是一种自动化程序,能够模拟人类在互联网上的浏览行为,自动从互联网上抓取、预处理并保存所需要的信息。爬虫运行的过程一般是先制定规则(如指定要抓取的网址、要抓取的信息的类型等),紧接着获取该网址的HTML源代码,根据规则对源代码进行解析和抽取,最后进行处理和保存。爬虫在实际应用中广泛使用,如搜索引擎、大数据分析、交易数据采集等领域,都需要用到爬虫技术来实现信息的定向采集和处理。

工宗浩生财指南针 2万+

用人话讲明白线性回归LinearRegression

目录 什么是回归 一元线性回归 损失函数 最小二乘估计 小结 1. 什么是回归 当我们学习一门新课程、接触一个新专业时,总会对该领域的专有名词感到困惑,甚至看完解释仍难以理解其含义。在我们一起学习machine learning的过程中,我会尽量对相关名词用“人话”做一遍解释,以减少学习的“痛苦感”。 譬如今天要学的线性“回归”,这个回归(regression)和我们平时说的“回归祖国”的回...

化简可得 1万+

oracle存储过程调试

4、出现调试操作按钮界面(依次:运行 单步进入 单步跳过 单步退出 运行到下一个异常)5、点击运行,直接获取存储过程的返回结果,点击单步进入,点击左边,进行断点调试(已进入函数方法中)oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能。先按简单的存储过程做个例子,就是上次做的存储过程(proc_test)3、出现测试脚本页面,输入动态参数值,点击左上角的标志,进入调式模式。2、选中存储过程,右键弹出菜单,选择 测试。7、最后执行完存储过程,输出结果。

chaohui2638457321的博客 3133

Unity游戏开发:从零开始适配Nintendo Switch的完整指南

本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。

vodka的博客 1069

Oracle(50)如何调试PL/SQL代码?

调试PL/SQL代码是确保代码正确性和性能的关键步骤。通过使用DBMS_TRACE、调试工具、以及单元测试和代码审查,可以有效地调试和优化PL/SQL代码。根据具体需求选择合适的调试方法和工具,可以显著提高调试效率和代码质量。

qq_43012298的博客 1254

001、Zephyr RTOS简介与历史背景

本文介绍了Zephyr RTOS的特点及其在嵌入式开发中的应用。作者通过亲身经历比较了Zephyr与传统RTOS的差异,重点分析了Zephyr的设备树、统一驱动模型、基于CMake的构建系统、POSIX兼容层等核心特性。文章详细阐述了Zephyr在内核设计上的优势,如中断处理模型、内存管理等,并提供了社区生态和使用建议。作者建议开发者从简单项目入手逐步掌握Zephyr,同时指出了常见的使用问题和适用场景,认为Zephyr特别适合复杂软件架构的物联网和工业控制项目。

m0_50546716的博客 155

双馈风机并网系统宽频振荡机理与抑制方法研究

双馈风机并网系统宽频振荡分析与抑制 摘要:本文研究了双馈风机(DFIG)接入弱电网引发的宽频振荡问题。通过建立DFIG并网系统阻抗模型,分析了锁相环带宽、电流环带宽等参数对阻抗特性的影响。研究揭示了DFIG与电网阻抗交互导致交截频率处相位差超过180°的振荡机理。提出基于锁相环优化的阻抗重塑抑制策略,采用电压补偿和陷波器改善系统稳定性。仿真结果表明,该方法能有效降低相位差约10°-168°,显著抑制宽频振荡。代码实现了阻抗建模、稳定性分析和抑制策略验证,为工程应用提供了理论依据。

huanghm88的专栏 320

oracle 如何调试触发器

在Oracle中调试触发器,可以采用多种方法。

weixin_41203765的博客 1664

CryoEM - 冷冻电镜 基于深度学习的 从头重构(Ab-initio Reconstruction) 开源项目 教程

冷冻电镜(CryoEM) 是一种成像方式,为蛋白质和其他生命基本组成部分的动态,提供独特的观察方式。从数百万噪声和随机取向的二维投影中,以计算效率高的方式,联合估计生物大分子的姿态、三维结构和构象异质性。

AGI 1557

读《Oracle 数据库应用与实践》

最近的工作与oracle数据库有关,所以拿起家里之前买的一本oracle书籍。在阅读过程中,我发现这本书有多出不准确的描述。在此记录下来,当然,我也会把一些sql命令或者sql语句记录下来,如果有人恰好也是读这本书,就直接复制即可。 第7章 SELECT 高级查询 7.2.2 外连接查询 关于用(+)表示外连接,书中描述有误。 关于恰当用法,我参考了这个连接 Oracle左连接、右连接、全外连接以及(+)号用法 - 何海洋 - 博客园 (cnblogs.com) select * fro

qq_15403863的博客 1532

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Oracle 运维篇+进程追踪调试(Linux系统)

说明:本文为Linux下Oracle进程追踪调试指导手册, 标签:strace、进程追踪、进程调试、Oracle进程追踪调试 温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化 正文开始 大纲 --strace介绍 --在Oracle中的用途 --语法 --推荐网文 --命令样例 --输出日志 ★ strace介绍 ///////////////////...

ZZT_2009 766

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Oracle 运维篇+进程追踪调试(AIX系统)

说明:本文为AIX下Oracle进程追踪调试指导手册, 标签:truss、进程追踪、进程调试、Oracle进程追踪调试 温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化 正文开始 大纲 --truss介绍 --在Oracle中的用途 --语法 --推荐网文 --命令样例 --输出日志 ★ truss介绍 ////////////////////////...

ZZT_2009 846

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

如何调试oracle,sqlserver存储过程

调试oracle存储过程 环境: win2003 server + oracle9i + pl/sql developer 7 调试方法: 1 在pl/sql developer 里右击要调试的存储过程,选择"添加调试信息"命令 2 如果存储过程没有语法错误,右击存储过程,选择"测试"命令 3 在"测试窗口"中安F9,调试(注意如果有输入参数的话,要先给各个参数赋值) 4 "ctrl + n"单步调试,调试过程中,将变量名添加到现面的变量列表里按回车键,或者将鼠标放到某个变量的上面,就会看到该变量的值了

Sayesan的专栏 3031

PLSQL调试oracle存储过程

step over: 在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而时将子函数整个执行完再停止,也就是把子函数整个作为一步。step over: 在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而时将子函数整个执行完再停止,也就是把子函数整个作为一步。2.再点击View,进入存储包体查看页面,点击想要调试的存储过程名称,右侧就会显示具体代码,在这个页面可以打断点,调试:点击【开始调试按钮】,即进入调试,调试存储过程要先在下方写入参。二、调试存储包里的存储过程。

java coding girl 1万+

oracle如何单步调试,oracle如何调试存储过程

oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能先按简单的存储过程做个例子,就是上次做的存储过程(proc_test)1、先在数据库的procedures文件找到我们之前创建存储过程2、选中存储过程,右键弹出菜单,选择 测试3、出现测试脚本页面,输入动态参数值,点击左上角的标志,进入调式模式4、出现调试操作按钮界面(依次:运行 单步进入 单步跳过 ...

weixin_42552315的博客 2760

Oracle存储过程调试

1 说明 尽管目前是国产数据库的兴起阶段,但是Oracle数据库任然占了市场主导地位。像银行、保险等行业大部分应用都用到Oracle数据库,并且广泛使用了Oracle的存储过程。存储过程可以写很复杂的逻辑,并且执行速度快。但是存储过程写的对不对是需要验证的,而且这个验证并不像写程序一样那么方便。目前最好的验证手段就是借用plsql的debug功能。今天给大家介绍一款国产数据库管理工具HHDBCS。这个工具同样具备plsql的debug调试功能。而且是国产自主研发的。本人亲测,好用。下面我们来看看HHDBCS

m0_61228937的博客 2177

oracle中调试存储过程,详解Oracle调试存储过程

详解Oracle调试存储过程一 调试关键步骤1、在要调试的存储过程右键,选择编辑以进行调试,截图如下:2、点击小瓢虫,弹出调试窗口,截图如下:3、输入7839员工编号,点击确认,进行调试,截图如下:4、该截图说明权限不够,需要添加scott用户的权限。5、增加权限语句如下:show userUSER 为"SCOTT"sql> connect system输入口令:已连接。sql> sh...

weixin_35777914的博客 1627

oracle 过程调试

1.打开PL/SQL Developer 如果在机器上安装了PL/SQL Developer的话,打开PL/SQL Developer界面 输入用户名,密码和host名字,这个跟在程序中web.config中配置的完全相同,点击确定 找到需要调试的存储过程所在的包(Package bodies),如PACK_ACTIVITY,点击右键,在弹出菜单中选择[查看],得到包中的所 有存储

llx7758991的专栏 569

oracle存储过程无法调试

<br />问题:<br /> <br />使用pl/sql developer 调试oracle 存储过程。<br />在存储过程上点右键,选调试(test),然后按f9(debug)。这是正常的话,那些run、step into等按钮就可以点了,或者点run到断点,或者点step into做单步跟踪。<br />但是在一个oracle rac双机环境中调试一个存储过程,点f9后有时能继续run或者 step into,有时候pl/sql dev就像死掉了一样,那些按钮都不能点了,下面的状态提示栏中显示“

fupei的专栏 6770

Oracle PL/SQL 基礎

Oracle PL/SQL 基礎 (整理于2006年东莞裕元) 一.PL/SQL及調試工具.    1. SQL(Structured Query Language) 結構化查詢語言.    2. 調試工具       SQL*Plus       SQL WorkSheet       Pledit32       PL/SQL Developer       Toador

温故而知新 2115

oracle 怎么调试包

declare   -- Non-scalar parameters require additional processing    p_manifest_array pkg_goodsmanifestloadingpack.goodsmanifest_array; begin     p_manifest_array(0) := '117000005128810';   --

sunny_lv的专栏 1848

oracle如何调试sql,PL/SQL Developer中如何调试oracle的存储过程

本文主要介绍如何在PL/SQL Developer中如何调试oracle的存储过程。1.打 开PL/SQL Developer如果 在机器上安装了PL/SQL Developer的话,打 开PL/SQL Developer界面输入 用户名,密码和host名字,这个跟在程序中web.config中配置的完全相同,点击确定找到 需要调试的存储过程所在的包(Package bodies),如PACK_A...

weixin_31550647的博客 616
上一篇: 分布式文件系统概述
下一篇: Utilize Action Mechanism in Web Test Automation to Save the Effort for Frequent Code Change
ebay
博客等级 码龄24年 109粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值