从O r a c l e 6 . 0版开始,P L / S Q L就驻留在数据库服务器端,同时,该服务器也是P L / S Q L引擎的默认位置。由于数据库服务器可以处理S Q L语句,所以S Q L语句和P L / S Q L块都可以送到该服务器进行处理。一个客户应用,不管是用O r a c l e开发工具实现的或使用其他开发工具编制的,都可以向数据库服务器提交S Q L语句和P L / S Q L块。SQL *Plus就是一个这种客户应用的案例,该程序可以在S Q L提示符下接收交互输入的S Q L语句和P L / S Q L命令并将其送往服务器执行。例如,我们可以假设在SQL *Plus与服务器建立了连接的情况下输入下列的SQL,P L / S Q L命令:
SQL_PLSQL.sql
SQL> CREATE OR REPLACE PROCEDURE ServerProcedure AS
2 BEGIN
3 NULL;
4 END ServerProcedure;
5 /
Procedure created.
SQL> DECLARE
2 v_StudentRecord students%ROWTYPE;
3 v_Counter BINARY_INTEGER;
4 BEGIN
5 v_Counter := 7;
6
7 SELECT *
8 INTO v_StudentRecord
9 FROM students
10 WHERE id = 10001;
11
12 ServerProcedure;
13
14 END;
15 /
PL/SQL procedure successfully completed.
SQL> UPDATE classes
2 SET max_students = 70
3 WHERE department = 'HIS'
4 AND course = 101;
1 row updated.
图1演示了在服务器端的P L / S Q L引擎对P L / S Q L块的处理过程。客户应用可以向服务器提
交P L / S Q L块(该块可以带有过程和包括调用服务器端存储过程的S Q L语句),以及单独的S Q L语句。如图所示, P L / S Q L块和S Q L语句通过网络送往服务器。一旦服务器收到了这些内容, S Q L语句将直接进入服务器内含的S Q L语句执行器,而P L / S Q L块则送往P L / S Q L引擎进行语法分析。在该块的运行期间, P L / S Q L引擎负责执行过程语句(如赋值语句和存储过程调用)。对于该块中出现的S Q L语句(如S E L E C T语句等),P L / S Q L引擎将它们送往S Q L语句执行器执行。

客户端的P L / S Q L
除了在服务器端的P L / S Q L引擎外,几种O r a c l e开发工具也带有P L / S Q L引擎。由于这些开发工具是运行在客户端的,所以它们的P L / S Q L引擎也可以运行在客户端。这样一来,借助于客户端的P L / S Q L支持,P L / S Q L块中的过程语句就可以在本地运行,而没有必要送到服务器端。例如开发工具Oracle Forms(该工具是Oracle Developer的一部分)自身带有P L / S Q L引擎;在O r a c l e D e v e l o p e r工具包中,如Oracle Reports也带有P L / S Q L引擎。需要指出的是这种引擎与P L / S Q L服务器端的引擎有所不同。P L / S Q L块只能出现在客户端应用中,并且该块必须用开发工具来编制。假设一个Oracle Forms应用包括了触发器和过程,这些语句都在客户端执行。只有该程序中的S Q L语句和调用服务器端存储子程序的语句被送往服务器进行处理。如图2 所示,客户端的P L / S Q L引擎可以处理过程语句。
与服务器端的P L / S Q L一样,应用程序提交的单独的S Q L语句(如U P D AT E语句)直接通过网络送往服务器端的S Q L语句执行器。不同的是, P L / S Q L块是在客户端直接处理。任何过程语句(如赋值语句)的处理都不会引起网络传输。P L / S Q L块中的S Q L语句要提交给S Q L语句执行器,对服务器端的存储子程序的调用则是送到服务器端的P L / S Q L引擎执行。


再补一图:

Because PL/SQL is used both in the database (for stored procedures and database triggers) and in the application code (to implement logic within a form, for example), you can leverage the same programming language for both client-side and server-side development. You can even move programs from one component of the configuration to another.For example, you might decide that a function which was originally coded for a single screen could be shared by all of the modules in an application. To make this happen, you simply move that function from the client-side screen component to the server-side database environment. You have to change neither the PL/SQL code nor any of the programs that call that function.
0 comments:
Post a Comment