oracle数据库block、tigger、function、package
--1、编写一个程序块从emp表中显示为'SMITH'的雇员的薪水和职位
declare
v_job emp.job%type;
v_sal emp.sal%type;
begin
select job,sal into v_job,v_sal from emp where ename='SMITH';
dbms_output.put_line('SMITHD的职位是:'||v_job||'薪金:'||v_sal);
end;
--2、编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在地
declare
v_dname dept.dname%type;
v_location dept.loc%type;
begin
select dname,loc into v_dname,v_location from dept
where deptno=&dnamber;
dbms_output.put_line('部门名称:'||v_dname||'部门地址:'||v_location);
end;
--3、编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪金(即:薪水+佣金)
declare
v_empno emp.empno%type;
v_sumsal emp.sal%type;
begin
select 12*(sal + nvl(comm,0)) into v_sumsal from emp where empno=&v_empno;
dbms_output.put_line('该员工的总的薪金:'||v_sumsal);
end;
select * from emp;
--4、编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(薪水+佣金)
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=&雇员号;
dbms_output.put_line(v_emp.sal+nvl(v_emp.comm,0));
end;
--5、 5.某公司要根据雇员的职位来加薪,公司决定按下列加薪结构处理:
-- Designation Raise
-----------------------
-- Clerk 500
--Salesman 1000
--Analyst 1500
--Otherwise 2000
--编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where ename='&name';
if v_emp.job='CLERK' then
update emp set sal=sal+500 where empno=v_emp.empno;
elsif v_emp.job='SALESMAN' then
update emp set sal=sal+1000 where empno=v_emp.empno;
elsif v_emp.job='ANALYST' then
update emp set sal=sal+1500 where empno=v_emp.empno;
else
update emp set sal=sal+2000 where empno=v_emp.empno;
end if;
commit;
end;
--6、编写一个程序块,将emp表中雇员名全部显示出来
--解法一
declare
cursor emp_cursor is select ename from emp;
v_ename emp.ename%type;
begin
open emp_cursor;
loop
fetch emp_cursor into v_ename;
exit when emp_cursor%notfound;
dbms_output.put_line(v_ename);
end loop;
close emp_cursor;
end;
--解法二
declare
cursor emp_cursor is select ename from emp;--得到多个cursor
begin
for v_name in emp_cursor
loop
dbms_output.put_line(v_name.ename);--遍历多个cursor
end loop;
end;
--7、编写一个程序块,将emp表中前5人中名字显示出来
--解法一
declare
cursor emp_cursor is select ename from emp where rownum<6;
begin
for v_name in emp_cursor
loop
dbms_output.put_line(v_name.ename);
end loop;
end;
--解法二
declare
cursor v_cursor is select * from emp;
v_count number :=1;
begin
for v_emp in v_cursor
loop
dbms_output.put_line(v_emp.ename);
v_count := v_count+1;
exit when v_count>5;
end loop;
end;
----------------------------------异常处理
--8、编写一个程序块,接受一个雇员名,从emp表中显示该雇员的工作岗位和薪水,若输入的雇员名不存在
--显示'该雇员不存在'信息
declare
v_emp emp%rowtype;
my_exception Exception;
begin
select * into v_emp from emp where ename='&name';
raise my_exception;
exception
when no_data_found then
dbms_output.put_line('该雇员不存在!');
when others then
dbms_output.put_line(v_emp.job||'---'||v_emp.sal);
end;
--9、接受两个数相除并且显示结果,如果第二个数为0,则显示消息“除数不能为0”。
declare
v_dividend float;
v_divisor float;
v_result float;
my_exception Exception;
begin
v_dividend:=&被除数;
v_divisor:=&除数;
v_result:=v_dividend/v_divisor;
raise my_exception;
exception
when my_exception then
dbms_output.put_line(v_result);
when others then
dbms_output.put_line('除数不能为0');
end;
--二.声明和使用游标
-- 使用游标属性
-- 使用游标For循环工作
-- 声明带参数的游标
--(使用FOR UPDATE OF和CURRENT OF子句工作)
--1、通过使用游标来实现dept表中的部门名称
declare
cursor dept_cursor is select dname from dept;
begin
for one_dept_cursor in dept_cursor
loop
dbms_output.put_line(one_dept_cursor.dname);
end loop;
end;
select dname from dept;
--2、使用for循环,接受一个部门号,从emp表中显示该部门的所有雇员的姓名,工作和薪水
declare
cursor emp_cursor is select ename,job,sal from emp where deptno=&dno;
begin
for one_emp_cursor in emp_cursor
loop
dbms_output.put_line(one_emp_cursor.ename||one_emp_cursor.job||one_emp_cursor.sal);
end loop;
end;
--3、使用带参数的游标(实现第2题)
declare
cursor emp_cursor(dno number) is select ename,job,sal from emp where deptno=dno;
v_deptno number(10);
begin
v_deptno:= &部门号;
for one_emp_cursor in emp_cursor(v_deptno)
loop
dbms_output.put_line(one_emp_cursor.ename||one_emp_cursor.job||one_emp_cursor.sal);
end loop;
end;
--4、编写一个pl/sql程序块,从emp表中名字以'A'或'S'开始的所有库员按他们基本薪水的 10%100给他们加薪
declare
cursor emp_cursor is select * from emp where ename like 'A%' or ename like 'S%';
begin
for one_cursor in emp_cursor
loop
update emp set sal=sal*1.1 where ename=one_cursor.ename;
-- dbms_output.put_line(one_cursor.ename);
end loop;
end;
select * from emp where ename like 'A%' or ename like 'S%';
select * from emp;
--5、emp表中对所有雇员按他们基本薪水的10%给他们加薪,如果增加后的薪水大于5000,则取消加薪
declare
cursor emp_cursor is select * from emp;
begin
for one_emp in emp_cursor
loop
if one_emp.sal*1.1<5000
then update emp set sal=sal*1.1 where empno=one_emp.empno;
end if;
end loop;
end;
select * from emp where sal*1.1<5000;
--三,创建PL/SQL记录和PL/SQL表
-- 创建过程
-- 创建函数
--3、创建一个过程,能像dept表中添加一个新纪录(in参数)
create or replace procedure insert_dept(dept_no in number,dept_name in varchar2,dept_loc in varchar2)
is
begin
insert into dept values(dept_no,dept_name,dept_loc);
end;
--调用存储过程:
declare
begin
insert_dept(50,'人事部','南京');
end;
select * from emp;
select * from dept;
--4、创建一个过程,从emp表中带入雇员的姓名,返回该雇员的薪水值(out参数),然后调用过程
create or replace procedure
find_emp3(emp_name in varchar2,emp_sal out number)
is
v_sal number(5);
begin
select sal into v_sal from emp where ename = emp_name;
emp_sal:=v_sal;
end;
declare
mysal number;
begin
find_emp3('SMITH',mysal);
dbms_output.put_line(mysal);
end;
--5、编写一个程序块,接受一个雇员号与一个百分数,从emp表中将该雇员的薪水增加输入的百分比。
create or replace procedure
update_sal(emp_no in number,parsent in float)
is
begin
update emp set sal=sal+sal*parsent where empno=emp_no;
end;
begin
update_sal(7937,0.5);
end;
select * from emp;
--7、创建一个函数,他以部门号作为参数传递并且使用函数显示那个部门名称与位置,然后调用此函数
create or replace function
find_dept(dept_no number)
return dept%rowtype
is
v_dept dept%rowtype;
begin
select * into v_dept from dept where deptno=dept_no;
return v_dept;
end;
--调用
declare
v_dept dept%rowtype;
begin
v_dept:=find_dept(50);
dbms_output.put_line(v_dept.dname||'---'||v_dept.loc);
end;
--四,创建程序包
-- 创建程序件
-- 创建触发器
--6、创建一个语句级别触发器,不允许用户在"Sundays"使用emp表
create or replace trigger control_emp
before update or delete or insert on emp
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN') in ('SUM')
then raise_application_error(-20001,'不允许在星期天操作emp表');
end if;
end;
select to_char(sysdate,'day','nls_date_language=AMERICAN') from dual;--英文星期
select to_char(sysdate,'day') from dual;--中文星期
select to_char(sysdate,'hh24:mi') from dual;
if to_char(sysdate,'day') in ('星期六','星期日') or
to_char(sysdate,'hh24:mi') not between '08:30' and '18:00'
--5.创建一个行级别触发器,停止用户删除雇员名为"SMITH"的记录。
create or replace trigger delete_smith
before delete on emp
for each row
when (old.ename='SMITH')
begin
raise_application_error(-20001,'不能删除该条信息!');
end;
--4.创建一个行级别触发器,将从emp表中删除的记录输入到ret_emp表中。
create or replace trigger delete_emp
after delete on emp
for each row
begin
insert into ret_emp values(:old.empno,:old.ename,:old.job,
:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
end;
--1.创建在dept表中插入和删除一个记录的数据包,它且有一个函数(返回插入或删除的部门名称)和两个过程。
然后调用包。
create or replace package pack_1
is
procedure find_emp(emp_no in number,emp_name out varchar2);
procedure find_emp1(emp_name in varchar2,emp_no out number);
function find_dname(dept_no number)
return varchar2;
end pack_1;
create or replace package body pack_1
is
function find_dname(dept_no number)
return varchar2
is
v_dname varchar2(20);
begin
select dname into v_dname from dept where deptno=dept_no;
retrun v_dname;
end;
end pack_1;
--调用包:
declare
v_dname varchar2(20);
begin
v_dname:=pack_1.find_dname(50);
dbms_output.put_line(v_dname);
end;
oracle数据库block、tigger、function、package相关推荐
- java连接数据库 oracle,Oracle数据库之一分钟教你学会用java连接Oracle数据库
本文主要向大家介绍了Oracle数据库之一分钟教你学会用java连接Oracle数据库,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. package java_jdbc; // ...
- oracle数据库的拼接字符串,Oracle数据库拼接字符串
Ora-03113\Ora-03114与Oracle In 拼接字符串的问题 刚深入接触Oracle不久(大学里以及刚参加工作时学到的Oracle知识只能算是皮毛),因为之前使用SqlServer有将 ...
- 导出Oracle数据库用户Procedure和Function为文本文件的小工具
Oracle的Procedure和Function导出方法有很多,通过exp的User Mode或者Full Mode可以整体导出,当然也有较傻的PL/SQL或Toad一个个导出的方法,其实Oracl ...
- 关于Oracle数据库19c中的关键字和保留字的说明
关于Oracle数据库中的关键字和保留字的说明 官方文档节选: You cannot use Oracle SQL reserved words as nonquoted identifiers. ...
- Oracle corrupt block(坏块) 详解
转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...
- Pre-Upgrade Utility---下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1)
如何下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1) 文档内容 目标 脚本来源 解决方案 脚本指导 下载并安装说明 请参阅下表以确定您需要的pre-upgrade脚本的版 ...
- oracle数据库系统ppt,oracle数据库入门(培训课件).ppt
ORACLE数据库介绍- 常用工具-SQL LOADER 在DOS窗口下使用SQL*Loader命令实现数据的输入 C:\>sqlldr userid=system/manager contro ...
- Oracle数据库中的数据加密
Oracle数据库中的数据加密 / Oracle数据库DES加密 有个需求,需要对某些敏感信息字段进行脱敏,要求在数据库中不能显示明文.如果目的侧重保护数据而非脱敏的话,可以考虑用表空间透明数据加密( ...
- Oracle数据库错误消息
导出错误消息 l EXP-00000导出终止失败 原因:导出时产生Oracle错误. 操作:检查相应的Oracle错误消息. l EXP-00001数据域被截断 - 列长度=数字,缓冲区大小=数字,实 ...
最新文章
- device.cpp
- net.sf包JSONArray与JSONObject遍历
- 给自己的Unity添加声音文件
- Kafka生产者发送消息的三种方式
- phpstudy如何安装景安ssl证书 window下apache服务器网站https访问
- C++ 一键关闭屏幕
- python如何运行源文件_Python如何运行
- 基于Matlab的跨孔层析成像的最短路径法弯曲射线追踪(一)
- CentOS Linux 7绑定静态IP方法
- In addition, Microsoft is also developing
- tcp丢包率_网络编程 | TCP/IP基础知识
- 机械电子工程用不用学c语言,机械电子工程到底学什么 毕业以后能干什么
- surfacepro3运行C语言,【微软 Surface PRO3使用总结】C面|D面|噪音|材质_摘要频道_什么值得买...
- 消融实验(Ablation study)的最佳解释
- ../和./和/的区别
- 你学了多久 Python 并能正式工作?
- 16个时髦的扁平化设计的 HTML5 CSS3 网站模板
- 【Java虚拟机】第一章、Java虚拟机是如何产生的
- 计算机网络 IP地址基础知识
- Linux能ping通IP,ping不通域名
热门文章
- Robert Sedgewick左倾红黑树论文翻译
- 计算机打开页面恢复默认大小,win10怎样恢复Windows窗口默认的大小?
- 于晓津外头游荡了半天
- bucket list java,Java AmazonS3.deleteBucket方法代码示例
- ios点击大头针气泡不弹出_高德 ios 自定义气泡添加点击事件无效问题
- 微信、支付宝付款码规则
- floorplan 和 place的区别
- 【mac/windows】Microsoft Office LTSC 2021
- zabbix监控系统进阶专题篇(企业微信报警,邮箱报警,电话报警,监控数据库,监控磁盘性能)
- 【Python • 项目实战】pytesseract+pyqt实现图片识别软件小项目——(一)创建项目和画界面