ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 所教授Oracle课程总结(4)——PL/SQL

所教授Oracle课程总结(4)——PL/SQL

原创 Linux操作系统 作者:violetluna 时间:2009-04-08 22:07:58 0 删除 编辑

PL/SQL作为Oracle中结合了过程语言(Procedural Language)与结构化查询语言(Struted Query Language)的一种扩展语言。我们都知道SQL只是查询语言,很多复杂的逻辑并不能通过SQL反应出来,于是很多数据库有了专门针对复杂逻辑编程的扩展语言,比如SQL Server,有过程语言,而Oracle的PL/SQL,就是专门用来编写过程代码的扩展语言。

我们在Oracle中可以使用PL/SQL编写过程代码,包括匿名过程和子程序,而子程序又包括存储过程,存储函数以及触发器。

那么这里我们针对过程语言进行一系列的简述。

在介绍PL/SQL之前,我们先来看一看,Oracle编写PL/SQL的工具。

在Oracle的文件组中,有一个Application Development,子菜单中有一个名叫SQL PLUS的工具,那么这个工具就是Oracle中用来写PL/SQL,当然也可以写SQL语句的工具。

如图所示

打开之后的界面如下

 

OK,这里的User Name就是你的Oracle的登录账号,Password则是你的登录密码。Host String是之前配置的本地Net服务名称,也就是说之前配置的需要连接的服务器在本地的别名。

输入之后登录,当然这里也可以直接在UserName中输入
/[@host string][as normal|sysdba|sysoper]的方式登录,即将登录信息直接一次性输入到userName中。

登录成功之后,就可以看到SQL命令输入窗口,也就可以开始写PL/SQL代码了。

那么这里开始介绍PL/SQL。


首先是匿名过程

匿名过程包括变量定义,可执行代码以及异常处理三个部分。

如:
DECLARE
     --定义的变量列表
BEGIN
     --可以执行的代码
EXCEPTION
      --异常处理代码
END;
/

我们从最简单的过程开始写起

DECLARE
BEGIN
     DBMS_OUTPUT.put_line('Hello,world');
END;
/

这段代码会输出一句话Hello,world,显而易见,这里的DBMS_OUTPUT.put_line()就是用来输出的。但是当我们真的执行代码的时候,却发现并不会输出任何信息,顶多提示你procedure successful completed。

可以看到过程成功运行,但是却没有看到输出内容。这是因为我们还忘记了做一个前置的工作,我们需要设置输出是可见的,代码如下:
set serveroutput on;
然后我们再执行一次上面的过程代码就可以看到输出了。
上面是一个包含了最简单格式的过程代码,当然了,这个过程还可以写的更简单
BEGIN
     DBMS_OUTPUT.put_line('hello, world');
END;
/
同样输出hello,world。
那么跟复杂一点的过程该如何写呢?

我们接下来先定义一个变量
DECLARE
    l_empno number(8);
BEGIN
    SELECT empno INTO l_empno FROM emp WHERE ename = 'SCOTT';
    DBMS_OUTPUT.put_line(l_empno);
END;
/
这段代码之中,在DECLARE与BEGIN之间是定义变量区域,这里定义了一个number类型的变量l_empno,长度为8。

这里援引《Oracle 9i&10g编程艺术》一书中给出的建议,全局变量用"g_",参数用"p_",局部变量用"l_"来开头,便于与表中字段名区分。

全局变量名如后面要讲的包结构中的全局变量。
参数名在后面的存储过程与存储函数中也会提及。
局部变量名则是这里匿名过程中DECLARE与BEGIN中间定义的变量。

当然,这个仅仅是建议,每个人都有自己的编程风格。

OK,在这里我们可以看到,匿名过程中定义变量的方式是:
变量名 数据类型[(长度)][:=|DEFAULT 默认值];
这里的":=|DEFAULT"表示在定义变量的时候可以指定默认值,有两种指定默认值的方式。

上面代码中第二个新的东西是:
SELECT empno INTO l_empno FROM emp WHERE ename = 'SCOTT';
这句话的意思是查询emp表中ename为"SCOTT"的记录的empno字段值,并且将这个值赋给局部变量l_empno。

也就是说我们可以通过SQL代码查询表中的数据并且使用局部变量来承接。

可以定义变量之后就可以做很多SQL做不了的事情了。

比如说,要查找出emp表中薪资超过1200的人有几个的代码如下
DECLARE
    l_count number(8);
BEGIN
    SELECT count(*) INTO l_count FROM emp WHERE sal > 1200;
    DBMS_OUTPUT.put_line('薪资超过1200的员工有' || l_count || '人');
END;
/
我们定义一个局部变量l_count接收取出来的薪资大于1200的员工人数,这里的count(*)是一个聚合函数,得到查询出来的结果的记录条数。代码中的"||"符号是Oracle中的连接运算符,相当于java中的"+"。

不过我们不能永远只取出来薪资超过1200的人数,毕竟社会发展了,也通货膨胀了,薪资太低人都活不下去了,所以我们在设置查询条件的时候最好是能够动态的设置。下面的例子可以输入一个值,动态的设置查询条件。
DECLARE
    l_count number(8);
    l_sal number(8);
BEGIN
    l_sal := &sal;
    SELECT count(*) INTO l_count FROM emp WHERE sal > l_sal;
    DBMS_OUTPUT.put_line('薪资超过' || l_sal || '的员工有' || l_count || '人');
END;
/
在可执行代码区域第一行代码"l_sal := &sal"中的"&"表示可以接收输入的数据,然后通过赋值运算符":="赋值给局部变量l_sal。

那么这个匿名过程在运行过程中会接收来自用户输入的一个值赋值给自己的局部变量,而查询语句也可以动态的去更改了。

但是我们有时候可能会修改emp表的表结构,比如将sal字段修改为number(8,2)即有2个小数点的浮点型,这个时候我们的局部变量l_sal再定义为number(8)就不太合适了。

在Oracle中,通过属性类型来解决这类问题。
属性类型即是在设置变量类型的时候绑定类型到表的列上甚至可以得到一条记录类型,属性类型有2个,分别是:
1. 列属性类型%type,用来绑定表的具体列的数据类型,写法是"表名.列名%type"。
2. 行属性类型%rowtype,用来绑定一条记录的数据,写法是"表名%rowtype"。

比如,我们可以这么写:
DECLARE
    l_count number(8);
    l_sal emp.sal%type;
BEGIN
    l_sal := &sal;
    SELECT count(*) INTO l_count FROM emp WHERE sal > l_sal;
    DBMS_OUTPUT.put_line('薪资超过' || l_sal || '的员工有' || l_count || '人');
END;
/
那么这里用来动态改变查询条件的局部变量l_sal就与emp表的sal字段拥有了相同的数据类型,而且如果emp表的sal字段数据类型发生改变,l_sal的数据类型也会发生改变。

行属性类型举例:
DECLARE
    l_empno emp.empno%type;
    l_row emp%rowtype;
BEGIN
    l_empno := &empno;
    SELECT * INTO l_row FROM emp WHERE empno = l_empno;
    DBMS_OUTPUT.put_line('员工编号为' || l_empno || '的员工姓名是' || l_row.ename);
END;
/

PL/SQL内容比较多,这一篇就到这里,下一篇谈一谈PL/SQL中的逻辑处理代码

Snap1.jpg

Snap3.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8061238/viewspace-586808/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-29

  • 博文量
    7
  • 访问量
    8234