0
点赞
收藏
分享

微信扫一扫

Oracle数据库PL/SQL学习笔记(一)



Oracel数据库的基本管理:

<span style="font-size:18px;">create tablespace test datafile 'E:\app\Administrator\oradata\orcl\test.dbf'             --注意:名称test不要带引号
size 100M
autoextend on next 2M maxsize 2048M
extent management local; --默认是本地管理,本地管理表空间与字典管理(dictionary)表空间相比大大提高了管理效率和数据库性能


alter tablespace test rename to test2; --改变表空间的名称

create user wanli identified by 123456
default tablespace test
ACCOUNT UNLOCK; --解锁用户


ALTER USER username ACCOUNT UNLOCK; --解锁用户


grant connect,resource to wanli; --普通用户
grant DEBUG CONNECT SESSION to wanli; --赋予用户断点测试的权限


grant dba to wanli; --DBA管理用户</span>







sql语句的分类:

DDL--数据定义语言

    create,alter,drop,rename,truncate,comment





  delete和truncate关键字的区别:

    TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:

           二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 

            速度快,且使用的系统和事务日志资源少。



DML--数据操作语言

     select,insert,update,delete和merge  



merge关键字:


     merge是insert和update的合并。连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。

          这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。



DCL--数据控制语言

     grant和revoke     授权和撤销权限

   

TCL--事务控制语言

     commit,rollback和savepoint




pl/sql不区分大小写

但是通常会对命令单纯使用大写形式,而对变量、列名和存储过程调用使用小写形式。





pl/sql支持2中类型的程序:

1.匿名块程序,支持批脚本。

2.命名块程序,提供存储编程单元。




匿名程序块结构:必须有执行部分,最简单的是null

语法:

  declare

      声明部分

  begin

      执行部分

   [exception

        异常处理部分

    ]

  end;

声明部分:包含变量定义和声明,用户定义的pl/sql类型定义,游标定义、引用游标定义

和局部函数或过程的定义。


执行部分:包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的pl/sql匿名块,或者

是对局部或存储pl/sql命名块的调用。


异常部分:包含错误处理短语,该短语可以像执行部分一样使用所有项。



变量

包含标量和复合变量

标量变量:只保存一个指。

复合变量:可保存多个值。



赋值:

Oracle赋值使用  :=


nvl()函数:

  nvl(my_var,false)   如果my_var为null,则设置my_var的值为false;



基本控制结构:

检查逻辑添加和控制分支程序执行,还有一个是迭代条件直到添加满足或被命令退出。

1.条件结构

  1》  if 条件1 then

      null;

   else

      null;

    end if;


  2》多条件判断

    if-then-elsif-then-else



2.case语句

   case搜索语句:

      case  true

           when 条件1 then 

                执行1;

           when 条件2 then

                执行2

           when 条件3 then

                执行3

           else

                默认执行

       end case;



3.迭代结构

(1)

for循环包括数值for循环和游标for循环。通过使用显示的continue或exit语句分别跳过迭代或强制从循环中提早退出

for循环隐式管理其开始和结束(没有loop和end loop),不支持引用游标(refcursor),迭代引用游标只能使用显示循环结构,如简单循环和while循环。



数值for循环:  starting_number .. ending_number  开始值和结束值必须是整数,中间是两个".."

begin

   for i in 1..10 Loop

      dbms_output.put_line('The index value is ['||i||']');

   end loop;

end;



游标for循环:

 for i in (游标名|sql语句) loop

    执行语句;

 end loop;

如果用游标名调用,就是显示游标。如果用sql语句,就是使用隐式游标。

游标for循环中索引变量不是interger数字,它是游标返回的记录结构的引用。

可以通过点号将游标索引变量和列名组合。



--隐式游标for循环(i相当于一条记录,能直接通过 i.字段名获得对应的字段值)

begin

     for i in (select * from SCOTT.EMP t) loop

        dbms_output.put_line('The name is ['||i.ename||']');

     end loop;

end; 





(2)简单循环

   是显示结构,要求用户管理循环索引和退出条件。一般与局部定义的游标和引用游标(ref cursor)一起使用。

   游标的几个特性:%found,%notfound,%isopen和%rowcount

declare

  emp_name SCOTT.EMP.ENAME%type;--根据表的指定字段的数据类型定义变量

   cursor cur is select t.ename from SCOTT.EMP t;

begin

   open cur;

   loop

      fetch cur into emp_name;

          dbms_output.put_line('The name is ['||emp_name||']'); 

       exit when cur%notfound;

   end loop;

   close cur;

end; 



(3)while循环

 要先检查循环进入条件

declare 

   emp_name SCOTT.EMP.ENAME%type;

   cursor cur is select t.ename from SCOTT.EMP t;

begin

    open cur;

    while cur%isopen loop

        fetch cur into emp_name;

        if cur%notfound then

           close cur;   --关闭游标,不能通过while循环的条件判断,自然结束循环

        end if;

         dbms_output.put_line('The name is ['||emp_name||']'); 

    end loop;

end;



PL/SQL存储编程单元:

  函数,过程,包和触发器,存储对象类型

在Oracle中,

  函数、过程、包和对象都存在同一个命名空间中。

  

  触发器存储在另一个命名空间。





函数

基本结构:

create or replace function 函数名

  (参数名  数据类型)

    return 返回结果类型

declare

   变量定义

begin

   执行sql语句

  return 结果值;

exception

   异常处理

end;



因为函数返回的是sql数据类型,所以可以左右pl/sql赋值中的右操作数,也可以直接从sql语句中调用、

如:

  select greatest(12,34) from dual;  --在sql中调用greatest函数



declare

   var2 number(10);

begin 

   var2 := greatest(11,10,50,69);  --在

   dbms_output.put_line('The name is ['||var2||']'); 

end;



在命令窗口,可以使用call  函数  给会话级绑定变量赋值

SQL> variable var3 varchar2(30);

SQL>  call join_strings('hello','word') into :var3;

SQL>  select :var3 from dual;





--注意,所有的参数都要声明后再使用

create or replace function getName(userid number) return varchar2 is

  name_value varchar2(30);

  id number(10);

begin

  id := userid;

  select t.name  into name_value from tb_user t where t.userid = id;

  return(name_value);

end getName;



存储过程:

不能作为右操作数,也不能用于sql语句。

语法:

  create procedure 存储过程名

     [参数名   in|out类型   数据类型]  is

  begin

     执行sql语句

    [异常处理]

  end;


事务控制和异常捕捉:

begin

   savepoint new_member;--设置回滚点

   

    insert into tb_user t values(51,'wanli',22,'123');

    insert into tb_user t values(51,'wanli',22,'123');    

    dbms_output.put_line('both succeeded');

    

    commit;  --提交

    

    exception

       when others then   --when others 能够截取所有的异常,一般放在异常处理的最后。

          rollback to new_member;  --回滚到设置的回滚点

          dbms_output.put_line(Sqlerrm);--输出错误信息

end;



触发器:

正因为触发器实在某个时刻运行,因此不能在触发器中使用sql dcl语句:

 savepoint,rollback,或commit。



Oracle中的特殊字符:

:=            赋值

:变量名       指定标识符为会话级变量

&变量名       指定标识符为替换变量(可接受输入值)

=             比较运算符



日期格式的赋值:

字符串格式化为时间,最好使用to_date();

不支持隐式转化。即不能直接给  字符串格式的字符给    日期类型的变量。



relative_date := '01-jun-07';



date_1 := to_date('20140912','yyyy-mm-dd');



date_2 := cast('01-jun-07','mon-dd-yy') XXXXX  ----经验证,已不能使用。



extract()内置函数可以从date值中获取数值型年月日。



复合数据类型:

主要有两种复合数据类型:记录和集合。



记录,也称结构体,包含相关元素的集合。相当于java的bean,或者类。

集合,事物集,相当于java的集合。



定义记录的语法:

 type 记录名 is record

   (变量1   数据类型1,

    变量2   数据类型2,

  )

例:

declare

 type demo_record_type is record(

   id number default 1,

   value varchar2(10) := 'one'

 );

  demo demo_record_type;

begin

  dbms_output.put_line('['||demo.id||']['||demo.value||']');

end;  



集合:

  是数组和列表。

1.varray数据类型   --类似java中的数组


--自定义数组(varray)

declare

   type number_varray is varray(10) of number;   --类型number_varray是包含10个数字的number类型的varray数组

   list number_varray := number_varray(1,2,3,4,5,6,7,8,null,null);    --变量list的类型是number_varray,并初始化

begin

  for i in 1..list.limit loop            --limit返回最大尺寸

     dbms_output.put('['||list(i)||']');

  end loop;

  dbms_output.new_line;

end;





--嵌套表数据类型(索引列表或java类),list集合,  特点:有序,密集填充 ,大小不固定

declare

   type number_table is table of number;    --类型是table,包含的是number,不用声明长度    

   list number_table := number_table(1,90,3,4,5,6,7,8);

begin

    list.delete(2);    --删除第二个元素,但不删除已分配的空间

     dbms_output.put_line(list.count);

     dbms_output.put_line(list.limit);  --table没有limit属性,只有varray数组才有limit属性

    for i in 1..list.count loop     

       if list.exists(i) then

           dbms_output.put('['||list(i)||']');

       end if;

    end loop;

    dbms_output.new_line;  

end;





--联合数组数据类型   (类似set集合)               特点:无序 稀疏,大小不固定

--和嵌套表定义非常相似,主要不同点:指定了如何进行索引  index by Pls_Integer 或者 index by varchar2(10)

declare

  type number_table is table of number index by Pls_Integer;

  list number_table;

begin

   for i in 1..8 Loop

      dbms_output.put_line('The index value is ['||i||']');

     list(i):= i;

   end loop;

    dbms_output.put_line(list.count);

   list.delete(2);   --和varray和嵌套表中不同,删除元素时也会删除已分配的空间

    dbms_output.put_line(list.count);

    for i in 1..list.count loop      --由于count变小,所有最后一个值8查不到

      if list.exists(i) then       

       dbms_output.put('['||list(i)||']');

      end if;

    end loop;

    dbms_output.new_line;

end;




游标

类型:隐式游标和显示游标


显示游标:在声明块中定义的游标,都属于显示游标。

隐式游标:任何执行块或异常块中的DML语句都是隐式游标。(包括insert,update,delete)


--引用游标

--弱类型的引用游标没有返回类型,强类型的引用游标有返回类型

--主要作用:  实现在程序间传递结果集的功能,在同一过程中使用引用游标没有意义。

declare

 type weakly_typed is ref cursor;

 quick weakly_typed;

 v_a1 varchar2(30);

 v_b1 number(10);

begin

   open quick for

     select t.name,t.age from tb_user t;

/*    loop 

       fetch quick into v_a1,v_b1;

        dbms_output.put_line(v_a1||'今年'||v_b1||'岁');

       exit when quick%notfound;

    end loop;*/

end;





举报

相关推荐

0 条评论