plsql开始使用plsql


备注

本节概述了plsql是什么,以及开发人员可能想要使用它的原因。

它还应该提到plsql中的任何大型主题,并链接到相关主题。由于plsql的文档是新的,您可能需要创建这些相关主题的初始版本。

关于PLSQL

PL / SQL代表SQL的过程语言扩展。 PL / SQL仅作为其他软件产品中的“启用技术”提供;它不作为独立语言存在。您可以在Oracle关系数据库,Oracle Server和客户端应用程序开发工具(如Oracle Forms)中使用PL / SQL。以下是您可能使用PL / SQL的一些方法:

  1. 构建存储过程。 。
  2. 创建数据库触发器。
  3. 在Oracle Forms应用程序中实现客户端逻辑。
  4. 将万维网主页链接到Oracle数据库。

创建一个表

下面我们将创建一个包含3列的表。
必须填充列Id ,因此我们将其定义为NOT NULL
Contract 列上,我们还添加一个检查,以便允许的唯一值是“Y”或“N”。如果在插入期间未指定插入完成且此列未指定,则默认插入“N”。

CREATE TABLE Employee (
        Id            NUMBER NOT NULL,
        Name          VARCHAR2(60),
        Contract      CHAR DEFAULT 'N' NOT NULL,
        ---
        CONSTRAINT p_Id PRIMARY KEY(Id),
        CONSTRAINT c_Contract CHECK (Contract IN('Y','N'))
);
 

创建或替换视图

在这个例子中,我们将创建一个视图。
视图主要用作从多个表中获取数据的简单方法。

例1:
查看与一张桌子上的选择。

CREATE OR REPLACE VIEW LessonView AS
       SELECT     L.*
       FROM       Lesson L;
 

例2:
查看多个表上的选择。

CREATE OR REPLACE VIEW ClassRoomLessonView AS
       SELECT     C.Id, 
                  C.Name, 
                  L.Subject, 
                  L.Teacher 
       FROM       ClassRoom C, 
                  Lesson L 
       WHERE      C.Id = L.ClassRoomId;
 

要在查询中调用此视图,可以使用select语句。

SELECT * FROM LessonView;
SELECT * FROM ClassRoomLessonView;
 

PLSQL的定义

PL / SQL(过程语言/结构化查询语言)是Oracle Corporation对SQL和Oracle关系数据库的过程扩展。 PL / SQL在Oracle数据库(自版本7),TimesTen内存数据库(自版本11.2.1)和IBM DB2(自版本9.7)开始提供。

PL / SQL中的基本单元称为块,它由三部分组成:声明部分,可执行部分和异常构建部分。

DECLARE
   <declarations section>
BEGIN
   <executable command(s)>
EXCEPTION
   <exception handling>
END;
 

声明 - 此部分以关键字DECLARE开头。它是一个可选部分,定义了程序中使用的所有变量,游标,子程序和其他元素。

可执行命令 - 此部分包含在关键字BEGIN和END之间,它是必需部分。它由程序的可执行PL / SQL语句组成。它应该至少有一个可执行的代码行,它可能只是一个NULL命令,表示不应该执行任何操作。

异常处理 - 此部分以关键字EXCEPTION开头。此部分也是可选的,包含处理程序错误的异常。

每个PL / SQL语句都以分号(;)结尾。 PL / SQL块可以使用BEGIN和END嵌套在其他PL / SQL块中。

在匿名块中,只需要块的可执行部分,其他部分不是必需的。下面是简单匿名代码的示例,除了执行没有错误报告之外,它不执行任何操作。

BEGIN
    NULL;
END;
/ 
 

缺少可执行的指令会导致错误,因为PL / SQL不支持空块。例如,以下代码的执行会导致错误:

BEGIN
END;
/ 
 

应用程序将引发错误:

END;
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
 

符号“*”在关键字“END”下方的行中表示以此块结尾的块为空或构造不良。每个执行块都需要执行指令,即使它什么都不做,就像在我们的示例中一样。

%TYPE和%ROWTYPE之间的差异。

%TYPE :用于声明与指定表的列类型相同的字段。

DECLARE
        vEmployeeName   Employee.Name%TYPE;
BEGIN
        SELECT Name 
        INTO   vEmployeeName
        FROM   Employee
        WHERE  RowNum = 1;
        
        DBMS_OUTPUT.PUT_LINE(vEmployeeName);
END;
/
 

%ROWTYPE:用于声明与指定表,视图或光标(=多列)中找到的类型相同的记录。

DECLARE
        rEmployee     Employee%ROWTYPE;
BEGIN
        rEmployee.Name := 'Matt';
        rEmployee.Age := 31;
        
        DBMS_OUTPUT.PUT_LINE(rEmployee.Name);
        DBMS_OUTPUT.PUT_LINE(rEmployee.Age);
END;
/
 

你好,世界

set serveroutput on

DECLARE
   message constant varchar2(32767):= 'Hello, World!';
BEGIN
   dbms_output.put_line(message);
END;
/
 

SQL * Plus和SQL Developer客户端需要命令set serveroutput on 才能启用dbms_output 的输出。没有命令,不显示任何内容。

end; line表示匿名PL / SQL块的结尾。要从SQL命令行运行代码,您可能需要在代码的最后一行之后的第一个空白行的开头键入/ 。在SQL提示符下执行上述代码时,会产生以下结果:

Hello, World!

PL/SQL procedure successfully completed.