注:以下笔记内容转载自http://blog.csdn.net/lilp_ndsc/archive/2009/04/15/4074798.aspx;
declare
v_DESC VARCHAR2(30);
v_NUM NUMBER:=45;
v_count BINARY_INTEGER:=0;
v_const constant BINARY_INTEGER :=10;
v_nt VARCHAR2(20) NOT NULL :='lalala';
begin
dbms_output.put_line(v_NUM);
v_NUM:=100;
dbms_output.put_line('v_NUM='||v_NUM);
dbms_output.put_line(v_const);
dbms_output.put_line();
end;
declare
--小数会被截掉
v_num NUMBER(3):=123.2;
--小数点后面保存三位,超过四舍五入,上数点前面肯定只能有一位了,要不然就出错
v_num1 NUMBER(4,3):=2.323;
-- -3 代表小数点前面每几位四舍五入
v_num2 NUMBER(5,-3):=12354.23;
-- P S
--有效数位<=P+|S|
v_num3 NUMBER(4,6):=0.0012345;
----------------------------------------------
--BINARY_INTEGER NUMBER并不是采用二进制形式保存
--在计算之前要进行转化成二进制才能运算
--而BINARY_INTEGER 底层是采用二进制保存的 操作比较快
--只是用于常用(循环)计算,不用与数据库表交互
--varchar2 varcahr 一定给长度
--boolean true false
--DATE TIMSTAMP 日间戳 INTERVAL
begin
dbms_output.put_line(v_num); --123
dbms_output.put_line(v_num1); --2.323
dbms_output.put_line(v_num2); --12000
dbms_output.put_line(v_num3); --.001235
end;
--将数据库表中的数据取出来放在变量中
--注意声明的变量 要和数据表字段类型一致
declare
v_id number(7);
v_fname varchar2(25); --当我们不知道表结构,或表结构变化时会出错长度不够的隐患
v_salary number(11,2);
begin
select id,first_name,salary into v_id,v_fname,v_salary from s_emp where id=1;
dbms_output.put_line(v_id||' '||v_fname||' '||v_salary);
end;
--解决上面的问题 使用TYPE方式的变量
declare
v_id s_emp.id%TYPE;
v_fname s_emp.first_name%TYPE; --声明一个TYPE类型
v_salary s_emp.salary%TYPE;
begin
select id,first_name,salary into v_id,v_fname,v_salary from s_emp where id=1;
dbms_output.put_line(v_id||' '||v_fname||' '||v_salary);
end;
--把一组相关的变量放在一起
declare
TYPE record_emp IS RECORD(
v_id s_emp.id%TYPE,
v_fname s_emp.first_name%TYPE,
v_salary s_emp.salary%TYPE
);
v_temp record_emp;
begin
select id,first_name,salary into v_temp from s_emp where id=1;
dbms_output.put_line(v_temp.v_id||' '||v_temp.v_fname||' '||v_temp.v_salary);
end;
--类型赋值
declare
TYPE record_emp IS RECORD(
v_id s_emp.id%TYPE,
v_fname s_emp.first_name%TYPE,
v_salary s_emp.salary%TYPE
);
TYPE record_emp1 IS RECORD(
v_id s_emp.id%TYPE,
v_fname s_emp.first_name%TYPE,
v_salary s_emp.salary%TYPE
);
v_temp record_emp;
v_temp1 record_emp;
v_temp2 record_emp1;
--注意 同类型可以赋值 不同类型即使结构相同也不能赋值
begin
select id,first_name,salary into v_temp from s_emp where id=1;
dbms_output.put_line(v_temp.v_id||' '||v_temp.v_fname||' '||v_temp.v_salary);
end;
---RWOTYPE 类型
--查询整个表的所有字段内容
--按照上面的定义就太麻烦了
--同样也存在一定隐患,如果表字段增加了,就会出现问题
declare
v_emp s_emp%ROWTYPE;
begin
select * into v_emp from s_emp where id=1;
dbms_output.put_line(v_emp.first_name||' '||v_emp.last_name);
end;
--TABLE 类型的使用
--关于程序中100 2000 没有什么要求 是一个整型数据
declare
--声明一个TABLE类型
TYPE t_emp IS TABLE OF s_emp%ROWTYPE INDEX BY BINARY_INTEGER;
v_emp t_emp;
begin
select * into v_emp(100) from s_emp where id=1;
select * into v_emp(2000) from s_emp where id=2;
dbms_output.put_line(v_emp(100).first_name);
dbms_output.put_line(v_emp(2000).first_name);
end;
--SQL块嵌入
--变量尽量不要重名
<<Outer>>
declare
v_Num number:=100;
begin
v_Num:=1;
declare
v_Str varchar2(20):='hello';
v_Num number :=200;
begin
dbms_output.put_line('v_Str:'||v_Str);
dbms_output.put_line('v_Num:'||v_Num);
dbms_output.put_line('v_Num:'||Outer.v_Num);
end;
dbms_output.put_line('v_Num:'||v_Num);
end;
---条件表达式
--条件为null 或 fasle 都是false 是意思
--只能是true 的情况才执行代码
IF boolean类型表达式 THEN
ELSE
END IF:
------------------------
IF THEN
ELSE IF ..... THEN
ELSE
END IF;
-------------------------
declare
v_flag boolean;
begin
if v_flag then
dbms_output.put_line('TRUE');
elseif (not v_flag) then
dbms_output.put_line('FALSE');
else
dbms_output.put_line('NULL');
end if;
end;
declare
v_sal s_emp.salary%TYPE;
v_bonus number(10,2);
begin
select salary into v_sal from s_emp where id=1;
if v_sal>1500 then
v_bonus:=v_sal*0.2;
elsif v_sal > 1000 then
v_bonus:=v_sal*0.1;
else
v_bonus:=v_sal*0.05;
end if;
end;
--循环 LOOP
LOOP
--EXIT WHEN boolean_exp
IF boolean_exp THEN
EXIT;
END IF;
END LOOP;
declare
v_ret number:=0;
i number:=1;
begin
loop
v_ret :=v_ret+1;
i:=i+1;
dbms_output.put_line(v_ret);
exit when i>100;
end loop;
end;
---WHILE 循环
WHILE boolean_exp LOOP
--循环体
END LOOP;
declare
v_ret binary_integer:=0;
begin
while v_ret<100 loop
v_ret:=v_ret+1;
dbms_output.put_line(v_ret);
end loop;
end;