PLSQL语法入门--PL/SQL 基础详解

PL/SQL 基础详解

PL/SQL(Procedural Language for SQL)是 Oracle 数据库中的一种过程式语言,它扩展了 SQL 的功能,允许开发者编写复杂的程序逻辑。

一、匿名块

解释

匿名块是 PL/SQL 的基本执行单位,它是一段独立的 PL/SQL 代码,没有名称,不能被其他程序调用,主要用于测试和临时操作。

语法格式

复制代码
[DECLARE]
   -- 声明变量、游标等
BEGIN
   -- 执行 SQL 语句和 PL/SQL 代码
EXCEPTION
   -- 处理异常
END;

使用

复制代码
DECLARE
   num NUMBER := 10;
BEGIN
   DBMS_OUTPUT.PUT_LINE('num = ' || num);
END;

二、存储过程

解释

存储过程是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,可以通过名称调用执行。

语法格式

复制代码
CREATE [OR REPLACE] PROCEDURE 过程名 (参数列表)
IS
   -- 声明部分
BEGIN
   -- 执行部分
EXCEPTION
   -- 异常处理部分
END;

使用

复制代码
CREATE OR REPLACE PROCEDURE add_proc (a IN NUMBER, b IN NUMBER, c OUT NUMBER)
IS
BEGIN
   c := a + b;
END;

三、函数

解释

函数与存储过程类似,但函数必须返回一个值,通常用于计算并返回结果。

语法格式

复制代码
CREATE [OR REPLACE] FUNCTION 函数名 (参数列表)
RETURN 返回类型
IS
   -- 声明部分
BEGIN
   -- 执行部分
   RETURN 返回值;
EXCEPTION
   -- 异常处理部分
END;

使用

复制代码
CREATE OR REPLACE FUNCTION max_proc (a IN NUMBER, b IN NUMBER)
RETURN NUMBER
IS
BEGIN
   IF a > b THEN
      RETURN a;
   ELSE
      RETURN b;
   END IF;
END;

四、触发器

解释

触发器是当对表进行某种操作(如 INSERT、UPDATE、DELETE)时自动执行的 PL/SQL 程序。

语法格式

复制代码
CREATE [OR REPLACE] TRIGGER 触发器名
{BEFORE | AFTER} 触发事件
ON 表名
[FOR EACH ROW]
DECLARE
   -- 声明部分
BEGIN
   -- 执行部分
END;

使用

复制代码
CREATE OR REPLACE TRIGGER update_trigger
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
   DBMS_OUTPUT.PUT_LINE('员工信息已更新');
END;

五、变量声明和数据类型

解释

在 PL/SQL 中,可以在 DECLARE 部分声明变量,并为其指定数据类型,用于存储临时数据。

语法格式

复制代码
DECLARE
   变量名 数据类型;

使用

复制代码
DECLARE
   num NUMBER(5);
   name VARCHAR2(20);
   hiredate DATE;
BEGIN
   num := 100;
   name := '张三';
   hiredate := SYSDATE;
END;

六、条件语句

解释

条件语句用于根据不同的条件执行不同的代码块,实现分支逻辑。

语法格式

复制代码
IF 条件 THEN
   -- 语句块 1
ELSIF 条件 THEN
   -- 语句块 2
ELSE
   -- 语句块 3
END IF;

使用

复制代码
DECLARE
   num NUMBER := 60;
BEGIN
   IF num >= 60 THEN
      DBMS_OUTPUT.PUT_LINE('及格');
   ELSE
      DBMS_OUTPUT.PUT_LINE('不及格');
   END IF;
END;

七、循环语句

解释

循环语句用于重复执行一段代码,直到满足特定条件为止。

语法格式

复制代码
-- 基本循环
LOOP
   -- 语句块
   EXIT WHEN 条件;
END LOOP;

-- WHILE 循环
WHILE 条件 LOOP
   -- 语句块
END LOOP;

-- FOR 循环
FOR 循环变量 IN 范围 LOOP
   -- 语句块
END LOOP;

使用

复制代码
DECLARE
   num NUMBER := 1;
BEGIN
   WHILE num <= 5 LOOP
      DBMS_OUTPUT.PUT_LINE(num);
      num := num + 1;
   END LOOP;
END;

八、游标

解释

游标用于处理 SELECT 语句返回的多行记录,允许逐行处理查询结果。

语法格式

复制代码
-- 声明游标
CURSOR 游标名 IS
   SELECT 语句;

-- 打开游标
OPEN 游标名;

-- 提取数据
FETCH 游标名 INTO 变量;

-- 关闭游标
CLOSE 游标名;

使用

复制代码
DECLARE
   CURSOR emp_cursor IS
      SELECT employee_id, last_name FROM employees;
   emp_record emp_cursor%ROWTYPE;
BEGIN
   OPEN emp_cursor;
   LOOP
      FETCH emp_cursor INTO emp_record;
      EXIT WHEN emp_cursor%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(emp_record.employee_id || ' ' || emp_record.last_name);
   END LOOP;
   CLOSE emp_cursor;
END;

九、异常处理

解释

异常处理用于处理程序运行时出现的错误,确保程序的健壮性和稳定性。

语法格式

复制代码
BEGIN
   -- 代码
EXCEPTION
   WHEN 异常名 THEN
      -- 处理代码
   WHEN OTHERS THEN
      -- 处理代码
END;

使用

复制代码
DECLARE
   num NUMBER := 0;
BEGIN
   IF num = 0 THEN
      RAISE DIVIDE_BY_ZERO;
   END IF;
EXCEPTION
   WHEN DIVIDE_BY_ZERO THEN
      DBMS_OUTPUT.PUT_LINE('除数不能为零');
END;

十、内置函数

解释

PL/SQL 提供了丰富的内置函数,用于处理字符串、数值、日期等数据类型。

语法格式

复制代码
函数名(参数);

使用

复制代码
DECLARE
   str VARCHAR2(20) := 'Hello, World!';
BEGIN
   DBMS_OUTPUT.PUT_LINE(LENGTH(str)); -- 计算字符串长度
   DBMS_OUTPUT.PUT_LINE(UPPER(str)); -- 将字符串转换为大写
END;

十一、存储过程和函数的调用

解释

存储过程和函数可以通过特定的语法进行调用,以执行其内部的逻辑。

语法格式

复制代码
-- 调用存储过程
EXECUTE 存储过程名(参数);

-- 调用函数
函数名(参数);

使用

复制代码
-- 调用存储过程
EXECUTE add_proc(10, 20, :result);

-- 调用函数
DECLARE
   max_num NUMBER;
BEGIN
   max_num := max_proc(10, 20);
   DBMS_OUTPUT.PUT_LINE('最大值为:' || max_num);
END;
相关推荐
翻滚吧键盘4 分钟前
在 Debian 12 中恢复被删除的 smb.conf 配置文件
运维·数据库·debian
KaiwuDB11 分钟前
KWDB MCP Server:解锁 LLM 与数据库的无缝协作
数据库
Cachel wood21 分钟前
大数据开发知识1:数据仓库
android·大数据·数据仓库·sql·mysql·算法·ab测试
TDengine (老段)22 分钟前
TDengine 整体构架
大数据·数据库·物联网·时序数据库·tdengine·iotdb
may_一一38 分钟前
mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)
数据库·mysql
余衫马1 小时前
ASP.NET Core 最小 API:极简开发,高效构建(下)
java·数据库·asp.net
angen20181 小时前
seata db模式,nacos注册中心,spring boot ,spring cloud ,jdk1.8 完成的配置步骤
数据库·spring boot·spring cloud
不爱学英文的码字机器1 小时前
[操作系统] 信号
数据库
晚风_END2 小时前
node.js|环境部署|源码编译高版本的node.js
linux·服务器·数据库·node.js·编辑器·个人开发
我言秋日胜春朝★2 小时前
【MySQL】数据库基础
数据库·mysql