Oracle入门(十四.17)之procedure传递参数
发布日期:2021-07-01 01:36:56 浏览次数:2 分类:技术文章

本文共 4226 字,大约阅读时间需要 14 分钟。

一、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)ISBEGIN UPDATE my_employees SET 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) ISBEGIN SELECT last_name, salary INTO p_name, p_salary FROM employees WHERE employee_id = p_id;END query_emp;
DECLARE a_emp_name employees.last_name%TYPE; a_emp_sal employees.salary%TYPE;BEGIN query_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变量。

DECLARE a_emp_name employees.last_name%TYPE; a_emp_sal employees.salary%TYPE;BEGIN query_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变量中的更新字符串,然后显示该字符串。

DECLARE a_phone_no VARCHAR2(13);BEGIN a_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) ISBEGIN INSERT 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) ISBEGIN INSERT 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 ignored1. begin2. 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)ISBEGIN INSERT 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)在运行期间处理参数错误

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

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

生成以下错误消息:

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

转载地址:https://maokun.blog.csdn.net/article/details/80533823 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Oracle入门(十四.18)之使用动态SQL
下一篇:Oracle入门(十四.16)之捕获用户定义的异常

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月02日 00时07分23秒