跳转至

PL/SQL 变量、常量与文字

本章系统讲解 PL/SQL 中的变量、常量以及文字(Literal),这是编写任何 PL/SQL 程序的基础内容,也是面试与项目中最常被问到的知识点之一。


1. PL/SQL 变量概述

变量是程序中 用于存储和操作数据的命名存储区域。 PL/SQL 中的每个变量都必须有明确的数据类型,该数据类型决定了:

  • 变量在内存中的大小和布局
  • 可存储的值范围
  • 可对变量执行的操作

变量命名规则

  • 由字母开头
  • 可包含:字母、数字、$_#
  • 长度 不超过 30 个字符
  • 不区分大小写
  • 不能使用 PL/SQL 保留关键字

2. PL/SQL 变量声明

PL/SQL 变量必须在 声明区(DECLARE)或包中 声明。

基本语法

variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]

示例

sales   number(10, 2);
name    varchar2(25);
address varchar2(100);

📌 建议

  • 尽量使用 有约束的声明(指定长度、精度),可以减少内存消耗

3. 变量初始化

默认值

  • 所有变量在声明时,默认值均为 NULL

初始化方式

  • 使用 := 赋值
  • 使用 DEFAULT 关键字
counter   binary_integer := 0;
greetings varchar2(20) DEFAULT 'Have a Good Day';

NOT NULL 约束

  • 使用 NOT NULL 时,必须显式初始化变量
v_id number NOT NULL := 100;

📌 初始化变量是良好的编程习惯,可避免不可预期的结果。


4. 变量使用示例

declare
  a integer := 10;
  b integer := 20;
  c integer;
  f real;
begin
  c := a + b;
  dbms_output.put_line('Value of c: ' || c);

  f := 70.0 / 3.0;
  dbms_output.put_line('Value of f: ' || f);
end;
/

执行结果:

Value of c: 30
Value of f: 23.333333333333333333

5. 变量作用域(Scope)

PL/SQL 支持 块嵌套,变量的可见范围取决于声明位置。

变量分类

类型 说明
局部变量 在内部块中声明,仅内部可访问
全局变量 在外部块或包中声明,内部块可访问

作用域示例

declare
  -- 全局变量
  num1 number := 95;
  num2 number := 85;
begin
  dbms_output.put_line('Outer Variable num1: ' || num1);
  dbms_output.put_line('Outer Variable num2: ' || num2);

  declare
    -- 局部变量
    num1 number := 195;
    num2 number := 185;
  begin
    dbms_output.put_line('Inner Variable num1: ' || num1);
    dbms_output.put_line('Inner Variable num2: ' || num2);
  end;
end;
/

6. 将 SQL 查询结果赋值给变量(SELECT INTO)

可以使用 SELECT ... INTO 将 SQL 查询结果赋值给 PL/SQL 变量。

基本规则

  • SELECT 列数 必须与 INTO 变量数量一致
  • 查询结果 必须且只能返回一行

示例

declare
  c_id   customers.id%type := 1;
  c_name customers.name%type;
  c_addr customers.address%type;
  c_sal  customers.salary%type;
begin
  select name, address, salary
    into c_name, c_addr, c_sal
    from customers
   where id = c_id;

  dbms_output.put_line(
    'Customer ' || c_name || ' from ' || c_addr || ' earns ' || c_sal
  );
end;
/

⚠️ 注意:

  • 0 行 → NO_DATA_FOUND
  • 多行 → TOO_MANY_ROWS

7. PL/SQL 常量(CONSTANT)

常量是在声明时赋值,程序运行过程中不可修改的值

常量声明

pi constant number := 3.141592654;

示例:圆形计算

declare
  pi constant number := 3.141592654;
  radius number(5,2);
  dia number(5,2);
  circumference number(7,2);
  area number(10,2);
begin
  radius := 9.5;
  dia := radius * 2;
  circumference := 2 * pi * radius;
  area := pi * radius * radius;

  dbms_output.put_line('半径: ' || radius);
  dbms_output.put_line('直径: ' || dia);
  dbms_output.put_line('圆周: ' || circumference);
  dbms_output.put_line('面积: ' || area);
end;
/

8. PL/SQL 文字(Literal)

文字是 直接写在代码中的固定值,不依赖任何变量名。

常见文字类型

类型 示例
数字文字 2346, -14, 3.14159, 1.0E-8
字符文字 'A', '%', '9'
字符串文字 'Hello', '易百教程网'
布尔文字 TRUE, FALSE, NULL
日期时间文字 '1998-08-25', '2017-10-02 12:01:01'

9. 字符串中使用单引号

在字符串中嵌入单引号,需要使用 两个单引号表示一个单引号

declare
  message varchar2(30) := 'What''s yiibai.com!';
begin
  dbms_output.put_line(message);
end;
/

输出结果:

What's yiibai.com!

10. 本章小结

  • PL/SQL 变量必须声明数据类型
  • 变量默认值为 NULL,应显式初始化
  • 支持局部变量与全局变量(作用域)
  • 使用 SELECT INTO 将查询结果赋值给变量
  • CONSTANT 声明常量,不可修改
  • 文字是直接使用的固定值