1.2变量
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;