orale中pl/sql的数据类型总结
一、pl/sql的概念
pl/sql简单的说就是:sql语句+编程语言的特性。
二、pl/sql的优点
1、可以提高程序的运行效率,因为能够减少数据库的访问次数。
2、可以对复杂的业务逻辑进行封装
3、pl/sql具有编程语言的特性,可以写ifelse实现复杂的业务逻辑
三、pl/sql块
pl/sql是用块来管理内部程序,pl/sql 块分匿名块与命名块。
匿名块:没有名字的就是匿名块,匿名块不会保存到数据库中,执行完就没有了,类似于java中的main方法。
命名块:有名字的块就是命名块。命名块 :过程,函数,游标,触发器
四、pl/sql变量类型
基本类型:
类型名 | 说明 |
varchar | 定长字符串 |
varchar2 | 变长字符串 |
number(n,m) | 数字类型 |
date | 日期类型 |
timestamp | 时间戳类型 |
引入类型
1、%type类型(列类型)
%type类型指的是声明变量的时候,该变量参考某个表的某个列的类型。
例子:
declare
-- 变量声明部分 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;
2、%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;
3、record类型(记录类型)
record可以理解为可自定义的行类型,record类型在使用之前必须声明该类型。
例子:
declare
-- 声明record类型
type emp_record_type is record(
ename emp.ename%type,
sal emp.sal%type,
total emp.sal%type);
-- 声明record类型的变量
v_emp emp_record_type;
begin
-- 查询数据,给变量赋值
select ename,sal,sal+nvl(comm,0) into v_emp from emp where empno=&no;
-- 输入record类型变量中的数据
dbms_output.put_line('员工姓名:'||v_emp.ename||',基本工资:'||v_emp.sal||',总工资:'||v_emp.total);
end;
4、table类型(表类型)
无论是行类型还是记录类型只能存储一行数据,如果要存储多行数据,需要用到table类型。table类型也需要先声明类型,在声明该类型的变量。
例子:
根据员工编号查询员工的信息,存储到table类型的变量中,再输出出来。 declare
-- 声明table类型 is table of 后可以跟行类型,也可以是记录类型
type emp_table_type is table of emp%rowtype
-- 指定下标的增长方式为整数,每次增长index by binary_integer;
-- 声明table类型的变量
v_emp emp_table_type;
begin
-- 把编号为7369的员工的信息存储到table类型变量中
select * into v_emp(1) from emp where empno=7369;
-- 把编号为7499的员工的信息存储到table类型变量中
select * into v_emp(2) from emp where empno=7499;
--数据table类型变量中的数据
dbms_output.put_line('员工姓名:'||v_emp(1).ename||',基本工资:'||v_emp(1).sal);
dbms_output.put_line('员工姓名:'||v_emp(2).ename||',基本工资:'||v_emp(2).sal);
end;
附:表类型后边可以跟记录类型,如下:
查询员工的姓名,编号,部门名称。(因为部门名称与员工信息并不在同一个表中,所以声明table类型的时候后边需要跟一个记录类型。)
declare
-- 声明一个record类型,用来存储员工的姓名,编号和部门名称
type emp_record_type is record(
ename emp.ename%type,
empno emp.empno%type,
dname dept.dname%type
);
-- table类型的变量,is table of 后可以跟行类型,也可以是记录类型
type emp_table_type is table of emp_record_type
-- 指定下标的增长方式为整数,每次增长1
index by binary_integer;
-- 声明table类型的变量
v_emp emp_table_type; begin
-- 查找数据
select e.ename,e.empno,d.dname bulk collect into v_emp from emp e inner join dept d on d.deptno=e.deptno;
-- 循环输出
for v_i in v_emp.first..v_emp.last
loop
dbms_output.put_line('员工编号:'||v_emp(v_i).empno||'员工姓名:'||v_emp(v_i).ename||'部门姓名:'||v_emp(v_i).dname);
end loop; end;
引入数据类型总结:
返回值为单列可以用%type类型,如果为单行,用%rowtyp和table都可以,只不过,%rowtype的行是自定义的,table的行是参照数据的行的,如果,返回值为多行,用table类型比较合适,如果,返回值为多行,同时列还是自定义的,则用table类型结合%rowtype类型。
最新文章
- jpeg库编译 - windows平台
- jackson json转list
- WAMP中phpMyAdmin登陆不了问题的解决方法
- Schema Workbench 开发mdx和模式文件
- location.reload()加载时有弹出框
- 从URL中获取搜索关键字
- 学习笔记——访问者模式Visitor
- Tenka1 Programmer Contest D - IntegerotS
- 每个程序员都应该用MBP
- C#采用vony.Html.AIO插件批量爬MM网站图片
- L1-Day12
- php 缓存 加速缓存
- haoop笔记
- (转)git checkout 撤销修改
- dajpper使用教程
- JavaScript从入门到精通
- [Laravel] 10 - WEB API : wrapper
- Asterisk的type类型和身份认证
- 自定义BeanUtils
- 浏览器拦截跨域请求处理方法(同源策略不允许读取XXX上的远程资源)