上篇《懵懂oracle之存储过程》已经给大家介绍了很多关于开发存储过程相关的基础知识,笔者尽最大的努力总结了所有接触到的关于存储过程的知识,分享给大家和大家一起学习进步。本篇文章既是完成上篇文章中未来得及总结的关于存储过程的调用、测试等知识的汇总分享,也是对上篇文章的存储过程的一个调试改错过程(由于知识的局限性和书写时的疏忽等,之前的存储过程有误之处难免,正在不断更改中,如果能得到大家的指正将使这个工作进行地更快更好,助人为快乐之本!)。

下面步入正题,介绍本篇知识汇总和分享:

一、存储过程的调用(下面语句请用于测试窗口执行)(代码中sp_hll_test_20170415这个存储过程可参见《懵懂oracle之存储过程》,请注意查看使用最新的代码)。

 declare -- 如果不需要定义参数,那么就可去掉此declare部分,只使用begin……end块
a number;
b date;
c varchar2(20);
d number;
status user_tables.status%type;
-- e varchar2(20); 长度过小
/*
务必注意出参或出入参为变量时,变量有长度限制时不得小于在存储过程中会达到的最大值,
否则会导致过长的字符串无法存入这个长度不够的变量中,而报错:
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
*/
e varchar2(200);
begin
/*
存储过程调用时,参数可以为常量、变量或绑定变量,参数调用方式可以为定位调用、命名调用或混合调用,
同时参数和参数调用方式互不干涉,可随意混合。
*/ -- 调用方式1:定位符调用
/*
实参和形参通过位置顺序一一对应。
如下例调用,第一个参数a传值给sp_hll_test_20170415的入参i_a等。
*/
sp_hll_test_20170415(a, b, c, d, status, e); -- 调用方式2:命名符调用
/*
在每一个参数设置的时候,都可以通过"形参=>实参"的格式,指定形参和实参,
这样一来,参数的位置顺序就不必与存储过程创建时规定的顺序一致,可以自由调节。
如下例,将参数顺序完全颠倒。
*/
sp_hll_test_20170415(io_e => e, i_status => status, o_d => d, i_c => c, i_b => b, i_a => a); -- sp_hll_test_20170415(io_e => e, i_status => status, o_d => d, o_d => c, i_b => b, i_a => a);
-- 命名符调用时,务必注意形参值别重复,如上例的o_d形参,这样会导致下面的异常:
-- PLS-00703: 列表中具有指定参数的多个实例 -- 调用方式3:定位符+命名符调用
/*
上面两种调用方式可混合使用,但是注意,一旦某个参数有使用命名符,则后面所有的参数都得使用命名符,
也就是说只能前x个参数为定位符方式,后y个参数为命名符方式(x+y=总参数数目)。
否则会导致异常:“PLS-00312:一个定位相关参数没有说明其相关性”
*/
sp_hll_test_20170415(a, b, io_e =>e , i_c =>c, i_status =>status, o_d =>d); -- 参数方式:常量+变量
a:=3;
select sysdate into b from dual;
sp_hll_test_20170415(a, b, '我是常量C', d, '', e); -- sp_hll_test_20170415(a, b, c, 2, status, e);
-- 出参、出入参,不能为常量,因为它们会被赋值
-- PLS-00363: 表达式 '2' 不能用作赋值目标 -- 参数方式:绑定变量
/*
绑定变量,即冒号+变量名称,这种方式我们在之前的存储过程学习中也有接触,在PLSQL
的测试窗口中,对于绑定变量可在窗口下侧的“变量-类型-值”区域右键进行增加删除等,可一一设定值,
同时出参、出入参在变化后也会体现到“值”处(当然在F9调试时,不止绑定变量,其它变量也可添加进去,
查看每步运行后的值)。
ps:PLSQL中在存储过程名称上右键,通过右键菜单中“测试”功能,能迅速打开一个“测试窗口”,
窗口内部的调用存储过程方式默认为绑定变量+定位符调用方式,在后续调试教程中有图有真相。
*/
sp_hll_test_20170415(io_e => :e1, i_status => :status1, o_d => :d1, i_a => :a1); -- 参数方式:常量+变量+绑定变量
sp_hll_test_20170415(1,to_date('2017-6-16', 'yyyy-mm-dd'), io_e =>e , i_c =>c, i_status =>:status1, o_d =>d); -- 默认值使用
-- sp_hll_test_20170415(a, b, status, e);
/*
当存储过程参数含有默认值的参数时,那么在需要使用默认值时一般可省略此参数,
但是这样就和定位符调用有冲突,像上例调用,省略的是第三、四位的参数,可对定位符来说,
它第三、四位的参数没有少,少的是第五、六位的参数,同时第四位参数为number,而传的e变量是varchar2(200)
所以就会导致异常: PLS-00306: 调用 'SP_HLL_TEST_20170415' 时参数个数或类型错误 因此如果既想使用定位符调用方式,又想能使用默认值方式,那么必须在存储过程定义的时候,
把具有默认值的参数反正参数列表的最后。
*/
-- 或者可用命名符调用的方式来使用默认值,如下例:
sp_hll_test_20170415(io_e => :e1, i_status => status, o_d => d, i_a => a); end;

二、存储过程的调试。

0.调试前提条件,用户必须拥有调试的权限,否则“ORA-01031: insufficient privileges”会找你麻烦。

解决方法:用管理员账号给此用户赋予权限

 grant debug any procedure, debug connect session to 用户;

1.可通过下图方式快捷进入单个存储过程的“测试窗口”。

注意:若存储过程无法调试,只显示正在执行,单步进入、退出等按钮无法使用,无法打断点等情况,请核查数据库是否采用了负载均衡,这时得将本机tns配置成下例情况,采用单节点登录:

 test_one_node =
(description =
(address_list =
# 其中一个机器的ip及port信息
(address = (protocol = tcp)(host = *.*.*.* )(port = *))
)
(connect_data =
(server = dedicated)
(service_name = *)
# show parameter instance_name 或者select instance_name from v$instance 可查看此值
(instance_name = *)
)
)

2.亦可在新打开或已有的一个“测试窗口”中,仿照一例书写各种代码进行测试(甚至可以在测试单个存储过程时,将“create or replace procedure sp_hll_test_20170415……”创建存过及定义参数部分替换成一例中的declare部分+补充好缺少的参数信息,来测试这个存储过程。这种方式和把此存储过程“添加调试信息”后调试入存储过程内部也差不了多少,可看喜好或场景等按需使用)。

3.调试需知(只介绍一些常用项,其它的可自己探索)。

单步进入+单步退出=单步跳过。

作者:滚雪球俱乐部-何理利

出处: http://www.cnblogs.com/snowballed/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接。
如有疑问, 可邮件(he.lili1@ztesoft.com)咨询。

懵懂oracle之存储过程2的更多相关文章

  1. 懵懂oracle之存储过程

    作为一个oracle界和厨师界的生手,笔者想给大家分享讨论下存储过程的知识,因为在我接触的通信行业中,存储过程的使用还是占据了一小块的地位. 存储过程是什么?不得不拿下百度词条的解释来:"存 ...

  2. 懵懂oracle之存储过程3--JOB详解

    在前面学习了存储过程的开发.调试之后,我们现在就需要来使用存储过程了.简单的使用,像上篇<懵懂oracle之存储过程2>中提到的存储过程调用,我们可以将写好的存储过程在另一个PL/SQL块 ...

  3. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  4. java下实现调用oracle的存储过程和函数

    在Oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR() PRIMARY KE ...

  5. Oracle中存储过程传入表名学习

    Oracle中存储过程传入表名: 一.动态清除该表的数据 create or replace procedure p_deletetable(i_tableName in varchar2)  as  ...

  6. 使用Oracle的存储过程批量插入数据

    原文地址:http://www.cnblogs.com/liaoyu/p/oracle-procedure-batch-insert.html 作者:L君还在说之乎者也 最近在工作中,需要使用生成一些 ...

  7. Oracle创建存储过程、执行存储过程基本语法

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  8. oracle中存储过程详解

    oracle中存储过程的使用 过程是指用于执行特定操作的PL/SQL块.如果客户应用经常需要执行特定操作,那么可以考虑基于这些操作建立过程.通过使用过程,不仅可以简化客户应用的开发和维护,而且可以提高 ...

  9. Oracle分页存储过程及PLSQL中的调用脚本

    撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经整理后终于通过测试,特分享给大家 测试步骤:1.运行创建包命令;2.运行创建存储过程命令;3.运行调用分页存储过程语句 测试环境:wind ...

随机推荐

  1. bzoj4818 [Sdoi2017]序列计数

    Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望,这n个数中,至少有一个数是质数.Alice想知道,有多少个序 ...

  2. [ext4]06 磁盘布局 - 特殊inode

    Ext4预留了一些inode做特殊特性使用,见下表: inode Purpose 0 不存在,Ext4中不存在inode 0. 1 存放损坏的数据块链表 2 根目录 3 User quota. 用户q ...

  3. 学习《ASP.NET MVC5高级编程》——基架

    基架--代码生成的模板.我姑且这么去定义它,在我学习微软向编程之前从未听说过,比如php代码,大部分情况下是我用vim去手写而成,重复使用的代码需要复制粘贴,即使后来我在使用eclipse这样的IDE ...

  4. dva框架使用mock.js模拟数据 + fetch请求数据

    what DVA? Dva是基于Redux做了一层封装,对于React的state管理,有很多方案,我选择了轻量.简单的Dva. dva 可以很方便就使用mock.js进行数据的模拟. 只需要三步,即 ...

  5. Apache localhost和局域网ip地址访问

    今天忍无可忍重装了公司的电脑,所以把开发工具也都重新装一下. 安装wamp,localhost和局域网ip地址无法访问. 在C:\Windows\System32\drivers\etc\hosts文 ...

  6. WinRAR5.01注册码附注册机

    把下面的注册码复制到"记事本"中,另存为"rarreg.key"文件,放到WinRAR安装目录即完成注册.RAR registration datakjcy8U ...

  7. JAVA并发编程实战---第三章:对象的共享(2)

    线程封闭 如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一.当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线 ...

  8. 使用configuration配置结束在quartz.net中使用硬编码Job,Trigger任务提高灵活性

    经常在项目中遇到定时任务的时候,通常第一个想到的是Timer定时器,但是这玩意功能太弱鸡,实际上通常采用的是专业化的第三方调度框架,比如说 Quartz,它具有功能强大和应用的灵活性,我想使用过的人都 ...

  9. SecureCRT通过Javascrip脚本实现Ctrl+C

    代码如下: # $language = "JScript" # $interface = "1.0" for( i=1 ; i < 3600 ; i++) ...

  10. iframe 父子页面方法调用

    在写代码的时候经常会用到将一个网页嵌入到另一个网页中,w3c也规定了一个标签<iframe>,这个标签本身就支持跨域,而且所有的浏览器都支持 iframe具有以下属性: 1.framebo ...