PLSQL程序设计(Oracle)
Hello World
set serveroutput on; declare
--说明部分
begin
--程序
dbms_output.put_line('Hello World');
end;
/
- PL/SQL是Oracle对sql语言的过程化扩展
- 指在SQL命令语言中增加了过程处理语句(如分子、循环等),使SQL语言具有过程处理能力
declare
说明部分 (变量说明,光标申明,例外说明)
begin
语句序列 (DML语句)...
exception
例外处理语句
end;
/
--查询7839姓名和薪水
set serveroutput on
declare
--定义变量保存姓名和薪水
--pname varcher2(20);
--psal number;
pname emp.ename%type;
psal emp.sal%type;
begin
--into 赋值 注意查询与赋值顺序
select ename,sal into pname,psal from emp where empno=7839; --打印
dbms_output.put_line(pname||'的薪水是:'||psal);
end;
/
记录型变量
--查询7839姓名和薪水
set serveroutput on
declare
--定义记录型变量,代表一行
emp_rec emp%rowtype;
begin
select * into emp_rec from emp where empno=7839;
--打印
dbms_output.put_line(emp_rec.ename||'的薪水是:'||emp_rec.sal);
end;
/
if语句
if 条件 then 语句;
elsif 语句 then 语句;
end if;
--接收键盘输入
set serveroutput on
--num 是一个地址值,在该地址上保存了输入的值的地址
accept num prompt '请输入一个数字'; declare
--定义变量保存输入的数字
pnum number := #
begin
if pnum = 0 then dbms_output.put_line('您输入的是0');
elsif pnum = 1 then dbms_output.put_line('您输入的是1');
else dbms_output.put_line('其他数字');
end if;
end;
/
循环
loop
exit[when 条件]
...
end loop;
for i in 1..3
loop
语句序列;
end loop;
打印1~10
--打印1~10
set serveroutput on declare
pnum number :=1;
begin
loop
exit when pnum>10;
SYS.dbms_output.put_line(pnum);
--pnum 每次+1 不能使用++
pnum := pnum + 1 ;
end loop;
end;
/
--查询并打印员工的姓名和薪水
/*
1、光标属性
%isopen %rowcount(影响的行数)
%found %notfound
*/
set serveroutput on declare
--定义光标
cursor cemp is select ename,sal from emp;
pename emp.ename%type;
psal emp.sal%type; begin
open cemp;
loop
--取一条记录
fetch cemp into pename,psal;
--退出条件
exit when cemp%notfound;
SYS.dbms_output.put_line(pename||'的薪水是:'||psal);
end loop;
close cemp;
end;
/
给员工涨薪水:总裁PRESIDENT 涨1000,经理MANAGER涨800,普通员工涨400
--给员工涨薪水:总裁PRESIDENT 涨1000,经理MANAGER涨800,普通员工涨400 set serveroutput on declare
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type; begin
open cemp;
loop
--取出一条记录
fetch cemp into pempno,pjob;
exit when cemp%notfound; if pjob = 'PRESIDENT' then update emp set sal = sal+1000 where empno=pempno;
elsif pjob = 'MANAGER' then update emp set sal = sal+800 where empno=pempno;
else update emp set sal = sal+400 where empno=pempno;
end if;
end loop;
--事务提交
close cemp; end;
/
查询某个部门的员工
--查找某个部门员工
set serveroutput on declare
--定义光标保存某个部门的员工姓名
cursor cemp(dno number) is select ename from emp where deptno=dno;
pname emp.ename%type; begin
--光标传实参部门id为10
open cemp(10);
loop
fetch cemp into pname;
exit when cemp%notfound; SYS.dbms_output.put_line(pname);
end loop;
close cemp; end;
/
--被0除
set serveroutput on declare
pnum number; begin
pnum :=1/0; exception
when zero_divide then dbms_output.put_line('0不能被整除');
when others then dbms_output.put_line('其他例外');
end;
/
自定义例外
--查询50号部门的员工姓名 set serveroutput on declare
cursor cemp is select ename from emp where deptno=50;
pname emp.ename%type;
--自定义例外
no_emp_found exception; begin
open cemp;
fetch cemp into pname;
if cemp%notfound then
--抛出异常
raise no_emp_found;
end if;
close cemp; exception
when no_emp_found then dbms_output.put_line('没有找到员工信息');
when others then dbms_output.put_line('其他例外');
end;
/
统计每年入职的员工人数
--使用PLSQL统计每年入职的员工
/*
SQL语句:select to_char(hiredate,'yyyy') from emp
--> 光标--->循环 --->退出条件,notfound 变量:1、初始值;2、如何得到?
count80 number :=0;
....
*/ set serveroutput on declare
cursor cemp is select to_char(hiredate,'yyyy') from emp;
phiredate varchar2(4);
count80 number :=0;
count81 number :=0;
count82 number :=0;
count87 number :=0; begin
open cemp;
loop
--取出一个员工信息
fetch cemp into phiredate;
exit when cemp%notfound;
--判断
if phiredate='' then count80 := count80+1;
elsif phiredate='' then count81 := count81+1;
elsif phiredate='' then count81 := count82+1;
else count87 := count87+1;
end if;
end loop;
close cemp;
--输出
SYS.dbms_output.put_line('1980:'||count80);
SYS.dbms_output.put_line('1981:'||count81);
SYS.dbms_output.put_line('1982:'||count82);
SYS.dbms_output.put_line('1987:'||count87);
end;
/
/*
SQL语句
部门:select deptno from dept; --> 光标
部门中员工的薪水: select sal from emp where deptno=?? --> 带参数的光标 变量:1. 初始值 2. 如何得到
每个段的人数
count1 number; count2 number; count3 number; 部门的工资总额: salTotal number;
1. select sum(sal) into salTotal from emp where deptno=??
2. 累加
*/
set serveroutput on
declare
--部门
cursor cdept is select deptno from dept;
pdeptno dept.deptno%type; --部门中员工的薪水
cursor cemp(dno number) is select sal from emp where deptno=dno;
psal emp.sal%type;
--每个段的人数
count1 number; count2 number; count3 number;
--部门的工资总额:
salTotal number;
begin
open cdept;
loop
--取一个部门
fetch cdept into pdeptno;
exit when cdept%notfound; --初始化
count1:=0;count2:=0;count3:=0;
--得到部门的工资总额
select sum(sal) into salTotal from emp where deptno=pdeptno; --取部门中员工的薪水
open cemp(pdeptno);
loop
--取一个员工的薪水
fetch cemp into psal;
exit when cemp%notfound; --判断薪水的范围
if psal < 3000 then count1:=count1+1;
elsif psal>=3000 and psal<6000 then count2:=count2+1;
else count3:=count3+1;
end if; end loop;
close cemp; --保存结果
insert into msg values(pdeptno,count1,count2,count3,nvl(salTotal,0)); end loop;
close cdept; commit;
dbms_output.put_line('完成'); end;
/
PLSQL程序设计(Oracle)的更多相关文章
- Oracle学习(11):PLSQL程序设计
PL/SQL程序结构及组成 什么是PL/SQL? •PL/SQL(Procedure Language/SQL) •PLSQL是Oracle对sql语言的过程化扩展 •指在SQL命令语言中添加了过程处 ...
- 通过使用精简客户端,且不需要安装的客户端,配合PLSQL连接oracle数据库
通过使用精简客户端,且不需要安装的客户端,配合PLSQL连接oracle数据库. 首先下载安装包在Oralce官方网站上下载Oracle Instantclient Basic package.地址如 ...
- PLSQL往Oracle数据库插入中文后变为问号 和 启动PLSQL时提示NLS_LANG在客户端不能确定的解决办法
PLSQL往Oracle数据库插入中文后变为问号 和 启动PLSQL时提示NLS_LANG在客户端不能确定的解决办法 1.检查服务器的字符编码 Select * from V$NLS_PARAMETE ...
- 使用PLSql连接Oracle时报错ORA-12541: TNS: 无监听程序
非常多时候为了优化我们的启动项把oracle的服务禁止了.但是重新启动启动之后使用PLSQL登陆oracle时会出现无监听程序,这说明我们有一些服务没有启动.我们先查看一下oracle的服务是否启动, ...
- 【转】如何解决plsql查询oracle数据库语句where条件带有中文无法匹配结果
一.问题描述 之前使用PLSQL查询oracle数据库可以正常查询统计结果,由于换了个电脑,重新安装之后,同样的sql查询语句同一个数据库,无法正常查询结果,如下图所示 二.解决办法 1. 查询数据当 ...
- windows:plsql配置oracle连接
1.plsql安装 此处省略,后续添加 2.plsql连接oracle: (1) 下载Instant client:http://www.oracle.com/technetwork/cn/topic ...
- plsql连接oracle数据库,不用配置任何东西(转)
在软件开发的过程中,对于使用oracle的朋友们来说,使用plsql工具操作oracle数据库是非常方便的,可是plsql连接oracle数据库的方式有很多种,今天就给大家介绍一种最简单的连接方式,只 ...
- PLSQL连接Oracle数据库问题及详解
一.Oracle数据库安装步骤参考:https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html 二.Oracle客户端安装:http ...
- 全网最详细的PLSQL Developer + Oracle client的客户端 或者 PLSQL Developer + Oracle server服务端的下载与安装过程(图文详解)
不多说,直接上干货! 环境说明: 本地没有安装Oracle服务端,oracle服务端64位,是远程连接,因此本地配置PLSQL Developer64位. Oracle database使用在本机部署 ...
随机推荐
- ELF文件解析(二):ELF header详解
上一篇讲了ELF文件的总体布局,以及section和segment的概念.按照计划,今天继续讲 ELF header. 讲新的内容之前,先更正一个错误:上一篇中讲section header tabl ...
- Tukey‘s test方法 异常值
如何计算异常值 异常值就是和其他样本数据有显著差异的值.这个词在统计学中经常用到,可以表示数据异常或测量错误.明白算异常值的方法,对于正确理解数据非常有用,而且会引出更精确的结论.以下介绍一个很简单的 ...
- mongoDB - 日常操作一
mongodb 启动方式 # 不启动认证 ./mongod --bind_ip 172.16.2.17 --port --fork --logpath=/opt/mongodb/mongodb.log ...
- [C++]C++与C头文件辨析(比较)
C++/C头文件辨析 C++标准库 C标准库 C++标准模板库 ios vector iomanip deque sstream list fstream map set ...
- Debian Linux Error “Driver 'pcspkr' is already registered, aborting...”
问题: Error: Driver ‘pcspkr’ is already registered, aborting… 解决: [root@reistlin.com ~]# echo "bl ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Self-hosted debug
1. 前言 2. 关于self-hosted debug Debugger调试器 是操作系统或系统软件的一部分,它会处理debug exception或修改debug system register, ...
- 字符驱动之二操作方法(struct file_operations)【转】
转自:http://blog.chinaunix.net/uid-26837113-id-3157515.html 从上一篇我们看到了字符驱动的三个重要结构,那我现在跟大家详细的说说 struct f ...
- Zookeeper简介与集群搭建【转】
Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...
- Python3学习笔记24-操作文件和目录
环境变量 在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看: import os print(os.environ) 操作文件和目录 操作文件和目录的函数一部分放在o ...
- linux更换yum源
由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源,以下为详细过程: 1.删除redhat原有的yum rpm - ...