Oracle笔记之PS/SQL数据库程序设计语言 第一篇
PS/SQL
前言 :
- PL/SQL基本结构
- 变量常量的用法
- PS/SQL条件结构
- PS/SQL循环结构
- 理解游标的使用
1. 程序结构及其变量
什么是PS/SQL?
PS/SQL是一种高级数据库程序设计语言,由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行高效处理,它对于处理比较复杂的业务流程如循环,判断,处理异常有着更好的解决.
PS/SQL程序的基本结构是块,可以嵌套使用(在begin到end中再置入一个PS/SQL块)
PS/SQL块结构如下:
declare/* 声明部分,用于声明PL/SQL常量 变量 游标 用户自定义的异常等,不需要定义声明部分时,declare就不用写 */
begin/* 可执行部分 */
exception/* 错误处理部分,不需要处理就不加 */
end;
要查看运行结果需要提前在sqlplus或可视化工具内输入:set serveroutput on
案例: 在控制台打印这两句话
begindbms_output.put_line('我喜欢学习java课程'); /* dbms_output.put_line();是oracle内置的程序包,用于打印方法(不换行直接.put就可以) */dbms_output.put_line('我特别喜欢java课程');
end;
/
PS/SQL不区分大小写,标识符首字符必须为字母
Oracle在定义标识符时,标识符在前,类型在后,在定义变量习惯使用v_名 作为变量名,v是变量的缩写;定义游标也习惯于使用c_名 作为游标名,并非要严格遵守,变量名不要和数据库中的表名或字段名相同
案例 : 编写一个PL/SQL程序,该程序输出长方形的面积,其中长和宽的值有键盘随机输入.
declare -- 需要声明变量,要用到declarev_length number:=&length; /* 在键盘上接收的临时变量放在length中,赋值给v_length, := 表示复赋值, & 表示获取你在键盘上输入的数据 */v_width number:=&width;v_area number;
beginv_area := v_length * v_width;dbms_output.put_line('面积是:' || v_area);
end;
/
在语句赋值中,你就把into当作 “赋值给” 就行了
案例 : 打印人员个人信息,包括: 姓名,薪水,地址
declarev_name varchar2(20) :='张三'; -- 在声明变量时直接赋值, 也属于直接赋值v_money number;v_address varchar2(100);
beginv_money :=1580; --直接赋值select '家里蹲' into v_address from dual; /* 语句赋值,select需要配合from使用,需要用到虚拟表 将家里蹲赋值给v_adress */dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_money || ',地址:' || v_address); -- || 相当于java中的+可以拼接字符串
end;
/
引用型变量:变量的长度取决于表中字段的类型和长度;
通过 表名.列名%TYPE 指定变量的类型和长度,eg: v_name emp.ename%TYPE;
引用变量的好处:使用普通变量定义方式要提前知道表中字段的类型, 而使用引用类型不需要考虑字段的类型
案例 : 查询emp表中7369号员工的个人信息,打印姓名和薪水
declarev_name emp.ename%TYPE; -- 引用型变量v_sal emp.sal%TYPE;
beginselect ename,sal into v_name,v_sal from emp where empno = 7369;dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
end;
/
记录型变量 : 接收表中的一整行记录, 相当于Java中的一个对象
语法: 变量名称 表名%ROWTYPE eg: v_emp emp%rowtype;
declarev_emp emp%rowtype;
beginselect * into v_emp from emp where empno = 7369;dbms_output.put_line('姓名:' || v_emp.ename || ',薪水:' || v_emp.sal);
end;
/
2. 条件分支
**if条件语句:**用法类似于java中的 if else语句
格式:
beginif 条件1 then 执行语句1;elsif 条件2 then 执行语句2;else 执行语句3;end if;
end;
案例 : 判断emp表中记录数是否超过20条, 10~20之间, 或者10条以下
declare-- 声明变量v_count用来接收查询到emp表中的记录数v_count number;
beginselect count(ename) into v_count from emp;if v_count >20 thendbms_output.put_line('超过20条:' || v_count );elsif v_count >= 10 and v_count <=20 then -- 直接>=10也可dbms_output.put_line('在10到20之间:' || v_count );elsedbms_output.put_line('10条以下:' || v_count );end if;
end;
/
case条件语句
begincase selectorwhen 表达式1 then 执行语句1;when 表达式1 then 执行语句2;...when 表达式1 then 执行语句n;else 执行语句n+1;end case;
end;
3. 循环
简单loop循环
格式:
beginloopexit when 退出循环的条件;循环体end loop; -- 相当于java中的break;用于结束循环
end
案例 : 打印数字 1到10
declarev_num number := 1;
beginloopexit when v_num >10;dbms_output.put_line(v_num);v_num := v_num+1;end loop;
end;
/
while循环
格式:
beginwhile 判断条件 -- 如果为false结束循环,注意这没有分号!loop循环体end loop;
end
案例 : 使用while循环求10的阶乘
declare
v_num number :=2;
v_result number :=1;
beginwhile v_num<=10 --注意没有分号loopv_result := v_num * v_result;v_num := v_num + 1;end loop;dbms_output.put_line('10的阶乘:' || v_result);
end;
/
for循环
格式:
begin
/* in reverse表示循环变量counter从大到小依次取值(反向),省略掉reverse表示从小到大一次取值 */for counter in [reverse] start_range..end_rangeloop循环体end loop;
end
/
案例 : 使用反向for循环结构求10的阶乘
declarev_num number := 1;
beginfor i in reverse 2..10 --反向for,从10到2loopv_num := v_num * i;end loop;dbms_output.put_line('10的阶乘:' || v_num);
end;
/
注意 :
- 简单循环loop循环和while循环的循环次数都是不确定的, for循环的次数是固定的;
- counter是一个隐式声明的变量,不需要在declare中被定义
- start_range和end_range指明循环次数.
- reverse表示循环变量从最大值向最小值迭代.
4. 游标
什么是游标?
用于临时存储一个查询返回的多行数据(类似于jdbc中的结果集ResultSet), 通过遍历游标, 可以处理该结果集的数据.
格式:
declare-- 声明游标,将查询语句的结果放在游标中cursor 游标名[(参数列表)] is 查询语句;变量列表
beginopen 游标名; -- 打开游标-- 获取游标中的值, 将游标的数据放在变量列表;fetch表示获取的意思fetch 游标名 into 变量列表;close 游标名; -- 游标的关闭end
游标的属性:
使用时 --> 游标名%游标属性 eg : c_emp%NOTFOUND
游标的属性 | 返回值类型 | 说明 |
---|---|---|
%ROWCOUNT | 整型 | 获得fetch语句返回的数据行数 |
%FOUND | 布尔型 | 最近的fetch语句返回一行数据则为真, 否则为假 |
%NOTFOUND | 布尔型 | 与%found属性返回值相反 |
%ISOPEN | 布尔型 | 游标已经打开时值为真,否则为假 |
其中 %NOTFOUND是在游标中找不到元素时候返回true,通常用来判断何时退出循环
案例 : 使用游标查询emp表中多有员工的姓名和工资,并将其依次打印出来。
declarecursor c_emp is select ename,sal from emp;v_ename emp.ename%type;v_sal emp.sal%type;
beginopen c_emp;loop-- 将游标中的值赋值给v_ename,v_salfetch c_emp into v_ename,v_sal;exit when c_emp%notfound;dbms_output.put_line(v_ename || '的工资是:' || v_sal);end loop;close c_emp;
end;
/
Oracle笔记之PS/SQL数据库程序设计语言 第一篇相关推荐
- [iBoard 电子学堂][第二卷 C程序设计语言 ]第一篇 C语言简介
一.C语言发展史 C语言是一种程序设计语言,由于它既有高级语言的特性,又有低级语言的特性,所以它既能编写基于操作系统的大型应用程序,也能编写直接操作硬件的程序,也就是我们称之为"裸奔&q ...
- oracle笔记一(sql语句方面)
oracle笔记一(sql语句方面) 一.sql语句 --================================================ 1.增加主键 alter table ...
- SQL数据库基础知识-巩固篇一
SQL数据库基础知识-巩固篇<一>... 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用了> MySQL-57 D ...
- c语言程序设计林小茶,C语言第一篇概述林小茶
<C语言第一篇概述林小茶>由会员分享,可在线阅读,更多相关<C语言第一篇概述林小茶(8页珍藏版)>请在人人文库网上搜索. 1.第一章,C,语言概述,1.1,程序与程序设计语言, ...
- ps基础教程新手入门第一篇:ps界面的介绍
欢迎来到慕恬瑶平面设计,今天给大家介绍PS基础教程新手入门第一篇: ps界面的介绍.目的让第一次接触ps的小伙伴通过ps基础教程新手入门来了解ps界面的菜单栏,工具栏已方便日后使用. 首先,打开PS ...
- 初识C语言 —— 第一篇bolg
程序有问题时不要担心.如果所有东西都没问题,你就失业了 ---- Mosher定律 新人入场,多多支持哦,谢谢大家! 文章目录 一.自我介绍 二.编程目标 三.怎么学习编程 四.学习编程的时间安排 五 ...
- Oracle笔记(十二):性能优化篇
目录 一.概述 二.修改系统全局区 三.修改进程全局区 四.优化查询 分析执行计划 使用索引 优化子查询 五.优化数据库结构 拆分表 增加中间 优化插入记录速度---禁用索引 禁用唯一性检查 使用批量 ...
- [iBoard 电子学堂][第二卷 C程序设计语言 ]第二篇 数据类型与运算符
一.数据类型 1.变量及命名规则 变量是存储在硬件存储器某一区间的数值.C语言中,变量的命名有一定的规则.变量名字是由字母和数字组成的序列(a~z.A~Z.0~9和 _),但第一个字符必须为字 ...
- [C程序设计语言]第一部分
数组... 1 extern. 3 "定义"与"声明"... 3 变量命名规则... 3 数据类型... 3 算术类型提升与转换规则... 5 void. 5 ...
最新文章
- mysql的binlog太多太大占用了空间的解决办法
- 进程和线程的区别与联系
- python使用fpdf生成数据报告pdf文件
- jquery怎么获取radio的值
- ASp.Net控件的生命周期
- MSTP和MPLS专线有什么区别?——Vecloud
- seafile 部署_Seafile开启webdav及读写性能测试
- reboot重启失败的解决方法
- 基于JavaWeb SSM mybatis 学生信息管理系统设计和实现以及文档报告
- 跨多个交换机VLAN的配置方案设计(H3C)
- 如何快速地真正的融入IT行业
- 更改自定义按钮显示值并对单元格赋值
- 微软官方 Windows 10 更新安装失败的解决办法
- 手机麦克风结构原理图_麦克风工作原理是什么
- 简单易懂的现代魔法——Play Framework攻略3
- 数学中的哈斯图如何构造?附实例
- 5.JVM三大性能调优参数:-Xms -Xmx -Xss
- SAP License:SAP HR人力资源管理系统
- S905L(P211)盒子刷android tv以及刷emuelec 4.4/4.5的向导/方法
- java生成算数表达式_惊!小学生要失业了,Java实现生成并计算四则运算表达式。...
热门文章
- Persistence provider caller does not implement the EJB3 spec correctly. Pers
- Windows——电脑不能连接手机热点(WLAN显示已经禁用)的解决办法
- 依楼听风雨,淡看江湖路
- Canal监控MySQL数据库实现数据同步
- 【转自知乎】现在赚多少钱,40岁以后才能财务自由?
- 中文字体反爬,易易易易易易【Python脱敏】车车车车车车车车
- cstdio和stdio.h的区别
- 此URL不支持Http方法POST 描述 请求行中接收的方法由源服务器知道,但目标资源不支持
- 小米人形机器人“铁大”学会敲架子鼓;​大疆 Mini 3 将上市;4990万美元,巴菲特旗下公司将开发军用自动驾驶车辆……...
- Android最简单的实现View拖拽跟随手指移动效果