一、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;

Oracle入门(十四.17)之procedure传递参数相关推荐

  1. 【批处理学习笔记】第二十四课:直接传递

    直接传递参数,即在使用call命令时,不使用任何参数,在子函数或子批处理里面直接对主函数(也称父批处理)里面的变量进行修改.这跟汇编语言里面的参数传递方式类似.     直接传递参数举例: ===== ...

  2. Cocos Shader入门基础四:Uniform与材质参数控制

    零.这个时代,太快 如果有朋友年龄和麒麟子相仿的话,小时候应该玩过DVD播放机,就下面图里这东西. 那么问题来了,你还记得,如果想要播放自己想看的内容,一共分几步吗? 和把大象装进冰箱一样简单,只需要 ...

  3. Oracle入门(十四.13)之带参数的游标

    一.带参数的游标 参数是一个变量,其名称用于游标声明中. 当游标打开时,参数值被传递给Oracle服务器,Oracle服务器使用它来决定要将哪些行检索到光标的活动集中. 这意味着您可以在块中多次打开和 ...

  4. 快速入门 | 篇十四:运动控制器基础轴参数与基础运动控制指令

    之前正运动技术与大家分享了,运动控制器的固件升级.ZBasic程序开发.ZPLC程序开发.与触摸屏通讯和输入/输出IO的应用.运动控制器数据与存储的应用.运动控制器ZCAN.EtherCAT总线的使用 ...

  5. Python实战从入门到精通第十四讲——定义有默认参数的函数

    定义一个函数或者方法,它的一个或多个参数是可选的并且有一个默认值. 定义一个有可选参数的函数是非常简单的,直接在函数定义中给参数指定一个默认值,并放到参数列表最后就行了.例如: def spam(a, ...

  6. java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象

    上一期是变量,在java中变量总是无处不在,而变量其意就是可以改变的数,在一般情况下我们可以以变量类型,变量名,变量值来描述它 这一期是给面向对象(OOP)开了一个头,对他的概念,三大特征有了一个基础 ...

  7. Oracle笔记 十四、查询XML操作、操作系统文件

    --1.随机数 select dbms_random.value from dual; select mod(dbms_random.random, 10) from dual; --0-9随机数 s ...

  8. Oracle入门(四)之查询基本信息

    一.查询基本信息 (1) 查询实例服务 SQL> show parameter instance name (2)查询数据库名字 SQL> show parameter db_name; ...

  9. slam入门——十四讲笔记(一)

    文章目录 第1讲 预备知识 第1部分 数学基础 第2讲 初识SLAM 2.1 引子:小萝卜的例子 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 实践:编程基础 1. 安装Lin ...

最新文章

  1. 我很高兴找了一张可以说明:为什么软件开发那么困难的图
  2. C# 中的var关键字
  3. Linux之SSH服务端配置文件安全设置
  4. 边缘计算大热 AI芯片站上风口
  5. ssh协议是osi_计算机网络协议分析
  6. Redis: Redis支持五种数据类型
  7. PAIP.一些流氓软件的流氓营销方法.txt
  8. 【路径规划】基于matlab HybridA_Star算法机器人路径规划【含Matlab源码 1390期】
  9. 在ADS中进行DCR仿真
  10. 【136】Cydia相关插件及配置
  11. STM8S003外部中断配置
  12. Mac和Windows哪个好 ?windows和mac对比介绍
  13. 解读Tapestry5.1——页面渲染
  14. 【经验教程】iPhone苹果手机开通腾讯视频VIP连续包年会员怎么取消苹果关闭订阅连续包年?
  15. scala获取字符串首字符和尾字符
  16. Python编程基础(1)
  17. 地理课(geography)
  18. Delegate: What is this? ----什么是Delegate(委托)
  19. 数字人民币银银合作以及平台接入的模式分析
  20. Android的焦点(Focus)问题 focusable

热门文章

  1. 快速幂算法相关题目(Leetcode题解-Python语言)
  2. [Java基础]JDK内置注解
  3. [C++STL]deque容器用法介绍
  4. C++函数模板机制结论
  5. 计算机博士两篇一区两篇会议,本科博士联手!西电陈渤团队两篇论文被顶级会议录用...
  6. 数据结构与算法--丑数
  7. java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...
  8. 1190 最小公倍数之和 V2
  9. Acwing 252. 树 点分治
  10. 牛客题霸 [ 调整数组顺序使奇数位于偶数前面] C++题解/答案