PL/SQL - 基础语法

欢迎,未来的程序员们!今天,我们将进入PL/SQL的精彩世界。如果你之前从未编写过一行代码,也不用担心——我们将从头开始,一步一步地构建你的知识体系。在本教程结束时,你将能够自信地编写你的第一个PL/SQL程序!

PL/SQL - Basic Syntax

“Hello World”示例

让我们从传统的“Hello World”程序开始。这是每个程序员的必经之路,也是我们用来熟悉PL/SQL语法的绝佳方式。

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
/

让我们来分解一下:

  1. BEGIN:这个关键字标志着我们PL/SQL代码块的开始。
  2. DBMS_OUTPUT.PUT_LINE('Hello, World!');:这行代码打印出我们的信息。把它看作是PL/SQL与我们交流的方式。
  3. END;:这标志着我们PL/SQL代码块的结束。
  4. /:这个斜杠告诉SQL*Plus执行PL/SQL代码块。

当你运行这段代码时,你会在屏幕上看到“Hello, World!”。恭喜你!你已经编写了你的第一个PL/SQL程序。

PL/SQL标识符

标识符是我们给程序元素(如变量、过程和函数)起的名字。它们就像是我们代码不同部分的姓名标签。以下是创建标识符的规则:

  1. 必须以字母开头(A-Z或a-z)。
  2. 可以后接字母、数字(0-9)、美元符号($)、下划线(_)或井号(#)。
  3. 不能超过30个字符。
  4. 不能是保留字(如BEGIN、END、IF等)。

让我们看一些例子:

DECLARE
employee_name VARCHAR2(50);
salary NUMBER;
dept_id NUMBER(5);
BEGIN
-- 代码放在这里
END;
/

在这个例子中,employee_namesalarydept_id都是有效的标识符。

PL/SQL分隔符

分隔符是在PL/SQL中具有特定意义的特殊字符或符号。它们就像句子中的标点符号,帮助我们的代码结构和分隔不同的部分。

下面是常见的PL/SQL分隔符表:

分隔符 描述
; 语句终止符
% 属性指示符
. 组件选择器
( ) 包围参数列表
, 参数分隔符
:= 赋值运算符
=> 关联运算符
-- 单行注释指示符
/ / 多行注释指示符

让我们看看一些实际应用:

DECLARE
v_count NUMBER := 0; -- 赋值运算符
v_name VARCHAR2(50) := 'John Doe';
BEGIN
v_count := v_count + 1; -- 语句终止符
DBMS_OUTPUT.PUT_LINE('Name: ' || v_name); -- 组件选择器
END;
/

PL/SQL注释

注释就像代码中的便利贴。编译器会忽略它们,但它们对于解释代码的功能非常有用。PL/SQL中有两种类型的注释:

  1. 单行注释:以--开始。
  2. 多行注释:用/**/包围。

这里有一个例子:

DECLARE
-- 这是一个单行注释
v_pi NUMBER := 3.14159;
BEGIN
/*
这是一个多行注释。
它可以跨越多行。
对于更长的解释非常有用。
*/
DBMS_OUTPUT.PUT_LINE('pi的值是: ' || v_pi);
END;
/

PL/SQL程序单元

PL/SQL程序单元是PL/SQL应用程序的构建块。它们就像食谱中的每个步骤——每个单元描述了如何执行一个特定的任务。主要的类型有:

  1. 匿名块
  2. 过程
  3. 函数

让我们看看每个类型的例子:

1. 匿名块

我们已经在“Hello World”示例中见过它。它是一段未在数据库中保存的代码。

BEGIN
DBMS_OUTPUT.PUT_LINE('这是一个匿名块');
END;
/

2. 过程

过程是一个命名的PL/SQL块,执行特定的操作。

CREATE OR REPLACE PROCEDURE greet_user(p_name IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, ' || p_name || '!');
END;
/

-- 调用过程:
BEGIN
greet_user('Alice');
END;
/

3. 函数

函数与过程类似,但它返回一个值。

CREATE OR REPLACE FUNCTION calculate_area(p_radius IN NUMBER)
RETURN NUMBER IS
v_pi CONSTANT NUMBER := 3.14159;
BEGIN
RETURN v_pi * p_radius * p_radius;
END;
/

-- 使用函数:
DECLARE
v_area NUMBER;
BEGIN
v_area := calculate_area(5);
DBMS_OUTPUT.PUT_LINE('面积是: ' || v_area);
END;
/

4. 包

包是一组相关的过程、函数、变量和其他PL/SQL对象的集合。

CREATE OR REPLACE PACKAGE math_operations AS
FUNCTION add_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER;
FUNCTION subtract_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER;
END math_operations;
/

CREATE OR REPLACE PACKAGE BODY math_operations AS
FUNCTION add_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN a + b;
END add_numbers;

FUNCTION subtract_numbers(a IN NUMBER, b IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN a - b;
END subtract_numbers;
END math_operations;
/

-- 使用包:
DECLARE
v_result NUMBER;
BEGIN
v_result := math_operations.add_numbers(10, 5);
DBMS_OUTPUT.PUT_LINE('10 + 5 = ' || v_result);

v_result := math_operations.subtract_numbers(10, 5);
DBMS_OUTPUT.PUT_LINE('10 - 5 = ' || v_result);
END;
/

就这样!我们已经涵盖了PL/SQL的基础语法,从简单的“Hello World”程序到更复杂结构如包。记住,学习编程就像学习一门新语言——它需要练习和耐心。不要害怕尝试代码示例,修改它们,看看会发生什么。这样,你才能真正消化这些概念,成为一个熟练的PL/SQL程序员。

快乐编码,愿你的查询总是返回你期望的结果!

Credits: Image by storyset