Oracle 存储过程参数
- 格式:doc
- 大小:78.50 KB
- 文档页数:5
oracle查存储过程内容Oracle数据库是一种关系型数据库管理系统,在企业中被广泛应用于数据存储和管理。
而存储过程则是Oracle数据库中一种非常重要的对象,它可以被视为一组预定义的SQL语句集合,可以在数据库中进行复杂的数据操作和业务逻辑处理。
本文将详细介绍Oracle存储过程的内容和用法。
一、存储过程的定义与创建存储过程是由一组SQL语句组成的代码块,在数据库中以独立的对象形式存在。
通过存储过程,可以将一系列的SQL语句封装在一起,形成一个逻辑单元,方便进行复杂的数据操作和业务逻辑处理。
要创建一个存储过程,首先需要使用CREATE PROCEDURE语句定义存储过程的名称和参数。
存储过程的参数可以分为输入参数(IN)、输出参数(OUT)和输入输出参数(IN OUT)三种类型。
通过参数的设置,可以方便地传递数据给存储过程,并获取存储过程的执行结果。
二、存储过程的调用和执行在Oracle数据库中,可以使用EXECUTE或者CALL语句来调用存储过程。
调用存储过程时,可以传递参数给存储过程,并接收存储过程的执行结果。
存储过程的执行过程可以分为三个阶段:编译、解释和执行。
在编译阶段,数据库会检查存储过程的语法和语义正确性,并生成存储过程的执行计划。
在解释阶段,数据库会解释存储过程的代码,并将其转化为可执行的机器码。
在执行阶段,数据库会执行存储过程的代码,并返回执行结果。
三、存储过程的优势和应用场景存储过程具有以下几个优势:1. 提高数据库性能:由于存储过程是预编译和预优化的,因此可以减少SQL语句的解析和优化时间,提高数据库的执行效率。
2. 降低网络流量:存储过程可以在数据库服务器端执行,减少了与客户端之间的数据传输,降低了网络流量。
3. 保证数据一致性和完整性:通过存储过程,可以对数据库中的数据进行复杂的操作和业务逻辑处理,从而保证了数据的一致性和完整性。
4. 提高安全性:存储过程可以对外屏蔽数据表的细节,只暴露必要的接口,提高了数据库的安全性。
oracle 存储过程输出参数的使用在Oracle中,存储过程可以有输入参数、输出参数和输入输出参数。
输出参数允许存储过程返回一个或多个值给调用者。
以下是使用输出参数的步骤:1. 声明输出参数:在创建存储过程时,需要声明输出参数。
这可以通过在参数列表中指定参数名和数据类型,并添加`OUT`关键字来完成。
2. 在存储过程中设置输出参数的值:可以使用`:=`操作符将值赋给输出参数。
3. 在调用存储过程时,必须为输出参数提供一个变量来接收返回的值。
以下是一个使用输出参数的存储过程的例子:```sqlCREATE OR REPLACE PROCEDURE get_employee_salary (p_emp_id IN employees.employee_id%TYPE,p_salary OUT employees.salary%TYPE) ISBEGINSELECT salary INTO p_salary FROM employees WHERE employee_id = p_emp_id;END;/```在这个例子中,`p_salary`是一个输出参数。
当调用这个存储过程时,需要提供一个变量来接收返回的薪水值。
调用这个存储过程的代码可能如下所示:```sqlDECLAREv_salary employees.salary%TYPE;BEGINget_employee_salary(100, v_salary);DBMS_OUTPUT.PUT_LINE('Salary is ' || v_salary);END;/```在这个例子中,我们声明了一个变量`v_salary`来接收存储过程返回的薪水值,然后使用`DBMS_OUTPUT.PUT_LINE`来打印这个值。
oracle调用存储过程查询数据的函数在Oracle数据库中,可以使用`EXECUTE`语句来调用存储过程查询数据。
具体的语法如下:```sqlEXECUTE procedure_name(parameters);```其中,`procedure_name`是存储过程的名称,`parameters`是存储过程的参数(如果有的话)。
下面是一个示例,假设有一个名为`get_employee`的存储过程,用于查询员工信息:```sqlCREATE OR REPLACE PROCEDURE get_employee(p_employee_id IN NUMBER,p_employee_name OUT VARCHAR2,p_employee_salary OUT NUMBER) ASBEGINSELECT employee_name, salaryINTO p_employee_name, p_employee_salaryFROM employeesWHERE employee_id = p_employee_id;END;/```要调用这个存储过程并查询数据,可以使用`EXECUTE`语句:```sqlVARIABLE v_employee_name VARCHAR2(100);VARIABLE v_employee_salary NUMBER;EXECUTE get_employee(1001, :v_employee_name, :v_employee_salary);PRINT v_employee_name;PRINT v_employee_salary;```在上述示例中,首先使用`VARIABLE`声明变量以接收存储过程的输出参数。
然后使用`EXECUTE`语句调用`get_employee`存储过程,并将输出参数绑定到相应的变量上。
最后,使用`PRINT`命令打印变量的值。
需要注意的是,存储过程的声明和调用必须在Oracle的PL/SQL环境中进行,例如使用SQL*Plus、SQL Developer等工具。
oracle存储过程的用法一、存储过程概述存储过程是在数据库中预先编译好的SQL语句集合,它可以在数据库中作为一个独立的对象存在,并由数据库管理系统执行。
存储过程具有可重复使用、可编译优化、可嵌套调用等优点,是数据库开发中常用的一种技术手段。
二、存储过程的创建要创建存储过程,需要使用Oracle数据库的SQL开发工具(如SQLDeveloper)或命令行工具(如SQL*Plus)。
创建存储过程的语法如下:```sqlCREATEPROCEDUREprocedure_name[parameter_list][IS|AS]block_of_code[LANGUAGE][sql][EXECUTEIMMEDIATE]SQL_CODE```其中,`procedure_name`是存储过程的名称,`parameter_list`是可选的参数列表,`block_of_code`是存储过程的主体代码,`LANGUAGE`指定存储过程的编程语言(如PL/SQL),`EXECUTEIMMEDIATE`用于执行动态SQL代码。
三、存储过程的参数存储过程的参数可以是输入参数、输出参数或输入/输出参数。
输入参数表示从调用方传递给存储过程的值,输出参数表示存储过程的结果值返回给调用方,而输入/输出参数则同时具有输入和输出功能。
在存储过程中,可以使用SQL数据类型(如VARCHAR2、NUMBER、DATE等)或Oracle特有的数据类型(如RAW、BLOB等)来定义参数。
同时,还可以使用PL/SQL的数据类型(如RAW、BLOB、CLOB等)来定义存储过程的局部变量和输出参数。
四、存储过程的调用要调用存储过程,需要使用EXECUTE语句或调用对象的方法。
例如:```sqlEXECUTEprocedure_name(parameter1,parameter2);```或```vbnetprocedure_object.procedure_method();```其中,`procedure_name`是存储过程的名称,`parameter1`和`parameter2`是传递给存储过程的参数值。
oracle procedure 参数Oracle 存储过程是一段在 Oracle 数据库中存储并可以重复使用的代码,它能够完成特定的操作和逻辑。
Oracle 存储过程不仅能够提高数据库的性能,还能简化应用程序和数据库之间的交互。
在编写 Oracle 存储过程时,参数是非常重要的元素之一,因为它们可以让你将变量的值传递给存储过程。
Oracle 存储过程的参数可以分为两种类型:输入参数和输出参数。
输入参数允许存储过程中使用调用方提供的值;输出参数允许存储过程向调用方返回值。
在 Oracle 存储过程中,参数可以在声明中使用通用语法:参数名参数类型(长度) 方向,默认值。
参数名是必需的,可以任意指定名称;参数类型指定参数的数据类型;长度指定参数的宽度或长度,如果不指定,则使用默认值;方向指定参数是输入参数还是输出参数;默认值指定参数的默认值,如果参数在调用时没有被指定,使用该默认值作为参数值。
在 Oracle 存储过程中,使用 IN 关键字来定义输入参数,例如:CREATE OR REPLACE PROCEDURE test_procedure(input_param IN VARCHAR2)ISBEGIN-- 存储过程代码END;在上面的例子中,input_param 是输入参数的名称,VARCHAR2 是该参数的数据类型。
该存储过程只有一个输入参数,其方向是 IN。
在 Oracle 存储过程中,使用 OUT 关键字来定义输出参数,例如:CREATE OR REPLACE PROCEDURE test_procedure(output_param OUT NUMBER)ISBEGIN-- 存储过程代码END;在上面的例子中,output_param 是输出参数的名称,NUMBER 是该参数的数据类型。
该存储过程只有一个输出参数,其方向是 OUT。
当一个存储过程有多个参数时,可以在声明中使用逗号分隔它们,例如:CREATE OR REPLACE PROCEDURE test_procedure(input_param1 IN NUMBER,input_param2 IN VARCHAR2,output_param OUT VARCHAR2)ISBEGIN-- 存储过程代码END;在上面的例子中,test_procedure 存储过程有三个参数,其中 input_param1 和input_param2 是输入参数,output_param 是输出参数。
oracle procedure 数组参数摘要:1.Oracle 存储过程简介2.Oracle 存储过程的参数3.数组参数的使用方法4.数组参数的优势5.示例代码正文:1.Oracle 存储过程简介Oracle 存储过程是一种预编译的SQL 语句集合,用于执行特定的任务。
它可以封装复杂的业务逻辑,提高数据库操作的效率和安全性。
在Oracle 数据库中,存储过程可以通过PL/SQL 语言编写,并在需要时调用。
2.Oracle 存储过程的参数Oracle 存储过程可以接受输入参数,以便根据实际需求执行相应的操作。
参数分为两种类型:输入参数和输出参数。
输入参数用于存储过程的调用方传递数据,而输出参数用于将执行结果返回给调用方。
3.数组参数的使用方法在Oracle 存储过程中,可以使用数组作为参数。
数组参数可以提高代码的可读性和可维护性,特别是在需要传递大量数据的场景下。
要使用数组参数,需要先定义一个数组,然后在存储过程中使用该数组。
以下是一个使用数组参数的Oracle 存储过程示例:```CREATE OR REPLACE PROCEDURE process_array_params( p_array IN NUMBERS_TABLE,p_start IN NUMBER,p_end IN NUMBER)ISv_sum NUMBER;BEGINFOR i IN p_start..p_end LOOPv_sum := v_sum + p_array(i);END LOOP;DBMS_OUTPUT.PUT_LINE("数组元素之和:" || v_sum); EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE("未找到数据");END;/```4.数组参数的优势使用数组参数有以下优势:- 降低内存使用:数组参数可以避免频繁地创建和销毁临时表,从而降低内存使用。
1、基本语法创建存储过程,需要有CREATEPROCEDURE或CREATE ANY PROCEDURE的系统权限。
该权限可由系统管理员授予。
创建一个存储过程的基本语句如下:CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]{AS|IS}[说明部分:参数定义、变量定义、游标定义]BEGIN可执行部分[EXCEPTION 错误处理部分]END [过程名];其中:可选关键字OR REPLACE 表示如果存储过程已经存在,则用新的存储过程覆盖,通常用于存储过程的重建。
参数部分用于定义多个参数(如果没有参数,就可以省略)。
参数有三种形式:IN、OUT和IN OUT;如果没有指明参数的形式,则默认为IN。
IN 定义一个输入参数变量,用于传递参数给存储过程OUT 定义一个输出参数变量,用于从存储过程获取数据IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能例1,创建带输入输出参数的存储过程:create or replace procedure test_procedure(a in number, x out varchar2)isbeginif a >= 90 thenbeginx := 'A';end;end if;if a < 90 thenbeginx := 'B';end;end if;if a < 80 thenbeginx := 'C';end;end if;if a < 70 thenbeginx := 'D';end;end if;if a < 60 thenbeginx := 'E';end;end if;end test_procedure;执行结果:例2、创建参数为IN OUT 的存储过程create table EMP (EMPNO number , ENAME varchar2(32) );insert into EMP (EMPNO ,ENAME) values (10,'张三');insert into EMP (EMPNO ,ENAME) values (20,'小马');insert into EMP (EMPNO ,ENAME) values (30,'小米');insert into EMP (EMPNO ,ENAME) values (40,'小明');CREATE OR REPLACE FUNCTION GET_EMP_NAME(P_EMPNO NUMBER DEFAULT 10)RETURN VARCHAR2 ASV_ENAME VARCHAR2(32);BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = P_EMPNO;RETURN(V_ENAME);EXCEPTIONWHEN NO_DATA_FOUND THEN-- DBMS_OUTPUT.PUT_LINE('没有该编号雇员!');RETURN('没有该编号雇员!');WHEN TOO_MANY_ROWS THEN-- DBMS_OUTPUT.PUT_LINE('有重复雇员编号!');RETURN('有重复雇员编号!');WHEN OTHERS THEN--- DBMS_OUTPUT.PUT_LINE('发生其他错误!');RETURN('发生其他错误!');END;。
存储过程,存储函数(Oracle)存储过程和存储函数指存储在数据库中供所有⽤户程序调⽤的⼦程序叫存储过程、存储函数。
存储过程和存储函数的区别?存储函数:可以通过return 语句返回函数值。
存储过程:不能除此之外我们可以认为他们是完全⼀样的。
存储过程1、创建存储过程⽤create procedure命令简历存储过程。
语法:create [or replace] procedure 过程名(参数列表)asPLSQL⼦程序体;打印hello word--打印hello worldcreate or replace procedure sayhelloworldas--说明部分begindbms_output.put_line('hello world');end;/编译后:2、调⽤存储过程⽅法:1、exec 过程名2、begin过程名;过程名;end;/测试调⽤存储过程--连接数据库C:\WINDOWS\system32>sqlplus scott/tiger@192.168.56.101:1521/orclSQL>--调⽤⽅式⼀SQL>set serveroutput onSQL>exec sayhelloworld;hello worldPL/SQL 过程已成功完成。
SQL>--调⽤⽅式⼆:SQL>begin2 sayhelloworld();3 sayhelloworld();4end;5/hello worldhello worldPL/SQL 过程已成功完成。
带参数的存储过程:--给指定员⼯薪⽔涨100,并且打印涨前和涨后的薪⽔create or replace procedure raiseSalary(eno in number) --in为输⼊参数as--说明部分psal emp.sal%type;begin--得到涨前的薪⽔select sal into psal from emp where empno=eno;update emp set sal=sal+100where empno=eno;--要不要commit?--为保证在同⼀事务中,commit由谁调⽤谁提交dbms_output.put_line('涨前:'||psal||' 涨后:'||(psal+100));end;/测试:存储函数函数(function)为⼀命名的存储程序,可带参数,并返回⼀计算值。
oracle存储过程inoutinout三种参数模式oracle 存储过程in out inout三种参数模式2009-10-05 09:03Oracle 过程中定义了in|out|in out3中参数模式,每个参数可以选择其一in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。
举个例子create or replace procedure update_price(p_product_id in NUMBER,p_factor in NUMBER)AS.....你在引用这个过程的时候给参数传入值exexute update_price(2,2.5);这是定义的2个参数就得到了值,in模式下值不能变out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程in out 表示高参数可以向该过程中传递值,也可以将某个值传出去简单的说in参数就是传入但存储过程里面处理的参数out参数就是返回值的参数。
in参数就像c++语言里函数一般的参数那样而out函数就像c++里函数的引用类型参数一样不知道我比喻是否正确,请高手指点create or replace procedure gettest2(stdname in varchar2,p_cursor in out types.mytype)asbeginopen p_cursor for select * from test where name=stdname;end;例如上面的存储过程stdname是in参数,传进去供查询语句使用p_cursor是 out参数,返回查询的结果集--------------------------------------------------------------------------------------------------------------------oracle 存储过程 in out2009-08-11 16:30创建过程语法:create [or replace] procedure procedure_name[ (argment [ { in| in out }] type,argment [ { in | out | in out } ] type{ is | as }<类型.变量的说明>( 注: 不用 declare 语句 )Begin<执行部分>exception<可选的异常处理说明>end;l 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。
oracle存储过程(⽆参⼀个参数两个参数输⼊输出参数)DROP TABLE DEMOA;CREATE TABLE DEMOA("DID" NVARCHAR2(100),"AGE" NUMBER,"TYPE" NVARCHAR2(2000))SELECT * FROM DEMOA;--⽰例1 ⽆参数CREATE OR REPLACE procedure demo002aserror_msg nvarchar2(1000);begindbms_output.put_line('The input string is:肖昌建' );error_msg := '没有错误!';end ;--⽅式⼀:begindemo002();end;--⽅式⼆:begindemo002;end;--⽰例2 ⼀个参数CREATE OR REPLACE procedure demo002(P_DID IN NVARCHAR2)aserror_msg nvarchar2(1000);begindbms_output.put_line('The input string is:' || P_DID);end ;--⽅式1declare n NVARCHAR2(200);beginn:='肖建';demo002(P_DID=>n);end;--⽅式2begindemo002(P_DID=>'肖建');end;-------------------------------------------------------------------------------------⽰例3 两个参数CREATE OR REPLACE PROCEDURE PRO_INSERT_DEMOA01(P_DID IN NVARCHAR2,P_AGE IN NUMBER)asbeginINSERT INTO DEMOA(DID,AGE,TYPE) VALUES(P_DID,P_AGE,'成年⼈');commit;END PRO_INSERT_DEMOA01;declare pid NVARCHAR2(100);page NUMBER;beginpid := 'gggg';page := 2;PRO_INSERT_DEMOA01(P_DID =>pid,P_AGE => page);end;--⽰例4 输⼊参数,输出参数CREATE OR REPLACE PROCEDURE PRO_INSERT_DEMOA(P_DID IN NVARCHAR2,P_AGE IN NUMBER,P_RESULT OUT NUMBER,P_REMARK OUT NVARCHAR2)asV_ERROR NVARCHAR2(2000);beginP_RESULT:=0;P_REMARK:='start';if P_AGE >18 thenINSERT INTO DEMOA(DID,AGE,TYPE) VALUES(P_DID,P_AGE,'成年⼈');commit;P_RESULT:=1;P_REMARK:='one';elsif P_AGE >= 6 and P_AGE <= 18 thenINSERT INTO DEMOA(DID,AGE,TYPE) VALUES(P_DID,P_AGE,'青少年');commit;P_RESULT:=1;P_REMARK:='two';elsedbms_output.put_line('other');end if;exceptionwhen no_data_foundthenP_RESULT := 2;when dup_val_on_indexthenP_RESULT := 3;when othersthenP_RESULT := -1;END PRO_INSERT_DEMOA;--调⽤DECLARE pid NVARCHAR2(100);page NUMBER;presult NUMBER;premark NVARCHAR2(2000);BEGINpid := 'gggg';page := 22;PRO_INSERT_DEMOA(P_DID=>pid,P_AGE=>page, P_RESULT=>presult, P_REMARK=>premark); dbms_output.put_line(presult);dbms_output.put_line(premark);END;。
Oracle存储过程参数在创建存储过程时,需要考虑的一件重要事情就是过程的灵活性,以方便随后可以重新使用。
通过使用“参数”可以使程序单元变得很灵活,参数是一种向程序单元输入和输出数据的机制,存储过程可以接受和返回0到多个参数。
Oracle有三种参数模式:IN、OUT和IN OUT。
1.IN参数该类型的参数值由调用者传入,并且只能够被存储过程读取。
这种模式的参数是最常用的,也是默认的参数模式。
例如,下面以SCOTT用户连接到数据库,并建立一个简单的存储过程ADD_EMPLOYEE。
顾名思义,该过程将接受一系列参数,并且将它们添加到SCOTT.EMP 表中:SQL> create or replace procedure add_employee(2 id_param in number,3 name_param in varchar2,4 job_param in varchar2,5 hire_param in date,6 salary_param in number) is7 begin8 insert into scott.emp(empno,ename,job,hiredate,sal)9 values(id_param,name_param,job_param,hire_param,salary_param);10 end add_employee;11 /过程已创建。
在为存储过程定义参数时,参数的数据类型不能包括大小和精度信息。
在调用该存储过程时,用户需要传递一系列参数,以便过程的执行部使用这些参数向SCOTT.EMP表添加一条记录。
在调用存储过程时有三种向其传递参数的方法:名称表示法、位置表示法和混合表示法。
名称表示法名称表示法是指为各个参数传递参数值时,指定传入数值的参数名。
使用名称表示法传递参数的语法形式如下:prcedure_name(param_name=>value[,param_name=>value]);例如,在下面的示例中使有名称表示法传递参数,以调用存储过程ADD_EMPLOYEE:SQL> alter session set nls_date_format = 'yyyy-mm-dd';会话已更改。
SQL> begin2 add_employee(id_param=>8000,name_param =>'ATG',3 job_param =>'CLERK',hire_param =>'1997-12-20',4 salary_param =>1500);5 end;6 /PL/SQL 过程已成功完成。
通过名称传递法传递参数的好处:规定了各个值被赋予哪个参数。
由于明确指定了向各个参数传递的值,因此在调用过程时就不再需要考虑创建过程时定义的参数顺序。
在使用名称表示法时,如果参数命名合理,这可以方便用户阅读、查阅以及调试代码。
下面使用打乱次序的参数调用过程,查看它是否能够正常运行:SQL> exec add_employee(name_param =>'LI',job_param =>'CLERK',hire_param =>'1999-10-20',id_param=>8120,salary_param =>1500);SQL> select empno,ename,job,hiredate,sal2 from emp3 where empno>8000;● 位置表示法当参数比较多时,通过名称表示法调用过程时可能会非常长。
为了克服名称表示法的弊端,可以采用位置表示法。
采有位置表示法传递参数时,用户提供的参数值顺序必须与过程中定义的参数顺序相同。
例如,下面的程序使用位置表示法传递参数调用ADD_EMPLOYEE 过程:SQL> exec add_employee(8021,'刘丽','SALESMAN','1995-10-17',2000);PL/SQL 过程已成功完成。
前面说过,存储过程会被保存在数据库中,这也就意味着,可以像使用DESCRIBE 命令列出表的结构一样,可以使用DESCRIBE 命令列出关于存储过程的详细信息。
在调用存储过程时,可以使用DESCRIBE 命令来查看过程定义的参数次序是否相同。
● 混合表示法从上面的示例可以看出,位置表示法和名称表示法各有自己的优缺点,为了弥补这两者的不足,还可以采用混合表示法发挥两者的优点。
下面的示例是采用了混合表示法调用存储过程ADD_EMPLOYEE :SQL> exec add_employee(8022,'王芳',hire_param =>'1996-11-17',job_param=>'clerk',salary_param=>3000)PL/SQL 过程已成功完成。
在上面的程序中,两个参数采用了位置表示法传递值,随后则切换为名称表示法传递参数。
当切换为名称表示法传递参数后,在后续的参数也必须使用名称表示法。
这就说,当ADD_EMPLOYEE 过程的第3个参数采用名称表示法传入值时,其第4、5个参数也必须使用名称表示法。
2.OUT 参数OUT 类型的参数则由存储过程传入值,然后由用户接收参数值。
下面通过SCOTT.EMP 表创建一个搜索过程,该过程将根据提供的EMPNO 列的值,检索雇员的ENAME 和SAL :注 意 在使用位置表示法传递参数调用过程时,用户需要确定过程中定义参数的次序,如果传递参数的次序与定义时的次序不相同,则调用过程时可能会失败,也可以得到非常难以预料的结果。
SQL> create or replace procedure search_employee(2 empno_param in number,3 name_param out emp.ename%type,4 salary_param out emp.sal%type) is5 begin6 select ename,sal7 into name_param,salary_param8 from scott.emp9 where empno=empno_param;10 exception11 when no_data_found then12 name_param:='NULL';13 salary_param:= -1;14 dbms_output.put_line('未找到指定编号的员工信息!');15 end search_employee;16 /过程已创建。
因为过程要通过OUT参数返回值,所以在调用它时必须提供能够接受返回值的变量。
因此,可以在编写PL/SQL匿名程序块时需要定义两个变量接收返回值,而在使用SQL*Plus 调用过程时,需要使用V ARIABLE命令绑定参数值。
下面的语句是在SQL*Plus中使用VARIABLE命令绑定参数值,并调用存储过程SEARCH_EMPLOYEE:SQL> variable name varchar2(10);SQL> variable sal number;SQL> exec search_employee(7499,:name,:sal);PL/SQL 过程已成功完成。
为了查看执行结果,可以在SQL*Plus中使用PRINT命令显示变量值:SQL> print nameNAME---------------------ALLENSQL> print salSAL---------------1600也可以通过如下的SELECT语句检索绑定的变量值:SQL> select :name,:sal2 from dual;:NAME :SAL-------------------------------- ----------ALLEN 1600在匿名程序块中调用存储过程SEARCH_EMPLOYEE的形式如下:SQL> set serverout onSQL> declare2 name emp.ename%type;3 sal emp.sal%type;4 begin5 search_employee(7499,name,sal);6 dbms_output.put('姓名:' || name);7 dbms_output.put_line(' 薪金:' || sal);8 end;9 /姓名:ALLEN 薪金:1600PL/SQL 过程已成功完成。
需要注意,在调用具有OUT参数的过程时,必须为OUT参数提供变量,即使OUT参数在过程中没有设置返回值,调用时也必须为其提供接受变量,否则调用过程是将会因为返回值将无法保存而出现错误。
如果用户使用常量或表达式调用这种类型的过程时,系统将出现如下的错误:SQL> set serverout onSQL> declare2 name emp.ename%type;3 begin4 search_employee(7499,name,1200);5 end;6 /search_employee(7499,name,1200);*第 4 行出现错误:ORA-06550: 第4 行, 第29 列:PLS-00363: 表达式'1200' 不能用作赋值目标ORA-06550: 第4 行, 第3 列:PL/SQL: Statement ignored3.IN OUT参数对于IN参数而言,它可以接收一个值,但是不能在过程中修改这个值。
而对于OUT 参数而言,它在调用过程时为空,在过程的执行中将为这参数指定一个值,并在执行结束后返回。
而IN OUT类型的参数同时具有IN参数和OUT参数的特性,在调用过程时即可以向类型的参数传入值,也可以从该参数接收值;而在过程的执行中即可以读取又写入该类型参数。
使用这种类型参数的一个典型示例就是交换两个数的位置,如下面的程序实现了交换两个数据的位置:SQL> create or replace procedure swap(2 num1_param in out number,3 num2_param in out number) is4 var_temp number;5 begin6 var_temp:=num1_param;7 num1_param:=num2_param;8 num2_param:=var_temp;9 end swap;10 /过程已创建。