PL_SQL笔记(1)(转载)

 注:以下笔记内容转载自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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值