日期:2014-05-16  浏览次数:20527 次

oracle实用语法信息
《PL/SQL编程》                             
 /*procedural language/sql*/
--1、过程、函数、触发器是pl/sql编写的
--2、过程、函数、触发器是在oracle中的
--3、pl/sql是非常强大的数据库过程语言
--4、过程、函数可以在java程序中调用

--提高效率:优化sql语句或写存储过程
--pl/sql移植性不好

--IDE(Integration Develop Environment)集成开发环境

--命令规则:
--变量(variable)           v_
--常量(constant)           c_
--指针、游标(cursor)         _cursor
--例外、异常(exception)    e_

--可定义的变量和常量:
  --标量类型:scalar
  --复合类型:composite    --存放记录、表、嵌套表、varray
  --参照类型:reference
  --lob(large object)
  


《PL/SQL 基本语法》
--例:创建存储过程
create or replace procedure pro_add
is
begin
  insert into mytest values('韩xx','123');
end;
exec pro_add; --调用

--查看错误信息
show error;
--调用过程
exec 过程(c1,c2,...);
call 过程(c1,c2,...);
--打开/关闭输出选项
set serveroutput on/off
--输入
&

--块结构示意图
declare   --定义部分,定义常量、变量、游标、例外、复杂数据类型
begin     --执行部分,执行pl/sql语句和sql语句
exception --例外处理部分,处理运行的各种错误
end;      --结束


--《实例演示》
declare
  v_ival number(4) :=100; --声明并初始化变量
  --v_dtm date;
  v_dtm syslogs.dtm%type; --取表字段类型
  v_content varchar(512);
begin
  v_ival := v_ival * 90;  --赋值运算
  insert into syslogs values(seq_syslogs.nextval,10,sysdate,'v_ival='||v_ival,user);--数据库存储
  dbms_output.put_line('v_ival'||v_ival);
  
  select count(*) into v_ival from syslogs;--使用select查询赋值
--select ename,sal into v_name,v_sal from emp where empno=&aa;
  insert into syslogs values (seq_syslogs.nextval,10,sysdate,'日志条数='||v_ival,user);
  dbms_output.put_line('日志条数'||v_ival);
   
  --获取日志序号==11的日志时间和日志内容
  select dtm , content
  into v_dtm,v_content
  from syslogs
  where logid=14;
  
  insert into syslogs values (seq_syslogs.nextval,'10',sysdate,'v_dtm='||v_dtm||'v_content='||v_content,user);
  dbms_output.put_line('v_dtm='||v_dtm||'v_content='||v_content);
  --修改日志序号=11的日志记录人
  update syslogs
  set whois='PL/SQL.'||v_ival
  where logid = 14;
  
  --delete syslogs where logid=15;
  
  --分支流程控制
  if v_ival>50 then
    dbms_output.put_line('日志需要清理了~');
  else
    dbms_output.put_line('日志空间正常!');
  end if;
  
  --Loop循环
  v_ival :=0;
  loop
      exit when v_ival>3;
           --循环体
           v_ival := v_ival+1;
           dbms_output.put_line('loop循环:'||v_ival);
  end loop;
  
  --While循环
  v_ival := 0;
  while v_ival < 4 
  loop
     --循环体
     v_ival := v_ival+1;
     dbms_output.put_line('while循环:'||v_ival);
  end loop;
  
  --For循环
  for v_count in reverse 0..4 loop  --reverse递减
      dbms_output.put_line('for循环:'||v_count);   
  end loop;
  commit;--提交事物
end;

select * from syslogs;

 

 

《PL/SQL 异常处理》
--PL/SQL异常处理:oracle内置异常,oracle用户自定义异常
declare
   v_title logtypes.tid%type;
   v_ival number(9,2);
   --自定义的异常
   ex_lesszero exception ;
begin
  --select title into v_title
  --from logtypes     --;  too_many_rows
  --where tid = 30 ;  --NO_DATA_FOUND 异常
  
  v_ival := 12/-3;
  
  if v_ival < 0 then
    --直接抛出异常
    --raise ex_lesszero ;
    --使用系统存储过程抛出异常
    raise_application_error(/*错误代码,-20000~-20999*/-20003,/*异常描述*/'参数不能小于0!');
  end if;  
  commit;
exception
  --异常处理代码块 
  when no_data_found then
    dbms_output.put_line('发生系统异常:未找到有效的数据!');
  when too_many_rows then
    dbms_output.put_line('发生系统异常:查询结果超出预期的一行!');
  when ex_lesszero then
    dbms_output.put_line('发生用户异常:数值不能为负!'||sqlcode||'异常描述:'||sqlerrm);
  when others then --other例如Exception
    rollback;
    dbms_output.put_line('发生异常!'||sqlcode||'异常的描述:'||sqlerrm);
end;

 

 

《PL/SQL 游标的使用》

declare
    --游标的声明
    cursor myCur is 
           select tid,title from logtypes ;
    --定义接收游标中的数据变量
    v_tid   logtypes.tid%type;
    v_title logtypes.title%type;
    --通过记录来接受数据
    v_typercd myCur%rowtype ;
begin
    --打开游标
    open myCur ;
    --取游标中的数据
    loop
      --遍历游标中的下一行数据
      fetch myCur into v_tid,v_title ;
      --检测是否已经达到最后一行
      exit when myCur%notfound ;
      --输出游标中的数据
      dbms_output.put_line('读取tid='||v_tid||' title='||v_title);
    end loop;
    --关闭游标
    close myCur;
    
    --打开游标
    open myCur ;
    loop
      fetch myCur into v_typercd ;
      exi