Oracle 学习——变量

本文深入解析PL/SQL中的变量与常量定义、赋值、作用域及使用%TYPE与%ROWTYPE绑定数据库列的技巧。涵盖变量声明、初始化、数据库数据赋值、变量类型绑定、作用域规则及常量定义等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.变量的声明:

摘自:Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012

声明变量的范例:

declare
	v_empname	varchar (20);
	v_deptname	varchar (20);
	v_hiredae	date	not null:=sysdate;
	v_emmno		int		not null default 0114;
begin
	DBMS_OUTPUT.PUT_LINE('ther are declares some param');
	--DBMS_OUTPUT.PUT('现在时间是:');
	DBMS_OUTPUT.PUT_LINE('现在时间是:'
						 ||to_char(v_hiredae,'YYYY-MM-DD HH24:MI:SS'));
end;
/

注意,一旦出现了nut null字段,后面必须有赋初值的语句

2.变量的赋值

变量在使用前必须初始化或者赋值,如果使用前不赋值,后面对变量的的操作将会无效。

举例:

declare
	v_counter	integer;
begin
	v_counter:=0;
	v_counter:=v_counter+1;
	
	DBMS_OUTPUT.PUT_LINE('v_counter = '||v_counter);
end;
/

正确为变量赋值,再操作,得到正确的结果

错误示范:注释赋值部分,得到空

使用数据库类型为变量赋值

declare 
	v_string varchar2(200);
	v_hire_date	date;
	v_bool	boolean;	--pl/sql 布尔类型
begin
	v_bool:= True;	--布尔类型赋值
	v_hire_date:=to_date('2019-01-29', 'yyyy-mm-dd');	--使用函数为日期赋值
	DBMS_OUTPUT.PUT_LINE('to_date 日期是:'||to_char(v_hire_date,'YYYY-MM-DD'));
	v_hire_date:=sysdate;	--使用日期函数赋值
	DBMS_OUTPUT.PUT_LINE('to_date 日期是:'||to_char(v_hire_date,'YYYY-MM-DD HH24:MI:SS'));
	v_hire_date:=date'2019-01-29';	--直接赋值静态日期
	DBMS_OUTPUT.PUT_LINE('date 日期是:'||to_char(v_hire_date,'YYYY-MM-DD'));
	v_string:='this is a string';
	DBMS_OUTPUT.PUT_LINE(v_string);
	
end;
/

输出结果:

使用数据库数据为变量赋值

表结构如下:

表数据如下:

使用表数据为变量赋值过程:

SET SERVEROUTPUT ON;--打开DBM输出显示开关
declare
	v_id	student2.sid%TYPE;
	v_name	student2.sname%TYPE;
	v_birthday	student2.sbirth%TYPE;
	v_solary	student2.solary%TYPE;
begin
	select sid,sname,sbirth,solary
		into v_id,v_name,v_birthday,v_solary
		from student2
		where sid = &id;	--id为入参,需要手动输入
	--输出变量的内容
	DBMS_OUTPUT.PUT_LINE('学生ID:'  || v_id);
	DBMS_OUTPUT.PUT_LINE('学生姓名:'|| v_name);
	DBMS_OUTPUT.PUT_LINE('学生生日:'|| v_birthday);
	DBMS_OUTPUT.PUT_LINE('学生月薪:'|| v_solary);
end;
/

执行结果:


注意:如果select into 查询返回多行数据会触发 TOO_MANY_ROWS异常,
           如果未找到任何行数据,会触发NO_DATA_FOUND异常。

3.使用 %TYPE

使用pl/sql的%TYPE,开发人员可以基于已有的变量类型,或者是数据库列的类型来之sing变量的类型。

declare
	v_id	student2.sid%TYPE;
	v_tid	v_id%TYPE;
	v_solary	number(7,3)	NOT NULL:=1000;
	v_others0lary	v_solary%TYPE:=500;
begin
	NULL;
end;
/

上述代码中的v_id使用%TYPE定义了与student2表中sid列相同的数据类型,而v_tid定义了与v_id相同的类型,因此,当student2表中的sid列的类型发生变化后,变脸的类型会自动发生变化,不需要手动地进行维护。
v_solary是一个具有NOT NULL约束的变量声明,在声明这个变量指定了厨师长,v_othersolary使用%TYPE定义了与v_solary相同的类型,因此也具有 NOT NULL的约束,在声明是同样为v_othersolary指定了变量的初始值,如果不指定这个初始值,pl/sql引擎将触发如下所示的异常:


注意:尽管v_othersolary会因为 指定的NOT NULL而触发异常,但是student2表中的sid列是不允许为空的,对于数据库
类型,%TYPE 只提供类型信息,并不提供 NOT NULL 约束信息,因此即便没有为v_id或v_tid指定初始值,也能够正常运行。

4.使用%ROWTYPE

%ROWTYPE是预%TYPE 相似的用于绑定到数据库表列的类型,%TYPE仅绑定到单个数据库列的类型,而%ROWTYPE则绑定到一整行
的所有列类型,可以将使用%ROWTYPE定义的变量看做是一条记录类型,如下实例:

declare
	v_stu	student2%ROWTYPE;	--定义student2表的所有列类型
begin
	select *
		into v_stu
		from student2
		where sid = &id;
	--输出结果
	DBMS_OUTPUT.PUT_LINE('学生ID:'  || v_stu.sid || chr(10)
						|| '学生姓名:' || v_stu.sname || chr(10)
						|| '学生月薪:' ||v_stu.solary);
end;
/

输出:

注意:在pl/sql中,chr(13)表示回车,chr(10)表示换行,同城使用cher(13)与chr(10)来进行回车与换行
插入行记录类型

 

使用%ROWTYPE定义游标类型的变量

declare
	cursor stu_cursor	--定义游标类型
	is
		select sid,sname,sage,job,solary
		from student2;
	--使用%ROWTYPE定义游标类型的变量
	v_stu	stu_cursor%ROWTYPE;
begin
	open stu_cursor;
	--循环提取游标数据
	loop
		fetch stu_cursor
			into v_stu;
			--注意游标移动到最尾部退出游标
			exit when stu_cursor%NOTFOUND;
			--输出游标数据
			DBMS_OUTPUT.PUT_LINE('学生ID:'  || v_stu.sid || chr(10)
						|| '学生姓名:' || v_stu.sname || chr(10)
						|| '学生年龄:' ||v_stu.sage || chr(10)
						|| '学生月薪:' ||v_stu.solary || chr(10)
						|| '学生职位:' ||v_stu.job
						);
	end loop;
	--关闭游标
	close stu_cursor;
end;
/

输出:

可以看到代码定义了游标stu_sursor,然后定义了改游标类型的v_stu变量,使用%ROWTYPE指定类型为游标返回类型,
通过提取游标的FETCH INTO语句,一次将一行数据写入v_stu变量中,然后输出吧结果
5.变量的作用域和可见性

<<outer>>
declare
	v_name	varchar2(20);	--定义外层变量
begin
	v_name:='sherly';
	<<inner>>
	declare
		v_name	varchar2(20);
		begin
			v_name:='lucky';
			--输出内层快的变量
			DBMS_OUTPUT.PUT_LINE('内层块的学生姓名:' || v_name);
			DBMS_OUTPUT.PUT_LINE('外层块的学生姓名:' || outer.v_name);
	end;
	DBMS_OUTPUT.PUT_LINE('outer的学生姓名:' || v_name);
end;
/


嵌套模块的语法格式如上,外层与内层的变量的作用域类似于C++的结构体作用域
注意:如果子块中重新声明了变量,本地变量优先权将高于全局变量。

内层的嵌套块遵循变量的可见性与作用域规则,仅在内部模块可见,当离开嵌套块时,变量占用的内存会
被释放,因此外层的块无法对内层的变量进行访问。

6.常量的定义

常量的定义类似于变量,但是常量的一个明显的特征是需要在变量声明时指定初始值,其值一旦指定,在整个程序的运行期间不能发生改变,常量通常用来定义静态的值,是的开发人员可以使用常量来替代代码中硬编码的值,增强代码的可维护性。
常量的定义语法如下所示:

constant_name	constant datatype :=value;

>>constant_name 是常量的名称,命名格式与变量相似 c_name
>>constant 是一个保留字,用来确保值不会被改变
>>value用来为常量指定一个值,在常量声明时必须具有一个初始值

declare
	c_solary_rate	constant	number(7,2)	:=0.25; --定义加薪常量值
	v_name	varchar2(20);
	v_solary	number(7,2);
	v_solaryadd	number(7,2);
begin
	select solary,sname
		into v_solary,v_name
		from student2
		where sid = &id;
		v_solaryadd:=v_solary * (1 + c_solary_rate);
		
	DBMS_OUTPUT.PUT_LINE('学生姓名:' || v_name || chr(10)
						|| '学生当前薪水:' || v_solary || chr(10)
						|| '加薪后薪水:' || v_solaryadd);
end;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值