过程

简介

  1. 是pl/sql的程序块。
  2. 可以没有参数,也可以有若干个输入、输出参数,甚至有多个既作为输出又作为输入的参数,但通常没有返回值.
  • 存储在数据库中,可以通过 execute 执行或者在sql程序块中调用,由于是已经编写好且变异的代码,所以执行效率高。
  1. 优点
  • 效率高

存储过程编译一次后,就会存到数据库,每次调用时都直接执行。而普通的sql语句我们要保存到其他地方(例如:记事本上),都要先分析编译才会执行。所以想对而言存储过程效率更高。

  • 降低网络流量

存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。

  • 复用性高

存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。

  • 可维护性高

当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。

  • 安全性高

完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。

创建过程


create [or replace ] procedure p_name [(parameter1 .. )] is|as
[变量声明部分] --常在 begin 前表示当前 begin end 块中的变量声明。
begin
plsql_sentences; --代码执行部分
[exception] --异常捕捉部分 常在end前 表示对 begin<==>{ }<==>end 中的代码进行异常捕捉
[dowith_sectences]
end [p_name]


  1. 解析

parameter1 传入的参数有三类: parameter_name in|out|in out 数据类型
in(默认) :外部定义并且赋值,向代码块中传递参数,在代码块中不能对该类参数进行修改
out: 外部定义该变量,由代码块中赋值变量并将其输出
in out : 向代码块中传递参数又可以在代码块外部访问该参数
default 可以为in类型数据传递参数

in的可以指定默认值: parameter1 default 默认值

代码块中 select into 赋值

--单个变量赋值
SELECT student_address INTO s_address
FROM student where student_grade=100;

--给多个变量赋值
SELECT student_name,student_age INTO s_name,s_age

注意:

  • 参数的类型可以指定,但是不可以指定其数据长度。
  • 值传递过程详细化: parameter1 => 具体值

查看procedure

名称             空值? 类型            
-------------- --- -------------
OBJECT_NAME VARCHAR2(128)
PROCEDURE_NAME VARCHAR2(128)
OBJECT_ID NUMBER
SUBPROGRAM_ID NUMBER
OVERLOAD VARCHAR2(40)
OBJECT_TYPE VARCHAR2(13)
AGGREGATE VARCHAR2(3)
PIPELINED VARCHAR2(3)
IMPLTYPEOWNER VARCHAR2(128)
IMPLTYPENAME VARCHAR2(128)
PARALLEL VARCHAR2(3)
INTERFACE VARCHAR2(3)
DETERMINISTIC VARCHAR2(3)
AUTHID VARCHAR2(12)
RESULT_CACHE VARCHAR2(3)
ORIGIN_CON_ID NUMBER
POLYMORPHIC VARCHAR2(5)

常见运算符

运算符 含义 举例
mood 取余运算 mod(5,2) =1
** 幂运算 2**3 = 8
范围 1…5
|| 字符串拼接 ‘123’||‘kjl’

函数

简介

  1. 与过程类似,也是存储在数据库中的命名的程序块,可以接收参数也可以不接受,并且函数必须有返回值

  2. 作用同过程

创建函数

create function f_name [(parameter1 .. )] return data_type is|as

[inner_variable]

begin
plsql_sentences;
[exception]
[dowith_sentences;]

end [f_name];

调用函数

select f_name(parameter1…);

在函数和存储过程中不可以直接使用DDL

  • 在oracle的存储过程中,不能直接使用DDL语句,比方create、alter、drop、truncate等。

  • 如果确实要使用,可以用动态sql,如下:


-- 创建暂时表 str_sql := 'create global temporary table temp_table ( col1 varchar2(10), col2 number ) on commit preserve rows';

execute immediate str_sql;