9. 常量
declare
c_salary_rate constant number(7,2) :=0.25;-- 定义加薪常量值
v_salary number(7,2); --定义保存薪资结果哟的变量
begin
select sal *(1+c_salary_rate)--查询数据库,返回加薪后的结果
into v_salary
from emp
where empno =&empno;
--输出屏幕信息
dbms_output.put_line('加薪后的薪资:'||v_salary);
end;
10 char类型
declare
v_name char(2 byte);
v_name2 char(2 char);
v_name3 char;
v_name4 char(20);
begin
v_name:='ab'; --正确,2个字节的字符串
-- v_name:='中国'; -- 错误,超出声明的2个字节
v_name2:='中国'; -- 正确2个字符
v_name3:=1; -- 正确,单个字节
v_name4:='the is string'; -- 为char赋字符串值
dbms_output.put_line(length(c_name4));-- 输出字符串长度
end;
10 varhcar2类型
declare
v_ename varchar2(25);
v_name1 varchar2(25 byte);
v_name2 carchar2(25 char);
-- v_name3 carchar2; -- 错误 必须要为varchar2指定长度值
begin
v_name:='中华人民共和国'; -- 为变量赋值,并输出变量的长度
dbms_output.put_line('v_name变量的长度为:'||length(v_name)||'字节');
v_name1 :='中华人民共和国';
dbms_output.put_line('v_name1 变量的长度为:'||length(v_name1)||'字节');
v_name2:='中华人民共和国';
dbms_output.put_line('v_name2变量的长度为:'||length(v_name2)||'字节');
end;
11 rowid类型
declare
v_empname rowid; --定义rowid类型的变量
v_othersname varchar(18); --定义用来保存rowid的字符串变量
begin
select rowid
into v_empname
from emp
where empno=&empno;
-- 输出rowid值
dbms_output.put_line(v_empname);
v_othersname :=rowidtochar(v_empname);-- 装换rowid为字符串值
dbms-oytput.put_line(v_othersname);
end;
12. number 类型
declare
v_num1 number:=3.1415926; --结果:3.1415926
v_num2 number(3):=3.1415926; --四舍五入等于3
-- v_num2_1 number(3):=3145.1415926; -- 错误,精度太高:ORA-06502:数字或值错误:数值精度太高
v_num3 number(4,3):=3.1415926; --结果:3.142
-- v_num3_1 number(4,3):=314.123; --错误,精度太高:ORA-06502:数字.927或值错误:数值精度太高
v_num4 number(8,3):=31415.9267; --四舍五入2位小数,结果为:31415.927
v_num5 number(4,-3):=3145611.789; --由于为负3,要从小数点左侧开始舍入,清除向左的位数,结果为31000
v_num5_1 number(4,-3):=314.567895; --舍入后的结果是0
v_num6 number(4,-1):=31451; --舍入后结果31450
-- v_num6_1 number(4,-1):=3145123; --错误,精度太高:ORA-06502:数字或值错误:数值精度太高
begin
dbms_output.put_line('v_num1:='||v_num1);
dbms_output.put_line('v_num2:='||v_num2);
dbms_output.put_line('v_num3:='||v_num3);
dbms_output.put_line('v_num4:='||v_num4);
dbms_output.put_line('v_num5_1:='||v_num5_1);
dbms_output.put_line('v_num6:='||v_num6);
end;
13. pls_integer 和 binary_integer
--pls_integer使用示例
declare
v_num1 pls_integer:=2147483647;
begin
-- 当为v_num1+1时,产生了溢出,会触发异常
v_num1:=v_num1+1-1;
exception
when others then
-- 输出:ora-01426:数字溢出
dbms_output.put_line(sqlerrm);
end;
-- binary_integer 使用示例
declare
v_num1 binary_integer :=2147483647;
begin
/*当为v_num1时,产生了溢出,
此时v_num1会被当做number进行处理,不会触发异常
*/
v_num1:=v_num1+1-1;
end;
14.date 类型
declare
-- 输出当前周的第1天,即星期日的日期
v_weekday date :=trunc(syadate)-to_char(syadate,'D')+1;
-- 输出现在的时间
v_now date:=syadate;
begin
dbms_output.put_line(to_char(v_weekday,'YYYY-MM-DD'));
dbms_output.put_line(to_char(v_now,'YYYY-MM-DD hh24:mi:ss'));
end;
15. timestamp类型
declare
v_now timestamp(8):=syadate;-- 定义变量
v_nowdate date:=sysdate;
begin
-- 输出变量结果值
dbms_output.put_line(v_now);
dbms_output.put_line(v_nowdate);
end;
timestamp:13-8月 -11 07.25.46.0000000 上午
date:13-8月-11
16. timestamp with time zone类型
declare
v_timetamp timestamp; --定义日期类型的变量
v_timestampwithzone timestamp with time zone;
begin
v_timestamp :=sysdate;-- 为日期类型的变量赋初始值
v_timestampwithzone :=sysdate;
dbms_output.put_line(v_timestamp);-- 输出信息
dbms_output.put_line(v_timestampwithzone);
end;
输出:
13-8月 -11 01.24.24.000000 下午
13-8月 -11 01.24.24.000000 下午 +08:00
17. interval year to month 类型
declare
v_start timestamp; --定义起始与结束时间戳类型
v_end timestamp;
v_interval interval year to month;
v_year number;
v_month number;
begin
v_start :=to_timestamp('2010-05012','yyyy-mm-dd');--赋指定的时间戳值
v_end :=current_timestamp;--赋当前的时间戳值
v_interval :=(v_end-v_start) year to month;-- year to month 是 interval 表达式语法
v_year :=extract(year from v_interval);--提取年份和月份值
v_month :=extract(month from v_interval);
dbms_output.put_line('当前的interval值为:'||v_interval);--输出当前的interval类型值
--输出年份与月份值
dbms_output.put_line('interval年份为:'
||v_year
||chr(13)
||chr(10)
||'interval月份为:'
||v_month
);
v_interval :=interval '01-03'year to month; --直接为interval赋值
--输出interval 的值
dbms_output.put_line('当前的interval值为:'||v_interval);
v_interval :=interval '01' year;--直接为interval 赋年份值
dbms_output.put_line('当前的interval值为:'||v_interval);
-- 提取年份和月份值
v_year :=extract(year from v_interval);
v_month:=extract(month from v_interval);
--输出值
dbms_output.put_line('interval 年份为'
||v_year
||chr(13)
||chr(10)
||'interval月份为:'
||v_month
);
v_interval:=interval '03' month; -- 直接为interval 赋月份值
--输出月份值
dbms_output.put_line('当前的interval 值为:'||v_interval);
end;
输出值如下:
当前的 interval 值为:+01-03、
interval 年份为:1
interval 月份为:3
当前的interval 值为:+01-03
当前的interval值为:+01-00
interval 年份为:1
interval 月份为:0
当前的interval 值为:+00-03
18. 布尔类型
declare
v_condition boolean;--定义布尔类型变量
begin
v_condition :=true;--为变量赋布尔值true
-- v_condition :='False'; --错误,布尔值不能带引号
if v_condition then -- 如果布尔值条件为true ,则输出
dbms_output.put_line('值为ture');
end if;
end;