Oracle入门(十四.17)之procedure传递参数

一、PROCEDURE 参数模式

参数模式在形式参数声明中指定,位于参数名称之后,位于其数据类型之前。
参数传递模式:
•IN参数(默认值)为子程序提供处理值。
•OUT参数将值返回给调用者。

•IN OUT参数提供一个输入值,该值可以作为修改值返回(输出)。


二、默认模式:IN

如果没有指定模式,IN模式是默认模式。 IN参数只能在程序中读取。 他们不能被修改。

CREATE PROCEDURE procedure(param [mode] datatype)
...
CREATE OR REPLACE PROCEDURE raise_salary(p_id IN my_employees.employee_id%TYPE,p_percent IN NUMBER)
IS
BEGINUPDATE my_employeesSET salary = salary * (1 + p_percent/100)WHERE employee_id = p_id;
END raise_salary;


三、使用OUT参数

例子

CREATE OR REPLACE PROCEDURE query_emp
(p_id IN employees.employee_id%TYPE,p_name OUT employees.last_name%TYPE,p_salary OUT employees.salary%TYPE) IS
BEGINSELECT last_name, salary INTO p_name, p_salaryFROM employeesWHERE employee_id = p_id;
END query_emp;
DECLAREa_emp_name employees.last_name%TYPE;a_emp_sal employees.salary%TYPE;
BEGINquery_emp(178, a_emp_name, a_emp_sal); ...
END;
(1)使用前面的OUT例子

使用OUT参数创建一个过程来检索有关员工的信息。 该过程接受员工ID的值178,并将ID 178的员工的姓名和薪水检索到两个OUT参数。

query_emp过程有三个形式参数。 其中两个参数是OUT参数,将值返回给调用环境,如上一张幻灯片底部的代码框中所示。

该过程通过p_id参数接受员工ID值。 a_emp_name和a_emp_sal变量用从查询中检索到的信息填充到它们的两个相应的OUT参数中。
确保用于从OUT参数检索值的实际参数变量的数据类型具有足够大的尺寸以保存数据值回。

(2)在Application Express中查看OUT参数

使用通过调用DBMS_OUTPUT.PUT_LINE过程显示的PL / SQL变量。

DECLAREa_emp_name employees.last_name%TYPE;a_emp_sal employees.salary%TYPE;
BEGINquery_emp(178, a_emp_name, a_emp_sal);DBMS_OUTPUT.PUT_LINE('Name: ' || a_emp_name);DBMS_OUTPUT.PUT_LINE('Salary: ' || a_emp_sal);
END;

Name: Grant
Salary: 7700


四、使用IN OUT参数

例子


(1)使用前面 IN OUT例子

使用IN OUT参数,您可以将值传递到可以在过程中更新的过程。从调用环境提供的实际参数值可以返回为以下任一值:
•原始未改变的值

•过程中设置的新值

上面的示例使用IN OUT参数创建一个过程,以接受包含电话号码数字的10个字符的字符串。 该过程返回前三个字符前后括号格式化的电话号码和第六个数字后的连字符。 例如,电话字符串'8006330575'返回为'(800)633-0575'。

(2)调用前面 IN OUT例子

以下代码创建一个声明a_phone_no的匿名块,为其分配未格式化的电话号码,并将其作为实际参数传递给FORMAT_PHONE过程。 该过程被执行并返回a_phone_no变量中的更新字符串,然后显示该字符串。

DECLAREa_phone_no VARCHAR2(13);
BEGINa_phone_no := '8006330575' ;format_phone (a_phone_no);DBMS_OUTPUT.PUT_LINE('The formatted phone number is: '|| a_phone_no);
END;


五、参数模式总结


(1)传递参数的语法
从呼叫环境传递参数有三种方式:
•定位:按照与形式参数相同的顺序列出实际参数
•命名:以任意顺序列出实际参数,并使用关联运算符('=>',它是一个等号和一个箭头)将一个指定形式参数与其实际参数
•组合:列出一些实际参数为位置(无特殊操作符)和一些命名(使用=>操作符)。

参数传递示例

CREATE OR REPLACE PROCEDURE add_dept(p_name IN my_depts.department_name%TYPE,p_loc IN my_depts.location_id%TYPE) IS
BEGININSERT INTO my_depts(department_id,department_name, location_id)VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;

(2)通过位置符号传递

add_dept ('EDUCATION', 1400);

(3)通过命名符号传递

add_dept (p_loc=>1400, p_name=>'EDUCATION');
CREATE OR REPLACE PROCEDURE add_dept(p_name IN my_depts.department_name%TYPE,p_loc IN my_depts.location_id%TYPE) IS
BEGININSERT INTO my_depts(department_id,department_name, location_id)VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;
(4)通过组合符号传递
add_dept ('EDUCATION', p_loc=>1400);

下面的调用会成功执行吗?

add_dept (p_loc => 1400, 'EDUCATION');

答案:否,因为在使用组合表示法时,位置表示法参数必须在命名表示法参数之前列出。

下面的调用会成功执行吗?

add_dept ('EDUCATION');
ORA-06550: line 2, column 1:
PLS-00306: wrong number or types of arguments in call to
'ADD_DEPT'
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
1. begin
2. add_dept(‘EDUCATION’);
3. end;

答案:不可以。您必须为每个参数提供一个值,除非正式参数被分配了默认值。但是如果你真的想省略一个实际的参数,或者你不知道参数的值呢?接下来讨论指定形式参数的默认值。


六、使用IN参数的DEFAULT选项

可以为正式的IN参数分配一个默认值。 这在传递参数时提供了灵活性。

CREATE OR REPLACE PROCEDURE add_dept(
p_name my_depts.department_name%TYPE:='Unknown',
p_loc my_depts.location_id%TYPE DEFAULT 1400)
IS
BEGININSERT INTO my_depts (...)VALUES (departments_seq.NEXTVAL, p_name, p_loc);
END add_dept;

(1)上面的代码显示了给IN参数分配默认值的两种方法。 

显示的两种方式使用:

•赋值运算符(:=),如p_name参数所示

•DEFAULT选项,如p_loc参数所示

(2)使用参数的DEFAULT选项

以下是调用add_dept过程的三种方法:
•第一个示例为每个参数分配默认值。
•第二个例子说明了位置和命名符号的组合以分配值。 在这种情况下,使用命名符号作为示例。
•最后一个示例使用name参数的缺省值和p_loc参数的提供值。
add_dept;
add_dept ('ADVERTISING', p_loc => 1400);
add_dept (p_loc => 1400);
(3)使用参数DEFAULT选项的准则
•您不能将默认值分配给标题中的OUT和IN OUT参数,但可以在过程的主体中。
•通常,您可以使用命名符号来覆盖形式参数的默认值。 但是,如果没有为形式参数提供默认值,则不能跳过提供实际参数。
•继承DEFAULT值的参数与NULL不同。


(4)在运行期间处理参数错误

注意:所有位置参数应在子程序调用中的指定参数之前。 否则,您会收到一条错误消息,如以下示例所示:

BEGINadd_dept (name =>'new dept', 'new location');
END;

生成以下错误消息:

ORA-06550: line 2, column 33:
PLS-00312: a positional parameter association may not follow a named
association
ORA-06550: line 2, column 6:
PL/SQL: Statement ignored
1. BEGIN
2. add_dept(name=>'new dept', 'new location');
3. END;


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.elasticsearch文档存储(保存|修改|删除)

【README】 0.本文部分内容(数据)总结自 es 开发文档, Document APIs | Elasticsearch Guide [7.2] | Elastic ; 1.本文的es版本是7.2.1; 2.elasticsearch 是一个数据存储,检索和分析引擎;本…

db9针232接口波特率标准_理解串口通信以及232,485,422常见问题

下面先讲一讲串口通信的一些基本概念,术语。如果对串口通信比较熟悉的,就当复习复习,如果哪里讲错或不到位,也可以及时指出,当作一块交流交流。这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲。因…

理解 .NET Platform Standard

.NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md .NET Platform Standard 是什么?直译过来就是 .NET 平台规范或标准,它的目的就是使 .NET 各个平台之间更加统一…

Oracle入门(十四.18)之使用动态SQL

一、SQL的执行流程数据库中的所有SQL语句都经历了不同的阶段: •解析:预执行“这可能吗?”检查包括语法,对象存在,权限等 •绑定:获取语句中引用的任何变量的实际值 •执行:语句被执行。•提取&…

天平游码读数例题_初二上册物理实验——托盘天平使用的注意事项

今天给大家讲讲托盘天平的使用和注意事项。(1)首先,我们回忆一下什么是托盘天平如下图托盘天平由底座、横梁、分度盘、托盘、平衡螺母、标尺、游码、托盘等组成,当然还有砝码。托盘天平是称量物体的质量的工具(质量符号m,单位:国际…

3.elasticsearch文档查询dsl

【README】 1.本文elasticsearch版本是 7.2.1; 2.文档查询语句叫做 DSL, domain structure language, 领域特定语言;dsl,参见 Query DSL | Elasticsearch Guide [7.2] | Elastic 3.elasticsearch 基于json 提供了完…

Oracle入门(十四.19)之触发器简介

一、触发器的需求让我们从一个例子开始吧:一条业务规则规定,只要员工的工资发生变化,变更就必须记录在日志记录表中。 可以创建两个过程来执行此操作:UPD_EMP_SAL更新工资,LOG_SAL_CHANGE将行插入日志表。可以从UPD_EM…

搜狐视频Redis私有云cachecloud开源了

项目地址:https://github.com/sohutv/cachecloud/ 一、CacheCloud是做什么的 CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减…

springboot 订单重复提交_瞬间几千次的重复提交,我用Spring Boot+Redis扛住了

在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等!我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的…

Oracle入门(十四.21)之创建DML触发器:第二部分

一、使用条件谓词 在上文中,看到了一个触发器,可以防止在周末插入EMPLOYEES: CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGINIF TO_CHAR(SYSDATE,DY) IN (SAT,SUN) THENRAISE_APPLICATION_ERROR(-20500,You may ins…

【直播预告】创享未来 2016微软开发者峰会

感谢所有中国开发者对2016微软开发者峰会的热情关注,目前活动已经截止报名了,不过M姐为大家带来新的福利: 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播! 2016微软开发者峰会将全程线上直播…

定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...

时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下。时间概述由上图可知:通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calendar时间,即从1970年1月1日的UTC时间从0时0分0妙…

Oracle入门(十四.20)之创建DML触发器:第一部分

一、什么是DML触发器?DML触发器是执行SQL DML语句(INSERT,UPDATE或DELETE)时自动触发(执行)的触发器。 您可以通过两种方法对DML触发器进行分类: •执行时间:BEFORE,AFTE…

IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构

本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构。这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现。如下图所示: 每次一提到“层”这个字的时候,似乎感觉这个字特别的惹火。很多朋友开始讨论起…

c遗传算法的终止条件一般_KDD比赛之遗传算法(举例理解)

求最大值问题是这样的:求解函数 f(x) x 10*sin(5*x) 7*cos(4*x) 在区间[0,9]的最大值。这个函数大概长这样:那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数的形状多么奇怪,遗传算法都…

6.elasticsearch查询与过滤上下文(query context与filter contenxt)以及term术语查询

【README】 1.本文总结自: Query and filter context | Elasticsearch Guide [7.2] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-filter-context.html2.文档相关性分数是否被计算,取决于查询子句是在查询上下文&…

Oracle入门(十四.22)之创建DDL和数据库事件触发器

一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接。 •DBA启动或关闭数据库。•用户会话中引发了…

Visual Studio上开发Python?你不可不知道的六大功能!

Visual Studio 2013/2015 搭配 Python Tools for Visual Studio 扩充套件让 Visual Studio 能提供对 Python 程序语言高度整合的开发环境,并完整发挥 Visual Studio 强大的功能,协助您在 Visual Studio 内开发 Python 程序上如虎添翼,提升开发…

qt中sendevent_Qt中postEvent和sendEvent函数

Qt中postEvent和sendEvent函数部分内容参考http://blog.csdn.net/lvmengzou/article/details/65450908qt事件循环需要维护一个事件队列,在Qt的main函数中最后一般调用QApplication::exec()成员函数来保持程序对事件队列的处理,exec()的实质是不停调用pro…

IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思。 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分“亲缘性”的概念&…