接触 PL/SQL 第二天
2017-04-04 10:04
267 查看
PL/SQL 中的变量
PL/SQL中变量可以分为四种1.标量类型
2.复合类型
3.参照类型
4.LOB类型
我画个图
这个图是照书上抄的.
下面来说说四种变量
1.标量变量
只能存放单个数值的变量, 它包括数字类型,字符类型,日期类型和布尔类型,分别对应上图的四个小框框. 标量是最常用的类型1)常用的有:
number(p,s) 数字类型,p表示总共位数,s表示小数点位数 比如 sal number(6,2) 那么sal的取值范围就是 0.01~9999.99
char(n) 定长字符串类型,就是固定长度的字符串, 比如 name char(50) ,那么name的长度就是固定50个字符,长度不够用空格补齐, n要小于2000
varchar2(n) 变长字符串类型,就是长度自适应, 比如 name varchar(50) , 那么 name的长度根据name的实际长度取值,最大50个字符 n要小于4000
date 日期类型,长度固定7字节. 注意: 当给date变量赋值时,数据必须与日期格式和日期语言匹配
timestamp 也是日期类型, 定义更为精准的时间. 注意事项与date类型一致
long 变长字符串,类似于 varchar2类型 最大长度可为 32760
long row 变长的二进制数据, 最大长度为 32760
boolean 布尔值变量, 值可为 true,false,null 该类型只能在PL/SQL中使用
binary_integer 定义整数, 取值范围 -2147483647~2147483647, oracle9之前下标必须使用该类型, 只能用于PL/SQL中
binary_float / binary_double oracle 10g新增的数据类型, 分别用于定义单/双精度浮点型 , 主要用于高速的科学计算. 注意: 定义时要加后缀 比如: 1.5f , 3.006d
2)定义标量变量
identifier 定义变量或常量的名称
CONSTANT 指定常量, 记得给常量赋值
datatype 指定变量或常量的数据类型
not null 指定不能为空值
default 指定默认的初始值
expr 指定初始值的PL/SQL表达式 , 可以是文本值,其他变量,函数等
如:
v_ename 4000 varchar2(20); v_sal number(6,2); v_bal binary_float; v_rate CONSTANT number(4,2) :=21.23; -- 常量 v_hiredate date; v_valid boolean not null default false; -- 非空,默认为false的布尔类型
3)使用
下面来写个例子
declare v_ename varchar2(20); v_sal number(6,2); v_tax_rate CONSTANT number(3,2) :=0.03; --所得税系数 v_tax_sal number(6,2); --所得税 begin select ename,sal into v_ename,v_sal from emps where empno=&no; v_tax_sal := v_sal*v_tax_rate; dbms_output.put_line('姓名:'||v_ename); dbms_output.put_line('薪资:'||v_sal); dbms_output.put_line('所得税:'||v_tax_sal); end;4) %type
根据类型的实际情况来设定长度,后面厉害会演示
2.复合变量
变量可以记录多个信息写例子比较直观
1)记录
declare type emps_record_type is record( v_ename emps.ename%type, v_sal emps.sal%type, v_job emps.job%type ); emps_record emps_record_type; begin select ename,sal,job into v_ename,v_sal,v_job from emps where empno=&no; dbms_output.put_line('姓名:'||emps_record.v_ename); end;2)表
declare type ename_table_type is table of emps.ename%type index by BINARY_INTEGER; ename_table ename_table_type; begin select ename into ename_table(1) from emps where empno=&no; dbms_output.put_line('姓名:'||ename_table(1)); end;3)嵌套表
create or replace type emps_type as OBJECT( v_ename varchar2(20), v_sal number(6,2), v_job varchar2(20) ); create or replace type emps_array is table of emps_type;
create table department( deptno number(2), dname varchar(10), employee emps_array --上面定义的表类型 ) nested table employee store as employee;
4) VARRAY(变长数组)
创建类型
create type article_type as OBJECT( title varchar2(30), pubdate date ); create type article_array is varray(20) of article_type;引用该类型
create table author( id number(5), name varchar2(20), article article_array );
3.参照变量
1)游标declare type c1 is ref cursor; emps_cursor c1; v_ename emps.ename%type; v_sal emps.sal%type; begin open emps_cursor for select ename,sal from emps where deptno=&no; loop fetch emps_cursor into v_ename,v_sal; exit when emps_cursor%NOTFOUND; dbms_output.put_line(v_ename); end loop; close emps_cursor; end;2) ref obj_type 共享数据
create or replace type home_type as OBJECT( street varchar2(50), city varchar(20), state varchar(20), owner varchar(20) ); create table homes of home_type; -- 创建表 insert into homes values('五一路128号','福州','350001','张一'); insert into homes values('五四路328号','福州','350002','李一'); insert into homes values('六一路165号','福州','350003','王一'); commit;
共享
create table person( id number(5) primary key, name varchar2(20), addr ref home_type ); insert into person select 1,'张三',ref(p) from homes p where p.owner='张一'; insert into person select 2,'张五',ref(p) from homes p where p.owner='张一'; insert into person select 3,'张六',ref(p) from homes p where p.owner='张一';
4.LOB变量 用于存储大批量数据的变量
分为内LOB和外LOB1)内LOB
内LOB又包括 BLOB, CLOB, NCLOB 三种类型 支持事务操作.
其中CLOB/NCLOB用于存储大批量字符数据
BLOB用于存储大批量二进制数据
2)外LOB
外LOB 有 BFILE一种类型 不支持事务操作
BFILE 用于存储指向OS文件的指针
---书上并没有详细介绍LOB类型,对该类型理解比较模糊---
补充:非PL/SQL变量
1) SQL*Plus 变量
var name varchar(20) begin select ename into :name from emps where empno=&no; end;2) Procedure Builder 变量
.create char name length 20 begin select ename into :name from emps where empno=&no; end; TEXT_IO.PUT_LINE(:name); scott3) Pro*C/C++ 变量
char name(10); exec sql execute begin select ename into :name from emps where empno=&no; end; end-exec; print(name);
总结:感觉PL/SQL中的变量跟高级语言的变量类似,四大类型中 标量类似于java中的基础类型,包括String,复合类型类似于引用类型,参照类型感觉像继承,有数据共享的意思
LOB类型只提到存储大量数据,没有给出具体的用法,不予评价. 另外非PL/SQL类型就有种全局变量的感觉了
相关文章推荐
- 接触 PL/SQL 第一天
- PL/SQL 语句块初次接触(游标使用,实现loop的continue)
- java+oracle+web(第二天) win7 64位 oracle 11g + pl/sql 32位 的成功安装
- PL/SQL按ctrl+E的发现
- 启动PL/SQL Developer 报字符编码不一致错误 ,Database character set (AL32UTF8)
- PL/SQL Developer使用技巧(二)F5
- 【转】 PL/SQL最差实践
- 设置Oracle PL/SQL时间显示格式NLS_TIMESTAMP_FORMAT
- DataGrip是否支持Oracle的pl/sql?
- PL/SQL
- WIN8-64bits 用PL/SQL连接 oracle 11g 12c
- PL/SQL 客户端安装配置文档(超详细多图)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 2(PL/SQL语言概览)
- 解决pl/sql developer中数据库表中显示中文乱码问题
- 常见 PL.SQL 数据库操作
- PL/SQL Server 的tnsname.ora注意事项
- 關於PL/SQL Developer的配置與快速遷移
- PL/SQL简单函数
- pl/sql developer快速输入select * from
- PL/SQL Developer 和 instantclient客户端安装配置