1.简单变量类型与定义
sql 与pl/sql 通用变量类型:
varchar2(max_length) 最大4000字节
char(max_length) 最大2000字节
number(x,y) 最长x位,y位小数
date 7个字节,默认格式DD-Mon-yy
如:select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
注意:dual 是只有一行一列的伪表,sys下,方便查询,时间分钟mi和mm 都可行
pl/sql 专用变量类型:
boolean true/false/null
binary_integer 整数
变量的定义赋值用:“:=”
比如:
declare
v_gender char(1);
v_count binary_integer :=0;
v_totle_sal number(7,2) :=0;
v_date date :=sysdate+7; -- 默认加的天数
c_pi constant number(3,2) :=3.14; -- 常量
c_vaild boolean not null :true; -- 变量不为null
begin
dbms_output.put_line('Hello!');
end;
2.复合变量(组合变量)
A 表类型(一列数据):类似于数组,有下表和数据两部分组成,没有长度限制,可以动态增长。
declare
TYPE ename_table_type --自定义类型
IS TABLE OF varchar2(20) --数据类型是varchar2
INDEX BY binary_integer;
v_ename_table ename_table_type;
begin
select ename
into v_ename_table(1) --放入第一个下标
from emp where empno = 7788;
dbms_output.put_line(v_ename_table(1));
end;
/
B 记录类型(相当于面向对象封装的对象类型):包括多个组件,组件的数据类型可以不同,
每个组件叫做field(域)。
declare
TYPE emp_record_type IS RECORD
(name varchar2(20), job varchar2(10));
emp_record emp_record_type;
begin
select ename , job into emp_record.name , emp_record.job
from emp where empno = 7788;
dbms_output.put_line(emp_record.name||' - '||emp_record.job);
end;
/
注意:“||” 是字符串连接符号,可以将字符串连接起来。
3 %type与%rowtype:
declare
v_id emp.empno%type;
v_job emp.job%type;
begin
select empno into v_id from emp
where ename='SCOTT';
end;
注意:%type表示变量类型是数据库表中字段类型。emp 表中empno 类型是什么,那么v_id 就是什么类型。
如果我们想定义的结构和表emp行记录一样呢?
declare
/*以前的方式,老办法
TYPE record_type IS RECORD (
id emp.empno%type,
name emp.ename%type,
job emp.job%type
--其他的字段,此处省略..
);
emp_record record_type;
*/
--新办法,更简洁
emp_record emp%rowtype;
begin
select empno,ename into emp_record.empno ,
emp_record.ename from emp where empno = 7788;
dbms_output.put_line('name is :'||emp_record.ename);
end;
注意:%rowtype:变量类型是emp表全部字段的类型。也就是你当前定义的类型,和emp 所有的字段类型一致,
相当于你定制和一个和emp 表一样的网格,里面可以存放存放和emp 各个字段对应类型的数据。
4 赋值语句:
A 直接赋值与表达式赋值:
declare
v_count number(2) :=0;
v_married boolean;
emp_record emp%rowtype;
begin
v_count :=10;
emp_record.ename :='fuzhi';
v_married :=(1=2); --表达式赋值
end;
注意:sql和plsql 中“=”表示比较。
B 表达式赋值
declare
v_married boolean :=true;
v_comm emp.comm%type;
begin
select comm into v_comm
from emp where empno = 7788;
v_married :=(v_comm is null);
dbms_output.put_line(v_married); -- boolean 类型不能通过这个打印,报错
end;
C boolean 可以通过if else 进行判断
declare
v_married boolean :=true;
v_comm emp.comm%type;
begin
select comm into v_comm
from emp where empno = 7788;
v_married :=(v_comm is null);
if v_married = true then
dbms_output.put_line('true');
else
dbms_output.put_line('false');
end if;
end;
D 赋值使用函数
declare
emp_record emp%rowtype;
v_count number;
v_now char(30);
v_user char(20);
begin
select ename
into emp_record.ename
from emp where empno = 7788;
v_count :=length(emp_record.ename);
v_now :=to_char(sysdate,'yyyy-mm-dd');
v_user :=user;
dbms_output.put_line(v_now);
dbms_output.put_line(v_user);
dbms_output.put_line(v_count);
end;
注意:user 是当前用户,show user 可以进行查看
E 替代变量的使用:
declare
emp_record emp%rowtype;
v_count number;
v_now char(30);
v_user char(20);
begin
select ename
into emp_record.ename
from emp where empno =&no;
dbms_output.put_line(emp_record.ename);
end;