PL/SQL中的变量
1)、声明
--变量名 类型 :=初始值 v_str varchar2(10):='abc';
注意:变量必须在declare语句块中声明。
2)、简单类型
- number:数字
- varchar2:变长字符串
- boolean: 不能输出 true false null
- date: 日期 to_date to_char
- char:定长字符串
- binary_integer: 计数整数
- long:2G字符串
3)、标识符规则
a、第一个字符必须是字母(v_)
b、变量名最多包含30个字符
c、不要与数据库的表或者列同名
d、每一行只能声明一个变量
e、变量名不能够使用保留字,如 from、select 等
4)、赋值 :=
I、字符类型必须使用单引号;
II、不可以使用group by;
III、可以使用数学操作符或字符串连接操作符。
5)&
接收客户端的输入 。 为占位符
6)、实例
declare
--声明一个字符串
v_str varchar2(20) :='shsxt';
--声明一个整数
v_num number(5) :=10;
--声明一个日期
v_date date :=sysdate;
v_date2 date :=to_date('2017-3-9','yyyy-MM-dd');
--声明一个布尔
v_flag boolean :=null;
begin
--拼接字符串
dbms_output.put_line(v_str||'-->'||v_num||'-->'||to_char(v_date2,'yyyy-MM-dd'));
--不能输出布尔
end;
输出结果:
shsxt–>10–>2017-03-09
二、复杂类型
1)、%type :字段类型
获取与指定的字段一致类型,
如 v_empno emp.empno%type;
v_empno2 v_empno%type;
等同于:
v_empno number(4);
2)、%rowtype:行类型
与表结构完全一致,如 v_dept dept%rowtype
实例
/** 数据类型 1、%type -->字段类型 2、%rowtype -->记录类型 */
declare
--定义字符串 存储 ename的值
v_ename varchar2(20) :='smith';
--不用关注字段的类型 与长度 (简化)
v_name emp.ename%type :='sss';
--存储一条记录(存在很多 字段)
v_emp emp%rowtype ;
begin
v_emp.empno :=100;
v_emp.sal :=9999;
dbms_output.put_line('雇员名为:'||v_name||'编号为:'||v_emp.empno||'工资'||v_emp.sal);
end;
3)、table (类似于js数组)
a)、创建类型
集中存放: type 自定义的类型名 is table of 数据类型
散列存放: type 自定义的类型名 is table of 数据类型 index by binary_integer
b)、声明变量
集中存放: 变量名 自定义的类型名:= 自定义的类型名(值列表);
散列存放: 变量名 自定义的类型名
实例
(1).散列
declare
--1、创建类型
type t_table is table of dept.dname%type index by binary_integer;
--2、声明变量
v_table t_table;
begin
--3、使用变量
v_table(-1) :='shsxt';
v_table(5) :='bjsxt';
--v_table('a') :='bjsxt2';
dbms_output.put_line( v_table(5)||'-->'|| v_table(-1));
end;
(2).集中
declare
--集中存储
--定义类型
type t_table_deptno is table of dept.deptno%type;
type t_table_empno is table of emp.empno%type;
--声明变量
v_deptno t_table_deptno:=t_table_deptno(20,30,40);
v_empno t_table_empno :=t_table_empno();
begin
--使用变量
dbms_output.put_line(v_deptno(1));
--访问第四个元素
v_deptno.extend;
v_deptno(4):=50;
--v_empno.extend;
--v_empno(1):=7898;
dbms_output.put_line(v_empno(1));
end;
4)、record(结构体)
类似于结构体,由多个不同类型组合而成复杂类型,与 table 相同“先创建结构体后定 义声明变量”。
a)、先创建类型
type 类型名 is record(
字段名1 类型1,
字段名2 类型2,
…..
);
b)、再声明变量
变量名 类型名;
实例:
declare
--创建类型
type t_rec is record(
empno number(5),
ename varchar2(20),
dname dept.dname%type
);
--声明变量
v_rec t_rec;
begin
--使用变量
v_rec.empno :=1000;
v_rec.ename :='xshuaiwen';
v_rec.dname :='上海';
dbms_output.put_line(v_rec.dname||'-->'||v_rec.ename);
end;
5)、游标
游标指向结果集的 指针,通过游标 遍历操作结果集
1)、分类
- a.隐式游标(dml语句中)
- b.显式游标(静态游标、ref游标)
2)、标准步骤
1)、创建游标
(2)、声明游标
(3)、打开游标
(4)、使用游标
(5)、关闭游标
3)、四个属性
%rowcount :记录数
%isopen :是否打开
%found: 存在记录
%notfound:没有记录
4)、实例
declare
--1、创建并声明游标(静态游标)
cursor cur_emp is select * from emp where sal>3000 order by sal desc;
v_emp emp%rowtype;
begin
--3、打开游标
open cur_emp;
--4、使用游标 (获取数据)
fetch cur_emp into v_emp;
dbms_output.put_line(v_emp.empno||'-->'||v_emp.ename||'-->'||v_emp.sal);
--5、关闭游标
close cur_emp;
exception
when no_data_found then
dbms_output.put_line('数据未找到'||sqlcode||'-->'||sqlerrm);
when too_many_rows then
dbms_output.put_line('数据超出'||sqlcode||'-->'||sqlerrm);
when others then
dbms_output.put_line('其他异常'||sqlcode||'-->'||sqlerrm);
end;
后续游标请看下一篇—————————>>>>>>>>>>