创建存储过程和函数【weber出品必属精品】

一、什么是存储过程和函数

1. 是被命名的pl/sql块

2. 被称之为pl/sql子程序

3. 与匿名块类似,有块结构:

声明部分是可选的(没有declare关键字)

必须有执行部分

可选的异常处理部分

二、匿名块和子程序之间的区别

三、存储过程:语法

CREATE [OR REPLACE] PROCEDURE procedure_name
[(argument1 [mode1] datatype1,
argument2 [mode2] datatype2,
. . .)]
IS|AS
procedure_body;
create or replace procedure add_dept is
v_deptment_id dept.deptno%type;
v_deptment_name dept.dname%type;
begin
  v_deptment_id :=60;
  v_deptment_name := ‘YWB‘;
  insert into dept(deptno,dname) values(v_deptment_id,v_deptment_name);
  commit;
  dbms_output.put_line(‘插入了:‘||sql%rowcount||‘行‘);
  end;

使用匿名块调用存储过程:

begin
  add_dept;
end;

四、函数:

CREATE [OR REPLACE] FUNCTION function_name
 [(argument1 [mode1] datatype1,
  argument2 [mode2] datatype2,
  . . .)]
RETURN datatype
IS|AS
function_body;

函数与存储过程的区别:函数必须返回数据,存储过程可以返回数据,也可以不返回数据

create or replace function check_sal return boolean is
  dept_id emp.deptno%type :=10;
  emp_no emp.empno%type :=7788;
  salary emp.sal%type;
  avg_sal emp.sal%type;
begin
select sal into salary from emp where empno=emp_no;
 select avg(sal) into avg_sal from emp where deptno=dept_id;
 if salary>avg_sal then
   return true;
   else
     return false;
     end if;
   exception
     when no_data_found then
     return null;
  end;

在匿名块中调用函数:

begin
  if( check_sal is null) then
  dbms_output.put_line(‘由于程序异常,输出null‘);
  elsif (check_sal) then
     dbms_output.put_line(‘工资高于平均工资‘);
    else
       dbms_output.put_line(‘工资低于平均工资‘);
       end if;
  end;

给函数传递参数:

create or replace function check_sal(empno number) return boolean is
  dept_id employees.department_id%type;
  sal     employees.salary%type;
  avg_sal employees.salary%type;
begin
  select salary, department_id
    into sal, dept_id
    from employees
   where employee_id = empno;
  select avg(salary)
    into avg_sal
    from employees
   where department_id = dept_id;
  if sal > avg_sal then
    return true;
  else
    return false;
  end if;
exception
  when no_data_found then
    return null;
end;

create or replace function check_sal(empno number) return number is
  dept_id employees.department_id%type;
  sal     employees.salary%type;
  avg_sal employees.salary%type;
begin
  select salary, department_id
    into sal, dept_id
    from employees
   where employee_id = empno;
  select avg(salary)
    into avg_sal
    from employees
   where department_id = dept_id;
  if sal > avg_sal then
    return 1;
  elsif (sal = avg_sal) then
    return 2;
  else
    return 3;
  end if;
exception
  when no_data_found then
    return null;
end;

begin
  if (check_sal(200) is null) then
    dbms_output.put_line(‘由于程序异常,输出NULL‘);
  elsif (check_sal(200) = 1) then
    dbms_output.put_line(‘工资高于平均工资‘);
  elsif (check_sal(200) = 2) then
    dbms_output.put_line(‘工资等于平均工资‘);
  else
    dbms_output.put_line(‘工资低于平均工资‘);
  end if;
end;
时间: 2024-10-06 21:29:14

创建存储过程和函数【weber出品必属精品】的相关文章

创建和管理表【weber出品必属精品】

创建表 必须有 : 1. CREATE TABLE 的权限 SQL> conn /as sysdba 已连接. SQL> create user test default tablespace users identified by a; 用户已创建. SQL> conn test/a ERROR: ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied 警告: 您不再连接到 ORACLE. SQL> co

ORACLE SQL 组函数【weber出品必属精品】

组函数:对一组数据进行加工,每组数据返回一个值 常用的组函数:count()  avg()  max()   min()  sum()   count()函数  1. count(*) :返回总共的行数,不去除NULL值 2. count(column):返回非NULL行的数量 SQL> select count(*) ,count(sal),count(comm) from emp; COUNT(*) COUNT(SAL) COUNT(COMM) ---------- ---------- -

ORACLE SQL单行函数(一)【weber出品必属精品】

1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 2.LENGTH:求字符串的长度 SQL> select LENGTH('HELLOWO

ORACLE SQL单行函数(二)【weber出品必属精品】

11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) 12.dual的作用: 1. 查询数据库系统日期 2. 进行四则运算 SQL> select sysdate from dual; ---这里查询数据库系统日期 SYSDATE ---

ORACLE SQL单行函数(三)【weber出品必属精品】

16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED CHINESE'_CHINA.AL32UTF8 ---修改成简体中文+地区+字符集 source .bash_profile ---让环境变量生效 [[email protected] ~]$ sqlplus scott/tiger SQL*Plus: Release 10.2.0.5.0 - Pr

LAMP架构搭建+Discuz论坛搭建【weber出品必属精品】

一.     本机简介: 本机系统: CentOS-6.4-x86_64 主机名:oracle.ywb IP地址:192.168.146.129 二.     在Linux环境下安装Apache步骤 首先将准备好的文件通过PSCP发送至Linux的/Root/test/soft目录下 在windows下按住Ctrl+R,打开运行,输入CMD进入DOS命令行.在dos命令行中使用pscp –scp  命令将要上传的文件上传至Linux中. 上传成功后.我们总共要安装四个文件.第一个我们首先解压:a

linux删除ORACLE【weber出品必属精品】

关闭数据库 sqlplus / as sysdba shutdown abort 清除oracle软件 su - oracle cd $ORACLE_BASE rm -rf * rm -rf /etc/ora* 删除之前的设置的配置文件的内容 如果之前改过版本,编辑文件 /etc/redhat-release 把Red Hat Enterprise Linux Server release 4 (Tikanga) 改成版本5 vi /etc/pam.d/login 行末删除以下内容 sessio

使用DML语句【weber出品必属精品】

DML语句包含以下语法: INSERT:往一个表中增加新行 DELETE:从一个表中删除掉现有的行 UPDATE:更改一个表中现有的行 INSERT语句语法:INSERT INTO TABLE(COLUMN1,COLUMN2,....) VALUES(VAL1,VAL2,...)使用这种方法只能一次插入一行数据 插入包含每一个列值的新行,按缺省顺序列出表中所有的列值. 创建带有结构的空表 SQL> create table t as select * from emp where 1=2;---

静默安装ORACLE【weber出品必属精品】

由于本次的实验我是将上次的虚拟机直接拷贝过来,然后将里面图形化界面安装好了的oracle给删除,再次重新安装,所以这里要修改一些配置. 首先修改的是我们的IP地址 # system-config-network 完成后我们修改一下hosts文件,将里面的ip地址给修改一下 # vi /etc/hosts 接着我们删除上次安装过的ORACLE文件 # cd $ORACLE_BASE # ls # rm -rf * 进入root:rm -rf /etc/ora* 还是在安装前进行配置. 接下来进行静

全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

<ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入Disk1.然后执行安装: $ ./runInstaller 执行脚本 # /u01/app/oracle/10.2.0/db_1/root.sh Running Oracle 10g root.sh script... The following environment variables are set a