【DB】Oracle学习笔记(5)

 

 

PLSQL

在客户端输出helloworld

set serveroutput on;//默认是off,设成on是让Oracle可以在客户端输出数据    

begin    

    dbms_output.put_line('helloworld');    

end;    

  / 

变量的赋值与输出

declare    

        v_name varchar2(20);//声明变量v_name变量的声明以v_开头    

    begin    

        v_name := 'myname';    

        dbms_output.put_line(v_name);    

    end;    

    /    

pl/sql对于异常的处理(除数为0)

declare    

        v_num number := 0;    

    begin    

        v_num := 2/v_num;    

        dbms_output.put_line(v_num);    

    exception    

        when others then    

        dbms_output.put_line('error');    

    end;    

    /  

基本变量类型

binary_integer:整数,主要用来计数而不是用来表示字段类型比number效率高    

    number:数字类型    

    char:定长字符串    

    varchar2:变长字符串    

    date:日期    

long:字符串,最长2GB    

boolean:布尔类型,可以取值true,false,null//最好给一初值  

变量的声明,使用 '%type'属性

declare    

        v_empno number(4);    

        v_empno2 emp.empno%type; // v_empno2的类型和emp表的empno字段的类型一样

        v_empno3 v_empno2%type;  // v_empno3的类型和变量v_empno2的类型一样 

    begin    

        dbms_output.put_line('Test');    

    end;    

    /    

//使用%type属性,可以使变量的声明根据表字段的类型自动变换,省去了维护的麻烦,而且%type属性,可以用于变量身上

table变量类型(数组)

declare

   //定义一种数组类型,内容的类型是emp.empno%type下标类型为binary_integer

   type type_table_emp_empno is table of emp.empno%type index by binary_integer;

   //声明一个数组变量

   v_empnos type_table_emp_empno;

begin

   v_empnos(0) := 7369;

    v_empnos(2) := 7839;

    v_empnos(-1) := 9999;

    dbms_output.put_line(v_empnos(-1));

end;

record变量类型(结构体)

declare

  type type_record_dept is record

      (

        deptno dept.deptno%type,

        dname dept.dname%type,

        loc dept.loc%type

      );

    v_temp type_record_dept;

begin

  v_temp.deptno := 50;

  v_temp.dname := 'aaa';

  v_temp.loc := 'bj';

  dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);

end;

使用%rowtype声明record变量

declare

  v_temp dept%rowtype;//结构体里的变量就是dept表的字段

begin

    v_temp.deptno := 50;

    v_temp.dname := 'aaa';

    v_temp.loc := 'bj';

   dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);

end;

select语句

必须且只能返回一条记录

declare

     v_name emp.ename%type;

     v_sal emp.sal%type;

begin

   select ename, sal into v_name, v_sal from emp where empno = 7369;

   dbms_output.put_line(v_name || ' ' || v_sal);

end;

declare

    v_emp emp%rowtype;

begin

  select * into v_emp from emp where empno = 7369;

  dbms_output.put_line(v_emp.ename);

end;

insert语句

declare

    v_deptno dept.deptno%type := 50;

    v_dname dept.dname%type := 'aaa';

    v_loc dept.loc%type := 'bj';

begin

  insert into dept2 values(v_deptno, v_dname, v_loc);

 commit;

end;

update语句

declare

   v_deptno emp2.deptno%type := 10;

   v_count number;

begin

  --update emp2 set sal = sal/2 where deptno = v_deptno;

  --select deptno into v_deptno from emp2 where empno = 7369;

  select count(*) into v_count from emp2;

  //sql是一个关键字,rowcount是sql的一个属性。

  dbms_output.put_line(sql%rowcount || '条记录被影响');

 commit;

end;

DDL语言,数据定义语言 

begin

     execute immediate 'create table t (nnn varchar2(20) default ''aaa'')';

end;

if语句

取出7369的薪水,如果<1200,输出'low',如果<2000输出'middle',否则'high'

declare

    v_sal emp.sal%type;

begin

   select sal into v_sal from emp

          where empno = 7369;

   if (v_sal < 1200) then

         dbms_output.put_line('low');

   elsif (v_sal < 2000) then

         dbms_output.put_line('middle');

   else

         dbms_output.put_line('high');

   end if;

end;

循环语句

declare

   i binary_integer := 1;

begin

   loop

      dbms_output.put_line(i);

      i := i + 1;

      exit when (i >= 11);

   end loop;

end;

---------

declare

   j binary_integer := 1;

begin

  while j < 11 loop

      dbms_output.put_line(j);

          j := j + 1;

  end loop;

end;

-----------

begin

    for k in 1..10 loop

       dbms_output.put_line(k);

    end loop;

    for k in reverse 1..10 loop

        dbms_output.put_line(k);

     end loop;

end;

错误处理

declare

   v_temp number(4);

begin

   select empno into v_temp from emp where empno = 10;

exception

   when too_many_rows then

      dbms_output.put_line('太多纪录了');

   when others then

      dbms_output.put_line('error');

end;

----------

declare

   v_temp number(4);

begin

   select empno into v_temp from emp where empno = 2222;

exception

   when no_data_found then

      dbms_output.put_line('没有数据');

end;

日志程序

    --创建事件日志表

create table errorlog

(

id number primary key,

errcode number,

errmsg varchar2(1024),

errdate date

)

--创建序列

create sequence seq_errorlog_id start with 1 increment by 1 

--实验

declare

   v_deptno dept.deptno%type := 10;

   v_errcode number;

   v_errmsg varchar2(1024);

begin

   delete from dept where deptno = v_deptno;

 commit;

exception

   when others then

      rollback;

         v_errcode := SQLCODE;

         v_errmsg := SQLERRM;

      insert into errorlog values (seq_errorlog_id.nextval, v_errcode, v_errmsg, sysdate);

      commit;

end;

 推荐一个淘宝旗下网站,每天9块9包邮还返利。现在登录还有9元支付宝红包送你哦!http://invite.etao.com/67121619402a047e.htm 

 

你可能感兴趣的:(oracle,学习)