PL/SQL中存储过程int和out的用法

本文介绍了PL/SQL中存储过程的in和out参数的使用方法,包括单值输入输出、多值查询及对象属性查询,并展示了如何使用光标获取所有记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PL/SQL中存储过程int和out的用法
一   介绍
过程和函数中的in和out
(1)一般来讲,过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。
(2)但过程和函数都可以通过out指定一个或多个输出参数。我们可以利用out参数,在过程和函数中实现返回多个值。
二  int和out的使用举例
1.Int输入和out输入和输出一个值
create or replace procedure updateSal(emp_no in number,empsal out number)
    as
    emp_sal emp.sal%type;
    begin

        select sal into emp_sal from emp where empno=emp_no;

        update emp set sal = emp_sal*1.1 where empno=emp_no;
        empsal:=emp_sal;--赋值自动输出
   end;

SQL> set serveroutput on;
SQL> declare
  2  num number;
  3  begin
  4  updateSal(7369,num);
  5  dbms_output.put_line(num);
  6  end;
  7  /
 
800
PL/SQL procedure successfully completed



2.通过empno查询多个值
create or replace procedure selectEmp(emp_no in number, ename out varchar2,job out varchar2 ,sal out number) is
begin
  select ename,job,sal into ename,job,sal from emp where empno=emp_no;
end selectEmp;

测试:
SQL> declare
  2  ename varchar2(40);
  3  job varchar2(40);
  4  sal number;
  5  begin
  6  selectEmp(7369,ename,job,sal);
  7  dbms_output.put_line(ename||job||sal);
  8  end;
  9  /
 
SMITHCLERK800


3.通过empno查询一个对象的所有属性
create or replace procedure selectemp1(emp_no in number, emp_row out emp%rowtype) is
begin
  select *  into emp_row from emp where empno=emp_no;
end selectemp1;

测试:
SQL> set serveroutput on;
SQL> declare
  2  emp_row emp%rowtype;
  3  begin
  4  selectemp1(7369,emp_row);
  5  dbms_output.put_line(emp_row.ename);
  6  end;
  7  /
SMITH

  4.通过使用光标来获取所有的emp下的


首先用存储过程来调用所有的员工
因为获取的是一个集合,所以要把集合放到一个光标里,放到光标里要建一个包,首先要声明包结构,然后创建包体。
(1)	声明包结构


create or replace package empPackage is
  -- 声明需要的类型
  type empcursor is ref cursor;
  --存储过程的声明  参数中使用了type变量声明的类型
  procedure selectEmps(emplist out empcursor);
end empPackage;
--执行之后自动创建包体
(2)创建包体
create or replace package body empPackage is
--包中声明 存储过程的实现  方法的变量必须一致
  procedure selectEmps(emplist out empcursor)  is
  --s声明返回的变量
  begin
    --为光标赋值 
   open emplist for select * from emp;
  end;
  --结束包体
end empPackage;


--注:包体的名称和包的名称一致 emppackage


(2)	测试


SQL> declare
  2  empcl empPackage.empcursor;
  3  emp_row emp%rowtype;
  4  begin
  5       empPackage.selectEmps(empcl);
  6     loop
  7        fetch empcl into emp_row;
  8        exit when empcl%notfound;
  9        dbms_output.put_line(emp_row.empno);
 10      end loop;
 11      close empcl;
 12    end;
 13  /
 
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
12
13
90
233
 
PL/SQL procedure successfully completed


用存储函数的方法来调用所有的员工
(1)	声明包结构
create or replace package functionEmps is
  --声明类型
  type empcl is ref cursor;
  function queryEmps return empcl;
end functionEmps;


(2)	创建包体
create or replace package body functionEmps is
function queryEmps return empcl is
  emp_cl empcl;
  begin
    open emp_cl for select * from emp;
    return emp_cl;
  end;
end functionEmps;


(3)测试
SQL> declare
  2    emp_cl functionEmps.empcl;
  3    emp_row  emp%rowtype;
  4    begin
  5      emp_cl:=functionEmps.queryEmps;
  6      loop
  7        fetch emp_cl into emp_row;
  8        exit when emp_cl%notfound;
  9        dbms_output.put_line(emp_row.empno);
 10      end loop;
 11      close emp_cl;
 12    end;
 13  /
 
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
12
13
90
233
 
PL/SQL procedure successfully completed


### PL/SQL 存储过程用法 #### 创建存储过程 在 Oracle 数据库中,可以通过两种方式创建存储过程。一种是在菜单栏中依次点击 `File -> New -> Program Window -> Procedure` 来打开一个新的程序窗口并编写存储过程代码;另一种则是通过左侧导航窗格定位到 Procedures 节点,右键单击选择 `New` 功能来快速进入编辑界面[^1]。 下面是一个简单的存储过程示例,用于打印字符串 "Hello World!": ```sql CREATE OR REPLACE PROCEDURE say_hello AS BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; / ``` 当执行上述代码后,如果一切正常,则会显示消息提示:“PL/SQL 过程已成功完成。” 同时,在实际测试过程中可以看到控制台输出 “Hello World!” 的字样[^2]。 #### 执行存储过程 一旦定义好了一个存储过程之后,就需要考虑如何去调用了。通常情况下,可以借助 EXECUTE 命令来进行简单快捷的操作。例如要运行刚才提到的那个名为 `say_hello` 的例子,只需输入以下命令即可: ```sql EXECUTE say_hello; ``` 另外值得注意的是,除了直接手动触发之外,还可以利用其他手段比如定时器或者事件驱动机制自动激活这些预编写的脚本逻辑[^3]。 #### 参数传递方式 针对那些带有参数需求的情况来说,共有三种不同的传参模式可供选用——即按照位置顺序指定值(Positional Notation)、依据变量名赋值给定目标属性(Named Notation),以及混合以上两者特点形成的复合形式(Mixed Notation)。无论采用哪一类策略,其基本原理都跟常规意义上的函数非常相似。 这里给出一个接受两个数值作为入参,并返回它们相加结果的例子: ```sql CREATE OR REPLACE PROCEDURE add_numbers ( num1 IN NUMBER, num2 IN NUMBER, result OUT NUMBER ) AS BEGIN result := num1 + num2; END; / -- 使用绑定变量接收输出 VARIABLE res NUMBER; EXECUTE add_numbers(5, 7, :res); PRINT res; ``` 在这个案例里展示了如何声明带有一个输入型(`IN`)另一个输出型(`OUT`)类型的形参列表结构体设计思路。最后还演示了怎样运用宿主环境所提供的特殊语法特性(:variable_name),从而使得整个交互流程变得更加直观易懂[^4]。 #### 复杂数据类型处理 有时候可能还会遇到更加复杂的业务场景,这时候就不得不引入一些高级的数据结构概念了。比如说数组对象就是其中之一。我们先来看一下它的基础构建方法: ```sql CREATE OR REPLACE TYPE int_varray IS TABLE OF INT; / ``` 有了这个自定义集合类以后,便能够轻松实现诸如寻找最大数之类的功能模块封装工作了。具体做法如下所示: ```sql CREATE OR REPLACE FUNCTION find_max (input_array IN int_varray) RETURN INT DETERMINISTIC PARALLEL_ENABLE AGGREGATE USING MAX_AGGREGATION_TYPE; CREATE OR REPLACE PACKAGE max_aggregation_package AS TYPE max_record_type IS RECORD(value INT); FUNCTION initialize RETURN max_record_type; PROCEDURE iterate(self IN OUT NOCOPY max_record_type, element IN INT); FUNCTION terminate(self IN max_record_type, out_value OUT INT, out_indicator OUT VARCHAR2) RETURN BOOLEAN; END max_aggregation_package; / CREATE OR REPLACE PACKAGE BODY max_aggregation_package AS ... END max_aggregation_package; / ``` 尽管这段伪代码片段看起来比较复杂,但它确实很好地诠释出了围绕特定主题展开深入探讨的价值所在。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值