一,pl/sql  是什么?

--一、pl/sql  是什么?

--1.sql是结构化查询语言。
--2.编程语言一般都能够声明变量,写条件判断,循环。sql不具备这些特征,所有sql不是一门编程语言。
--3.使用pl/sql有什么优点:
--可以提高程序的运行效率,因为能够减少数据库的访问次数
--可以对复杂的业务逻辑进行封装
--pl/sql具有编程语言的特性,可以写if else 实现复杂的业务逻辑

二、pl/sql 块?

-- 二、pl/sql块?  分为 匿名块   和  命名块
--匿名块 没有名字块就是匿名块 匿名块不会保存到数据库中,执行完就没有了。类似于java的main方法
--命名块 有名字的块就是命名块。命名块 过程 函数 游标 触发器 都是命名块。 --问题?根据员工编号,打印员工的姓名
declare --变量声明部分
v_ename varchar2(30); begin -- 业务逻辑处理部分
select ename into v_ename from emp where empno=&输入员工编号;
-- 把员工姓名打印到控制台
dbms_output.put_line('员工姓名'||v_ename);
exception -- 异常处理部分
-- 异常处理部分
when no_data_found then
dbms_output.put_line('查无此人');
end; --注意:
--1,pl/sql块 变量名,关键字不区分大小写。
--2,变量声明部分是可选的。业务逻辑处理部分是必须的。异常处理部分是可选的。
--3,end后面必须加; declare begin exception 后面都不要加;
--一般写匿名块都是先写结构,再往结构里面填代码。

三、变量和常量?

/*
三、变量和常量
声明变量 :
变量名 变量类型;
变量名一般建议以v_开头.
声明常量要加上constant关键字常量名 constant 常量类型; 需求:用户输入圆的半径,计算圆的面积。
*/
declare v_pi constant number(6,2):=3.14;-- 声明PI常量 number(m,n) 数字类型 pi 是小数,保留两位(6,2) v_area number(6,2); --声明圆的面积的变量 v_r number(6,2):=&输入圆的半径;--声明半径变量
begin
v_area:=v_pi*v_r*v_r;-- 计算圆的面积 注意 符号的问题 [:=]
dbms_output.put_line('圆的面积是:'||v_area);-- 打印结果
exception
when no_data_found then
dbms_output.put_line('输入正确的半径值');
end;

四、变量类型?

-- 四、变量类型?

/*1.基本类型

  类型名           说明
varchar 定长字符串
varchar2 变长字符串
number(m,n) 数字类型
date 日期类型
timestamp 时间戳类型
*/ /*2.%type类型(列类型)? %type类型指的是声明变量的时候,该变量参考某个表的某个列的类型。
需求:根据员工的编号 查询员工的姓名和基本工资
*/
declare
-- 变量声明部分 ename sal v_ename 类型参考emp表的ename的类型
v_ename emp.ename%type;
v_sal emp.sal%type; begin
select ename,sal into v_ename,v_sal from emp where empno=&输入员工编号;
dbms_output.put_line('员工姓名:'||v_ename||' 基本工资:'||v_sal); exception
when no_data_found then
dbms_output.put_line('查无此人'); end; /*3.%rowtype(行类型)%rowtype参数某个表的类型。 %rowtype中可以存储多个数据,具体可存多少个和表的字段数一样。
需求?输入员工编号,打印员工的姓名,薪水,奖金,雇佣日期。
*/
declare
v_emp emp%rowtype;-- 声明行类型变量
begin
select* into v_emp from emp where empno=&输入员工编号;
dbms_output.put_line(
'员工姓名 '||v_emp.ename||' 基本工资'||v_emp.sal||' 奖金'||v_emp.comm||' 雇用日期'||v_emp.hiredate
);
exception
when no_data_found then
dbms_output.put_line('查无此人'); end; /*4.record类型(记录类型) record可以理解为可以自定义的行类型。
record类型在使用之前必须声明该类型。 需求:输入员工编号,打印员工的姓名,基本工资,总工资?
*/
declare
-- 声明record类型
type emp_record_type is record(
ename emp.ename%type,
sal emp.sal%type,
total emp.sal%type
);
v_emp emp_record_type;-- 声明record类型的变量 begin
select ename,sal,sal+nvl(comm,0)into v_emp from emp where empno=&no;-- 查询数据,给变量赋值
dbms_output.put_line(
'员工姓名'||v_emp.ename||' 基本工资'||v_emp.sal||'总工资'||v_emp.total
);
exception
when no_data_found then
dbms_output.put_line('查无此人'); end; /*5.table(表类型) 无论是行类型还是记录类型只能存储一行数据,如果要存储多行数据,需要用到table类型。
table类型也需要先声明类型,再声明该类型的变量。 需求?根据员工编号查询员工的信息,存储到table类型的变量中,再输出出来
*/
declare -- 声明table类型 is table of 后可以跟行类型,也可以是记录类型
type emp_table_type is table of emp%rowtype
index by binary_integer;-- 指定下标的增长方式为整数,每次增长
v_emp emp_table_type; -- 声明table类型的变量
begin
-- 把编号为7369的员工的信息存储到table类型变量中
select * into v_emp(1)from emp where empno=7369;
select * into v_emp(2)from emp where empno=7499;
--数据table类型变量中的数据
dbms_output.put_line('员工姓名'||v_emp(1).ename||' 奖金'||v_emp(1).comm);
dbms_output.put_line('员工姓名'||v_emp(2).ename||' 奖金'||v_emp(2).comm);
exception
when no_data_found then
dbms_output.put_line('查无此人'); end;

五。条件判断?

-- 五 、条件判断?

/*1.if /else

语法:
if 条件表达式 then
语句块;
if 条件表达式 then
语句块
end if;
elsif 条件表达式 then
语句块;
...
else
语句块;
end if; 需求:输入一个员工编号,给该员工涨奖金。策略是这样的:
如果原来员工没有奖金,则把基本工资的百分之10作为奖金,如果原来员工的奖金低于1000,把奖金提升到
1000,其他情况奖金提升百分之10.
*/ declare
-- 声明奖金的变量
v_comm emp.comm%type;
begin
-- 查询出员工的奖金
select comm into v_comm from emp where empno=&no;
-- 判断如果员工没有奖金,把基本工资的百分之10作为奖金
if v_comm is null then
update emp set comm=sal*0.1 where empno=&no;
--如果原先奖金低于1000,提升到1000
elsif v_comm<1000 then
update emp set comm=1000 where empno=&no;
-- 其他情况把奖金提升百分之10
else
update emp set comm=comm*1.1 where empno=&no;
end if;
end ; /*2.case when case when 和java中switch: case when 语法:
case 变量名
when 变量值1 then
语句块;
when 变量值2 then
语句块;
........
else:
语句块;
end case; 需求?:根据用户输入的部门编号,输出不同的部门名称,要求使用case when实现,不查询dept表
*/ declare
-- 声明部门编号的变量
v_deptno emp.deptno%type:=&no;
begin
case v_deptno
when 10 then
dbms_output.put_line('技术部');
when 20 then
dbms_output.put_line('销售部');
when 30 then
dbms_output.put_line('公关部');
when 40 then
dbms_output.put_line('开发部');
else
dbms_output.put_line('查无此部');
end case;
end; --注意 if else 和 case when 可以互相替代!

pl/sql 编程!的更多相关文章

  1. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  2. Oracle数据库编程:PL/SQL编程基础

    2.PL/SQL编程基础: PL/SQL块:        declare        定义部分        begin        执行部分        exception        异 ...

  3. pl/sql编程

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  4. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  5. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  6. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  7. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  8. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  9. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  10. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

随机推荐

  1. 【剑指Offer】变态跳台阶 解题报告(Python)

    题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级 ...

  2. 【LeetCode】386. Lexicographical Numbers 解题报告(Python)

    [LeetCode]386. Lexicographical Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  3. POJ 1986:Distance Queries

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18139   Accepted: 6248 ...

  4. 八、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框扩展面板的实现

    聊天输入框扩展面板的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入 ...

  5. Windows下安装配置jdk

    1.jdk安装 从官网获取jdk安装包后, 双击图形化安装,一路next即可. 2.配置JavaHome 打开计算机->系统属性->高级系统设置->环境变量 在系统变量下面添JAVA ...

  6. IIS部署php项目——discuz论坛

    1.安装CgiModule模块 首先,IIS要部署php项目,需要CgiModule模块的支持,所以首先我们要确认这个模块是否存在 打开IIS管理器: 我这里是存在的: 如果不存在,可以自行在控制面板 ...

  7. [学习笔记] Oracle体系结构、下载安装、创建实例、客户端工具、网络服务名、服务管理

    Oracle体系结构 实例: 一个操作系统只有一个 Oracle 数据库 一个 Oracle 数据库可以有多个 Oracle 实例(通常只安装一个实例) 一个实例对应着一系列的后台进程和内存结构 表空 ...

  8. CSS基础 margin塌陷问题以及解决 办法

    场景:两个相互嵌套的块级元素,父子元素相互紧贴margin-top会合并作用在父元素的子元素结果:导致两个盒子同时移动 解决方法: 1.给父元素设置overflow:hidden 2.给父元素设置浮动 ...

  9. yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别

    yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别 简单概括: repo和epel的关系 repo是配置源的,即配置从哪里下载包(以及依赖关系)的. epel是作为桥 ...

  10. 简单谈谈 TCP/IP

    1.前言 IP 或 ICMP.TCP 或 UDP.TELNET 或 FTP.以及 HTTP 等都属于 TCP/IP 协议. 他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分.TCP/I ...