第一部分:PL/SQL块
Oracle PL/SQL在2011年已经度过了22个春秋,我知道这些是因为我查看了Oracle PL/SQL所出版的用户指南;这本用户指南是在1989年为了PL/SQL1.0版本而出版的。当时我在Oracle公司工作,建设曾经在美国Oracle应用的自动化销售工具:sales force。当时我已经在SQL的3.0版本里应用了PL/SQL,但是随着Oracle6的发行,PL/SQL随之成为了独立的语言开发应用程序。
三年后,我写了我的第一本关于PL/SQL的书,从那以后我努力学习PL/SQL,写了许许多多的PL/SQL代码,并且写出了在同类数据库开发语言中最好的程序。当然,不仅仅是我。从Oracle PL/SQL发行以来,全世界成千上万的开发者在此基础上已经开发了数量庞大的应用程序。
最令人欣慰的是,这种对PL/SQL新学者良好的影响保持着一个稳定的趋势。事实上,随着印度、中国以及其他技术强国的出现,我已经看到了在学习和应用PL/SQL的崭新一代。
为了帮助新学者能够更好的学好这门语言,Oracle杂志委托我写一系列关于PL/SQL的文章,如大家所见,这是第一篇。即使你是PL/SQL开发者的老手,你也可以很方便的在这一系列文章中复习关于PL/SQL基础上的一些知识。
或许你是PL/SQL的新手,或许你已经有一些开发经验并对SQL非常熟悉,但是我的目的始终如一,就是为了让你们尽快的掌握这门语言。 什么是PL/SQL?
为了回答这个问题,你必须记住,你所访问的每个网站,你所运行的每个程序,都是由堆栈构建的。在堆栈的顶端是用户直接接触的显示层,比如显示屏或者互动装置。在堆栈的低端是与硬件交流的机器语言。
而在这个堆栈的中间你会发现一些便于我们存储或者处理大量复杂数据的数据库和软件。如果你要写在Oracle数据库上的应用程序,你必须运行SQL在数据库上检索和修改数据。然而SQL不能实现所有我们在应用程序中需要的业务逻辑和最终用户功能。所以,PL/SQL应运而生。
PL/SQL代表Procedural Language/Structured Query Language。PL/SQL提供了一系列用块来组织的程序命令,大大的补充和扩展了SQL.
当然你可以在不使用PL/SQL的情况下在SQL和Oracle数据库上创建应用程序。不过,利用PL/SQL去运行数据库的特殊操作,尤其是SQL语句的运行,能够拥有很多的优势。例如与SQL更好的融合、通过减少网络流量提高运行效率、更好的移植性。因此,许多应用程序的代码能够同时支持SQL语句和PL/SQL块的执行,以求最大化的提高性能,提高这些应用程序的可维护性。
建立PL/SQL程序块
PL/SQL是一种块状结构语言。一个PL/SQL块可由4个关键词来定义DECLARE,BEGIN,EXCEPTION,END。每个块由三个部分组成:
1·声明:用来声明在块中所用到的变量、常量、和其他代码元素。 2·运行:当块运行时所要运行的语句。
3·异常捕捉:一种用来捕捉各种异常的特殊结构模块。
在这三个部分中,只有运行部分是必须的。在一个块中,你不必要去声明或者捕捉任何东西。
每个块自身就是一个可执行的语句,所以你可以在块中嵌套另外一个块。 下面是一些例子:
·在“Hello World!”中包含了一个叫DBMS_OUTPUT.PUT_LINE的程序用来在显示器上显示文本: BEGIN
DBMS_OUTPUT.put_line ('Hello World!'); END;
用来命名块的函数和程序将会在接下来关于包的文章中有更详细的阐述。 简单来说,包是多个函数和程序的集合。Oracle提供或者内置了许多的PL/SQL包。
接下来的这个例子用VARCHAR2声明了一个最大能包含100个字符的字符串用来存储”hello world!”。DBMS_OUTPUT.PUT_LINE接下来会接收一个变量而不是上例中的字符串。
DECLARE l_message
VARCHAR2 (100) := 'Hello World!'; BEGIN
DBMS_OUTPUT.put_line (l_message); END;
注意在上例中我将变量命名为l_message。我将会用l_前缀来命名局部变量—一种在块内定义的变量,用g_前缀来命名全局变量—在包内定义的变量。
·接下来的这个例子添加了一个用来捕捉异常的exception的部分,异常由SQLERRM函数返回(由oracle提供)。
DECLARE l_message
VARCHAR2 (100) := 'Hello World!'; BEGIN
DBMS_OUTPUT.put_line (l_message); EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.put_line (SQLERRM); END;
·接下来的例子显示了PL/SQL在嵌套块方面的能力,并且显示了连接运算符||能够连接不同字符串的作用。
DECLARE l_message
VARCHAR2 (100) := 'Hello'; BEGIN
DECLARE
l_message2VARCHAR2 (100) := l_message|| ' World!'; BEGIN
DBMS_OUTPUT.put_line (l_message2); END; EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.put_line
(DBMS_UTILITY.format_error_stack); END;
运行PL/SQL模块
当你写完PL/SQL块的代码后,你就可以运行它。有许多不同运行PL/SQL代码的工具。最基本的就是SQL*Plus,它是一种运行SQL语句和PL/SQL块的命令行式的借口。图一显示了”hello world!”程序在SQL*Plus中的运行。
我要做的第一件事就是通过通过SQL*Plus连接到数据库将服务器输出打开,以便于调用DBMS_OUTPUT.PUT_LINE来将结果显示在屏幕上。接着我将代码输入,然后用/表示我将运行这个块。
SQL*Plus接着会运行这个块然后显示“hello world!”。SQL*Plus是一种由Oracle提供的运行SQL语句和PL/SQL块的环境。鉴于一些开发者继续单独依靠SQL*Plus,大多数人使用了集成的开发环境(IDE)。在IDE中最流行的是
? ? ?
Oracle SQL Developer, from Oracle
Toad and SQL Navigator, from Quest Software PL/SQL Developer, from Allround Automations