声明
📄字数 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各类声明演示。
sqlSQL> 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关键字。
sqlSQL> CREATE OR REPLACE PROCEDURE proc_declare IS str VARCHAR :='abc'; BEGIN DBMS_OUTPUT.PUT_LINE(str); END; /