1、什么是存储过程

存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。它可以接受参数、输出参数,并可以返回单个或多个结果集以及返回值。

2、存储过程基本语法

存储过程的一般格式如下:

CREATE [OR REPLACE] PROCEDURE procedure_name
IS [AS]
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;

调用存储过程:

call procedure_name();
---------------------------------
exec procedure_name();
---------------------------------
begin
pro_update_emp();
end;

写一个简单的存储过程使emp表的sal值增加300。

CREATE or replace procedure pro_update_emp
as
begin
update emp set sal=sal+300;
end;

调用存储过程

call pro_update_emp ();

3、数据类型

3.1 %type 数据类型:

当使用%TYPE属性定义变量时,Oracle会自动地按照数据库表中相应的列来确定新变量的类型和长度。
如下,将emp表的ename字段的数据类型(如 ‘varchar(2)’)赋给变量 v_ename

v_ename emp.ename%type

3.2 %ROWTYPE数据类型:

如果一张表中包含较多的列,则可以使用%ROWTYPE来表示表中一行记录的变量的数据类型。
如下:将dept表中一行中各字段的数据类型(‘number’,’varchar2(50)’,varchar2(50))赋给v_dept_row,非常便利,可以直接查询后将一行数据赋值。
(注:语句中 into 执行赋值操作,将查询结果直接赋值给 v_dept_row)

CREATE or replace procedure pro_update_emp
as
v_dept_row dept%rowtype;
begin
select * into v_dept_row from dept where deptno=11;
end;

3.3 %record数据类型:

自定义记录的数据类型,声明一个行数据类型,将每列的数据类型进行自定义。

type emp_record_type is RECORD(     //声明自定义数据类型的名字为 emp_record_type
ename emp.ename%type,
sal emp.sal%type,
comm emp.comm%type,
total_sal sal%type
);
v_emp_record emp_record_type; //定义变量v_emp_record的数据类型为 emp_record_type

3.4 TABLE数据类型:

TABLE(索引表)相当于一个键值集合,键是唯一的,用于查找对应的值。键可以是整数或字符串。

declare
type dept_table_type is table of dept%rowtype index by binary_integer; //声明table数据类型 dept_table_type
v_dept_table dept_table_type; //声明v_dept_table的数据类型为 dept_table_type
begin
select * into v_dept_table(0) from dept where deptno=11; //按索引查询并赋值
select * into v_dept_table(1) from dept where deptno=12;
end;

4、带参数的存储过程

4.1 输入参数 (IN) :当为过程定义参数时,如果不指定参数模式,则默认为输入参数

(注:使用输出语句之前应提前运行打开输出环境变量语句’set serveroutput on’)

create or replace procedure
pro_query_emp0(v_no in emp.empno%type) //in 代表输入参数,可省略
as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=v_no; //将会有提醒输入v_no参数的值
dbms_output.put_line('该员工薪水为:'||v_sal); //输出语句
exception
when no_data_found then
dbms_output.put_line('找不到该员工!');
end;

调用:

call pro_query_emp0(11)

4.2 输出参数 (OUT) :将查询结果赋值给输入参数 out_sql中

create or replace procedure
pro_query_emp(v_no in emp.empno%type, out_sal out number)
as
begin
select sal into out_sal from emp where empno=v_no;
exception
when no_data_found then
dbms_output.put_line('找不到该员工!');
end;

调用:

declare
v_no emp.empno%type;
v_sal emp.sal%type;
begin
v_no:=&no;
pro_query_emp(v_no,v_sal);
dbms_output.put_line('薪水是:'||v_sal);
end;

4.3 输入输出参数 (IN OUT):既作输入参数,又作输出参数

create or replace procedure pro_testinout
(param_num in out number)
as
begin
select sal into param_num from emp
where empno=param_num;
end;

调用:

declare
inout_num number;
begin
inout_num:=&no;
pro_testinout(inout_num);
dbms_output.put_line('工资是:'||inout_num);
end;

5、三种传值方式

先创建一个存储过程

create or replace procedure
pro_add_dept(v_deptno number,v_dname varchar2, v_loc varchar2)
as
begin
insert into dept values(v_deptno,v_dname,v_loc);
end;

按位置传值:

exec pro_add_dept(70,'研发部','北京');

按名称传值:

call pro_add_dept(v_deptno=>90,v_loc=>'南京',v_dname=>'软件部');

混合传值:

exec pro_add_dept(100,v_loc=>'南京',v_dname=>'软件部');

6、流程控制语句

6.1、条件控制语句 IF THEN

基本格式

IF 条件表达式1 THEN
语句段1
ELSIF 条件表达式2 THEN
语句段2
......
ELSIF 条件表达式n
语句段n
END IF;

实例:如果奖金comm为空,则将其更新为 v_emp.sal的0.1倍,如果小于1000则设为1000,如果以上条件都不满足,则将comm在原有的基础上加0.1倍。

if v_emp.comm is null  then
update emp set comm=v_emp.sal*0.1 where empno=v_emp.empno;
elsIf v_emp.comm<1000 then
update emp set comm=1000 where empno=v_emp.empno;
else
update emp set comm=comm+comm*0.1 where empno=v_emp.empno;
end if;

6.2、条件控制语句 CASE

基本格式

CASE
WHEN 条件表达式1 THEN
语句段1;
WHEN 条件表达式2 THEN
语句段2;
......
ELSE
语句段n;
END CASE;

实例:将v_sal小于3000的评为A级工资,在3000至5000之间的评为B级工资,将其他的评为C级工资。

  case
when v_sal<3000 then dbms_output.put_line('A级工资');
when v_sal>=3000 and v_sal<5000 then dbms_output.put_line('B级工资');
else dbms_output.put_line('C级工资');
end case;

6.3、LOOP 循环

基本格式:

LOOP
EXIT [WHEN 条件表达式]
语句段;
END LOOP;

实例:循环向dept中插入数据

create or replace procedure pro_insert_dept
as
type dept_table_type is table of dept%rowtype index by binary_integer;
i number(1):=0;
v_dept_table dept_table_type;
begin
v_dept_table(0).deptno:='14';
v_dept_table(0).dname:='政法研发部';
v_dept_table(0).loc:='上海';
v_dept_table(1).deptno:='15';
v_dept_table(1).dname:='邮政金融部';
v_dept_table(1).loc:='北京';
v_dept_table(2).deptno:='16';
v_dept_table(2).dname:='系统集成部';
v_dept_table(2).loc:='深圳';
loop
exit when i>2;
insert into dept values( v_dept_table(i).deptno,v_dept_table(i).dname,v_dept_table(i).loc);
i:=i+1; //每次循环i+1,当i的值大于2时结束循环
end loop;
end;

6.3、While循环

基本格式:

WHILE 条件表达式 LOOP
语句段;
END LOOP;

实例:

  while i<=2 loop
insert into dept values(v_dept_table(i).deptno,v_dept_table(i).dname,v_dept_table(i).loc);
i:=i+1;
end loop;

6.4 FOR循环

基本格式:
(注:如加上reverse表示倒叙循环执行语句)

FOR 循环变量 in [REVERSE] 初值表达式..终值表达式 LOOP
语句段;
END LOOP;

实例:

  for i in 0..v_dept_table.count-1 loop
insert into dept values( v_dept_table(i).deptno,v_dept_table(i).dname,v_dept_table(i).loc);
end loop;

Oracle存储过程常用语法及其使用的更多相关文章

  1. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  2. Oracle存储过程基本语法 存储过程

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  3. Oracle存储过程基本语法

    一.形式 1 CREATE OR REPLACE PROCEDURE 存储过程名  //是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 2 IS   ...

  4. (转)Oracle存储过程基本语法

    本文转载自:http://www.cnblogs.com/hero4china/articles/base_rule_oracle_procedure.html 存储过程 1  CREATE OR R ...

  5. Oracle存储过程基本语法及基础教程

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

  6. oracle存储过程常用技巧

    我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...

  7. Oracle 存储过程简单语法

    一.无参数的存储过程 --创建存储过程create or replace procedure getdate as datetime varchar2(); begin select to_char( ...

  8. Oracle存储过程_语法

    create or replace procedure procedure_name --存储过程名字 ( --进行输入/输出的量 量_name in out 量_类型 --e.g. username ...

  9. Oracle数据库常用语法

    基本 --新建表:create table table1( id varchar(300) primary key, name varchar(200) not null); --插入数据 inser ...

随机推荐

  1. 关于Windows自动化卸载软件的思路

    思路 关于控制面板“卸载”关联到的exe是这样的: 注册表:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall ...

  2. bootstarp treeview 获取勾选和获取Selected选中

    在用treeview的时候,经常会遇到一些官网没有详细说明的东西,比如获取勾选和获取选中的方法,获取选中官网是有明显说明的, 如下 : $('#resourceTree').treeview('get ...

  3. SWIG 3 中文手册——4. 脚本语言

    目录 4 脚本语言 4.1 两种语言的概览 4.2 脚本语言如何调用 C? 4.2.1 包装器函数 4.2.2 变量链接 4.2.3 常量 4.2.4 结构体与类 4.2.5 代理类 4.3 构建脚本 ...

  4. sql server锁表、查询被锁表、解锁被锁表的相关语句

    MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...

  5. mybatis 报Invalid bound statement(not found) 和 Property 'mapperLocations' was not specified or not matching resources found

    排除问题的步骤: 1.首先检查mapper文件和mapper接口的文件名是否相等. 2.pom.xml是否把xml排除了,这样写就会src/main/java下所有的Mybatis的xml文件都删除, ...

  6. Prometheus 监控Docker服务器及Granfanna可视化

    Prometheus 监控Docker服务器及Granfanna可视化 cAdvisor(Container Advisor)用于收集正在运行的容器资源使用和性能信息. 使用Prometheus监控c ...

  7. 【LeetCode】230. Kth Smallest Element in a BST

    Difficulty: Medium  More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/kth-smallest- ...

  8. yml 字典列表

    观察: --- # 一位职工记录 name: Example Developer job: Developer skill: Elite employed: True foods: - Apple - ...

  9. Spring Boot 静态页面跳转

    本篇博客仅为自己提个醒:如何跳转页面而不麻烦控制器. 当我们创建 Spring Boot 项目时(勾选了 Thymeleaf 和 Web),目录结构会是如下:        其中图二是我创建了一个 h ...

  10. 线程之间灵活传递信号(ManualResetEventSlim )

    当主程序启动时,首先创建ManualResetEventSlim 类的一个实例.然后启动三个线程,等待事件信号通知它们继续执行. /// <summary> /// 创建 ManualRe ...