Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


声明

📄字数 1.6K
👁️阅读量 加载中...

声明部分(DECLARE)

(可选部分)此部分是以关键字 DECLARE 开头,定义了程序中要使用的所有变量、类型、游标、异常、子程序和其他元素;必须先声明对象,然后才能引用;声明可以出现在任何块、子程序或程序包的声明部分中;变量用于存储数据,游标用于从数据库中提取数据等。

语法格式

( CursorDef::=, ExceptionDef::=, TypeDefStmt::= )

参数说明

  • varname:普通变量名。
  • CONSTANT:一个可选关键字,用来指定该变量是否为常量。
  • TypeName:指定变量的数据类型。
  • def_val:可指定变量的初始默认值。
  • PRAGMA EXCEPTION_INIT (errname, integer):异常初始化,它将用户定义的异常与特定的错误代码关联起来;errname为异常名称,integer为错误代码。

NOT NULL 约束

可以对变量或常量的标量(或复合变量)施加 NOT NULL 约束。NOT NULL 约束可防止为对象分配空值。
标量变量声明可以显式指定 NOT NULL,当指定了 NOT NULL 时必须为其分配初始值(因为标量变量的默认初始值为 NULL)。

声明变量

变量声明必须指定变量的名称和数据类型。对于大多数数据类型,变量声明也可以指定初始值。

变量名称必须是有效的用户自定义标识符。数据类型可以是任何 PL/SQL 数据类型,包括了所有的 SQL 数据类型。数据类型可以是标量类型和复合类型。

声明常量

常量用于保存不变的值。

声明变量中的信息也适用于常量声明,但是常量声明包括两个要求:关键字 CONSTANT 和常量的初始值(常量的初始值是其永久值)。

变量和常量的初始值

在变量声明中,初始值是可选的,除非指定了 NOT NULL 约束。在常量声明中,必须有初始值。

如果声明在块或子程序中,则每次执行块或子程序时,都会将初始值分配给变量或常量。如果声明在包的包头定义中,则将初始值分配给每个会话的变量或常量(无论变量或常量是公共变量还是私有变量)。

要指定初始值,请使用赋值运算符(:=)或关键字 DEFAULT,后面为表达式。该表达式可以包含先前声明的常量和先前初始化的变量。如果没有为变量指定初始值,请在使用变量之前为其分配值。

使用 %TYPE 声明

%TYPE 可以声明与先前声明的变量或列具有相同数据类型的对象(无需知道该类型是什么)。

使用 %TYPE 特性的优点如下:

  • 所引用的数据库列的数据类型可以是未知的。

  • 变量类型会跟随对应列的数据类型而改变。

引用项将继承被引用项的以下内容:

  • 数据类型和大小。

  • 约束(除非引用的是列)。

引用项不继承引用项的初始值。因此,如果引用项指定或继承了 NOT NULL 约束,则必须为其指定一个初始值。

关于 %ROWTYPE 使用可参考属性类型相关介绍。

示例

  • 示例1

    PL/SQL各类声明演示。

    sql
    SQL> DECLARE
             id INT := 2; --标量类型变量声明时赋值
             str CONSTANT VARCHAR NOT NULL DEFAULT 'strings'; --常量指定非空约束及默认值
             CURSOR cur IS SELECT * FROM user_tables;  --游标定义
             TYPE type_varray_int IS VARRAY(5) OF INTEGER; --复合类型定义
             sid id%TYPE :=id; --使用%TYPE声明为id相同类型,赋值也可使用已声明的变量
             no_null EXCEPTION; --声明异常
             PRAGMA EXCEPTION_INIT(no_null,16005); --异常与错误码绑定
         BEGIN
             NULL;
         END;
         /
  • 示例2

    非匿名块中的声明可不使用DECLARE关键字。

    sql
    SQL> CREATE OR REPLACE PROCEDURE proc_declare IS
          str VARCHAR :='abc';
          BEGIN
              DBMS_OUTPUT.PUT_LINE(str);
          END;
          /