PL/SQL 数据类型与定义、赋值(二)

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值