PL/SQL - 基础语法
欢迎,未来的程序员们!今天,我们将进入PL/SQL的精彩世界。如果你之前从未编写过一行代码,也不用担心——我们将从头开始,一步一步地构建你的知识体系。在本教程结束时,你将能够自信地编写你的第一个PL/SQL程序!
“Hello World”示例
让我们从传统的“Hello World”程序开始。这是每个程序员的必经之路,也是我们用来熟悉PL/SQL语法的绝佳方式。
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
/
让我们来分解一下:
-
BEGIN
:这个关键字标志着我们PL/SQL代码块的开始。 -
DBMS_OUTPUT.PUT_LINE('Hello, World!');
:这行代码打印出我们的信息。把它看作是PL/SQL与我们交流的方式。 -
END;
:这标志着我们PL/SQL代码块的结束。 -
/
:这个斜杠告诉SQL*Plus执行PL/SQL代码块。
当你运行这段代码时,你会在屏幕上看到“Hello, World!”。恭喜你!你已经编写了你的第一个PL/SQL程序。
PL/SQL标识符
标识符是我们给程序元素(如变量、过程和函数)起的名字。它们就像是我们代码不同部分的姓名标签。以下是创建标识符的规则:
- 必须以字母开头(A-Z或a-z)。
- 可以后接字母、数字(0-9)、美元符号($)、下划线(_)或井号(#)。
- 不能超过30个字符。
- 不能是保留字(如BEGIN、END、IF等)。
让我们看一些例子:
DECLARE
employee_name VARCHAR2(50);
salary NUMBER;
dept_id NUMBER(5);
BEGIN
-- 代码放在这里
END;
/
在这个例子中,employee_name
、salary
和dept_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中有两种类型的注释:
- 单行注释:以
--
开始。 - 多行注释:用
/*
和*/
包围。
这里有一个例子:
DECLARE
-- 这是一个单行注释
v_pi NUMBER := 3.14159;
BEGIN
/*
这是一个多行注释。
它可以跨越多行。
对于更长的解释非常有用。
*/
DBMS_OUTPUT.PUT_LINE('pi的值是: ' || v_pi);
END;
/
PL/SQL程序单元
PL/SQL程序单元是PL/SQL应用程序的构建块。它们就像食谱中的每个步骤——每个单元描述了如何执行一个特定的任务。主要的类型有:
- 匿名块
- 过程
- 函数
- 包
让我们看看每个类型的例子:
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