--编写一个存储过程,给emp表中添加数据。
  --方法一:
create or replace procedure add_employee(
       eno number,
       name varchar2,
       salary number,
       job varchar2 default 'CLERK',
       dno number
)
is
begin
  insert into emp (empno,ename,sal,job,deptno) values (eno,name,salary,job,dno);
end;

--方法二:
create or replace procedure add_employee_1(
           eno number,
           name varchar2,
           salary number,
           job varchar2 default 'CLERK',
           dno number   
)
is
        emp_null_error exception; --声明异常变量
        pragma exception_init( emp_null_error, -1400 ); --把异常变量和异常编号-1400绑定.-非空约束
        emp_no_deptno exception ; --声明异常变量
        pragma exception_init ( emp_no_deptno, -2291 );--外键约束
begin
  insert into emp ( empno,ename,sal,job,deptno )values( eno,name,salary,job,dno);
        
exception
  when DUP_VAL_oN_INDEX then
    RAISE_APPLICATION_ERROR( -20000, '该雇员以存在' );
  when emp_null_error then
    RAISE_APPLICATION_ERROR( -20001, '部门编号不能为空' );
  when emp_no_deptno then
    RAISE_APPLICATION_ERROR( -20002, '不存在该部门编号' );
end;

--调用存储过程
    --在sql提示符下调用
    --外键约束
SQL> exec add_employee( 1111,'MARY', 2000, 'MANAGER', 66 );
begin add_employee( 1111,'MARY', 2000, 'MANAGER', 66 ); end;

ORA-02291: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 未找到父项关键字
ORA-06512: 在 "SCOTT.ADD_EMPLOYEE", line 10
ORA-06512: 在 line 1
     --异常部门为空
SQL>  exec add_employee(1111,'MARY', 2000, 'MANAGER', null);
begin add_employee(1111,'MARY', 2000, 'MANAGER', null); end;

ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP"."DEPTNO")
ORA-06512: 在 "SCOTT.ADD_EMPLOYEE", line 10
ORA-06512: 在 line 1
      --正确,按位置传参
SQL>  exec add_employee(1111,'MARY', 2000, 'MANAGER', 10);

PL/SQL procedure successfully completed

--雇员编号重复
SQL>  exec add_employee(1111,'MARYE', 3000, 'MANAGER', 20);
begin add_employee(1111,'MARYE', 3000, 'MANAGER', 20); end;

ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP)
ORA-06512: 在 "SCOTT.ADD_EMPLOYEE", line 10
ORA-06512: 在 line 1
       --正确,按名字传参

SQL>  exec add_employee(eno=>1112,name=>'MARYE', salary=>3000, job=>'MANAGER',dno=> 20);

PL/SQL procedure successfully completed
       --混合传参

SQL>  exec add_employee(1113,name=>'MACLE', salary=>3000, job=>'CLERK',dno=> 20);

PL/SQL procedure successfully completed
    --错误的混合传参
SQL>  exec add_employee(1113,name=>'MACLE', 3000, job=>'CLERK',dno=> 20);
begin add_employee(1113,name=>'MACLE', 3000, job=>'CLERK',dno=> 20); end;

ORA-06550: 第 1 行, 第 40 列:
PLS-00312: 一个定位相关参数没有说明其相关性
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
--pl/sql 调用存储过程

declare
         emp_20000 exception;
         pragma exception_init(emp_20000, -20000);
         emp_20001 exception;
         pragma exception_init(emp_20001, -20001);
         emp_20002 exception;
         pragma exception_init(emp_20002, -20002);
begin
  --异常。部门不存在
         add_employee_1(7369,'MARAY',2010,'SALESMAN',66);
EXCEPTION
  when emp_20000 then
    dbms_output.put_line( 'emp_20000 雇员编码不能重复');
  when emp_20001 then
    dbms_output.put_line( 'emp_20001 部门编号不能为空');
   when emp_20002 then
    dbms_output.put_line( 'emp_20002 不存在该部门编号');
    when others then
    dbms_output.put_line( '出现了其他异常错误');
end;

Oracle存储过程的创建实例和调用实例的更多相关文章

  1. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  2. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

  3. ORACLE存储过程的创建和执行的简单示例和一些注意点

    此示例的主要目的主要是为了了解在PL/SQL环境下怎么创建和执行存储过程. 存储过程所涉及的DataTable: 第一步:创建游标变量 游标是ORACLE系统在内存中开辟的一个工作区,主要用来存储SE ...

  4. Oracle 存储过程的创建,及触发器调用存储过程

    一.创建存储过程 1.存储过程写法 create or replace procedure HVM_BYQ_TJ --变压器统计信息--->入库 (id in number) as begin ...

  5. oracle存储过程的创建和使用

    创建存储过程: 格式:create or replace procedure procedure_name(参数 参数类型) Is/as 变量1 变量1的类型: begin ----------业务逻 ...

  6. SQLServer中存储过程StoredProcedure创建及C#调用(转)

    此文作为入门了解用,转自http://www.2cto.com/database/201502/378260.html 存储过程就是已经编译好的.优化过的放在数据库服务器中的一些SQL语句:可供应用程 ...

  7. 在oracle存储过程中创建暂时表

    在oracle的存储过程中,不能直接使用DDL语句,比方create.alter.drop.truncate等. 那假设我们想在存储过程中建立一张暂时表就仅仅能使用动态sql语句了: create o ...

  8. ORACLE 11G在存储过程里面遍历游标, 调用job任务定时运行

    ORACLE存储过程里游标遍历.调用job定时运行 1,第一种使用For 循环 for循环是比較简单有用的方法. 首先.它会自己主动open和close游标.攻克了你忘记打开或关闭游标的烦恼. 其次, ...

  9. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  10. oracle存储过程实例

    oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的P ...

随机推荐

  1. python中的字符串(1)

    1.大小写的转换 upper()/lower() 转成大写.upper() 转成小写.lower() 返回的是字符串 2.是否是数字 isdigit() 返回的布尔值 3.去除字符串的空白字符 str ...

  2. Java-递归查询法

    递归查询用户所在团队的老大的用户id(一个团队中,只有一个老大,也就是父级id="-1") 如下:是表结构 first_agent_id----用户的上级id user_id--- ...

  3. uniapp 打包app 引入高德地图

    一.高德地图注册key值 二.项目中添加配置 三.项目中引用 <view class="home-btom-box" > <view class="ho ...

  4. JavaScript:代码细节和良好编码习惯

    这些细节,与语法无关,仅仅是编写代码时需要注意的最最基本的细节和一些良好编码习惯. 注释代码 注释代码分为单行注释和多行注释,如下所示: 严格区分大小写 JS的代码时严格区分大小写的,变量a和A是不同 ...

  5. 基于redis乐观锁实现并发排队 - 基于scrapy运行数量的控制

    有个需求场景是这样的,使用redis控制scrapy运行的数量.当系统的后台设置为4时,只允许scapry启动4个任务,多余的任务则进行排队. 概况 最近做了一个django + scrapy + c ...

  6. BFS广度优先搜索例题分析

    洛谷P1162 填涂颜色 题目描述 由数字 \(0\) 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 \(1\) 构成,围圈时只走上下左右 \(4\) 个方向.现要求把闭合圈内的所有空间都填写成 \ ...

  7. 第六节 FAF与GP不工作保护区的绘制

    飞行程序设计软件实践 前一篇文章中,通过风标设计2023插件,我们在CAD中绘制了FAP方式下的精密进近保护区. 接着这个话题我们继续来看一下FAF方式下的保护区应该怎样绘制,以及OAS参数的其它用法 ...

  8. [数学理论] NP问题解释

    转载自http://m.blog.csdn.net/csshuke/article/details/74909562 希望通过这篇文章可以不仅让计算机相关专业的人可以看懂和区分什么是P类问题什么是NP ...

  9. 学习.NET MAUI Blazor(五)、修改Window窗口标题

    由于Blazor属于SPA(single-page application),所以页面标题需要使用PageTitle组件来实现.但是在MAUI Blazor中,Blazor所在的位置是WebView, ...

  10. cmd无限弹窗

    记一次写 .bat 文件时犯的低级错误,搞的重启了好几次才发现问题所在 如下 文件名 和 批处理 内容 会造成 无限弹出cmd窗口 原因是一般情况下会启动系统的 cmd.exe,而此处用的简写,在执行 ...