Oracle PL/SQL 插入、更新、删除和选择 [示例]

⚡ 智能摘要

SQL语句内部 Oracle PL/SQL 处理所有数据操作任务,允许代码块直接执行插入、更新、删除和选择行的操作。INSERT、UPDATE、DELETE 和 SELECT INTO 命令用于在数据库中移动和检索数据。

  • ⚙️ DML 命令: INSERT、UPDATE、DELETE 和 SELECT INTO 在 PL/SQL 块内执行所有数据操作任务。
  • 数据插入: INSERT INTO 语句允许从显式值或使用 SELECT 语句直接从另一个表中添加行。
  • 🔄 数据更新: 使用 SET 子句更新列值,而可选的 WHERE 子句限制受影响的行。
  • 🗑️ 数据删除: DELETE 语句会删除匹配的记录,省略 WHERE 子句则会清空整个表。
  • 🎯 选择进入: SELECT INTO 必须返回恰好一行,或者 Oracle 引发 NO_DATA_FOUND 或 TOO_MANY_ROWS 异常。
  • 🤖 人工智能协助: GitHub Copilot 等 AI 助手会生成 DML 代码块,并标记缺少的 WHERE 或 COMMIT 语句。

Oracle PL/SQL 插入 更新 删除 选择 进入

PL/SQL 中的 DML 事务

DML 代表数据操作语言,它是一组…… SQL 用于更改表中存储的数据的命令。在 PL/SQL 块这些命令执行操作,而 PL/SQL 则提供底层逻辑。DML 处理以下操作。

  • 数据插入
  • 资料更新
  • 资料删除
  • 数据选择

在 PL/SQL 中,数据操作只能通过 SQL 命令执行。

数据插入

在 PL/SQL 中,使用 SQL 命令 INSERT INTO 向表中添加行。该命令接受表名、目标列和列值作为输入,然后将值插入到基表中。

INSERT 命令还可以使用 SELECT 语句直接从另一个表中获取值,而无需为每一列指定值。通过 SELECT 语句,可以一次性插入源表中所有行。

语法:

BEGIN
INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>)
VALUES(<value1>,<value2>,...,<value_n>);
END;

以上语法展示了 INSERT INTO 命令。表名和值是必填字段,而列名在 INSERT 语句为表中的每一列都提供值时是可选的。当值是单独给出时(如上所示),关键字 VALUES 是必需的。

语法:

BEGIN
INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>)
SELECT <column1>,<column2>,...,<column_n> FROM <table_name2>;
END;

第二种形式的 INSERT INTO 直接从中获取值使用 SELECT 命令。此处不能使用关键字 VALUES,因为值不是单独提供的。

资料更新

数据更新是指更改现有行中某一列的值。这可以通过 UPDATE 语句完成,该语句接受表名、列名和新值作为输入,并更新数据。

语法:

BEGIN
UPDATE <table_name>
SET <column1>=<value1>,<column2>=<value2>,<column_n>=<value_n>
WHERE <condition that uniquely identifies the record that needs to be updated>;
END;

以上语法展示了 UPDATE 语句。关键字 SET 指示 PL/SQL 引擎使用给定值更新指定列。WHERE 子句是可选的;如果未指定,则会更新整个表中指定列的值。

资料删除

数据删除是指从数据库表中删除一条完整的记录。为此,需要使用 DELETE 命令。

语法:

BEGIN
DELETE FROM <table_name>
WHERE <condition that uniquely identifies the record that needs to be deleted>;
END;

以上语法展示了 DELETE 命令。关键字 FROM 是可选的,无论是否使用 FROM 子句,命令的行为都相同。WHERE 子句也是可选的;如果未提供,则会清空整个表。

数据选择

数据投影(或称数据提取)是指从数据库表中检索所需数据。这可以通过 SELECT 命令及其 INTO 子句来实现。SELECT 命令从数据库中提取值,而 INTO 子句将这些值赋给 PL/SQL 块的局部变量。

使用带有 INTO 的 SELECT 语句时,需要考虑以下几点:

  • 使用 INTO 子句的 SELECT 语句应该只返回一条记录,因为一个变量只能保存一个值。如果 SELECT 语句返回多行,则说明 SELECT 语句返回的记录数过多。 TOO_MANY_ROWS 异常 被提出。
  • SELECT 语句会将值赋给 INTO 子句中的变量,因此它至少需要一条记录来填充该值。如果找不到任何记录,则会引发 NO_DATA_FOUND 异常。
  • SELECT 子句中的列数及其数据类型应与 INTO 子句中的变量数及其数据类型相匹配。
  • 值的获取和填充顺序与语句中提到的顺序相同。
  • WHERE 子句是可选的,它允许您对要获取的记录施加更多限制。
  • SELECT 语句可以用于其他 DML 语句的 WHERE 条件中,以定义条件的值。
  • 在 INSERT、UPDATE 或 DELETE 语句中使用的 SELECT 语句不应该包含 INTO 子句,因为在这些情况下它不会填充任何变量。

语法:

BEGIN
SELECT <column1>,...,<column_n> INTO <variable1>,...,<variable_n>
FROM <table_name>
WHERE <condition to fetch the required records>;
END;

以上语法展示了 SELECT-INTO 命令。关键字 FROM 是必需的,用于指定要从中提取数据的表。WHERE 子句是可选的;如果未提供,则会从整个表中提取数据。

例如1: 在这个例子中,我们将学习如何在PL/SQL中执行DML操作。我们将把以下四条记录插入到emp表中。

EMP_NAME 雇员编号 薪金 经理
BBB 1000 25000 AAA
XXX 1001 10000 BBB
YYY 1002 10000 BBB
ZZZ 1003 7500 BBB

然后我们将员工“XXX”的工资更新为15000,删除员工记录“ZZZ”,最后展示员工“XXX”的详细信息。

下面截图显示了本示例使用的完整 PL/SQL 代码块。

Oracle PL/SQL 代码块对 emp 表执行插入、更新、删除和选择操作

DECLARE
l_emp_name VARCHAR2(250);
l_emp_no NUMBER;
l_salary NUMBER;
l_manager VARCHAR2(250);
BEGIN
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('BBB',1000,25000,'AAA');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('XXX',1001,10000,'BBB');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('YYY',1002,10000,'BBB');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('ZZZ',1003,7500,'BBB');
COMMIT;
Dbms_output.put_line('Values Inserted');
UPDATE EMP
SET salary=15000
WHERE emp_name='XXX';
COMMIT;
Dbms_output.put_line('Values Updated');
DELETE emp WHERE emp_name='ZZZ';
COMMIT;
Dbms_output.put_line('Values Deleted');
SELECT emp_name,emp_no,salary,manager INTO l_emp_name,l_emp_no,l_salary,l_manager FROM emp WHERE emp_name='XXX';
Dbms_output.put_line('Employee Detail');
Dbms_output.put_line('Employee Name:'||l_emp_name);
Dbms_output.put_line('Employee Number:'||l_emp_no);
Dbms_output.put_line('Employee Salary:'||l_salary);
Dbms_output.put_line('Employee Manager Name:'||l_manager);
END;
/

输出:

Values Inserted
Values Updated
Values Deleted
Employee Detail
Employee Name:XXX
Employee Number:1001
Employee Salary:15000
Employee Manager Name:BBB

Code 说明:

  • Code 第 2-5 行: 声明变量。
  • Code 第 7-14 行: 将记录插入 emp 表。
  • Code 第15行: 提交插入事务。
  • Code 第 17-19 行: 将员工“XXX”的工资更新为15000。
  • Code 第20行: 正在提交更新事务。
  • Code 第22行: 删除记录“ZZZ”。
  • Code 第23行: 正在提交删除事务。
  • Code 第25行: 选择“XXX”记录,并填充变量l_emp_name、l_emp_no、l_salary和l_manager。
  • Code 第 26-30 行: 显示已获取的记录值。

常见问题

不。静态 PL/SQL 不能直接运行 DDL。需要将语句构建为字符串,然后使用 `--ddl` 语句执行它。 立即执行它在运行时处理 CREATE、ALTER 和 DROP 操作。

SELECT INTO 语句必须返回且仅返回一行。要读取多行,请使用显式语句。 光标 使用 FETCH 循环,或 BULK COLLECT INTO 到集合中。

DELETE 是数据操作语言 (DML) 操作:它会删除带有 WHERE 子句的选定行,并且可以回滚。TRUNCATE 是数据定义语言 (DDL) 操作:它会立即清除所有行,自动提交,并且无法撤销。

是的。INSERT、UPDATE 和 DELETE 操作所做的更改会一直保留在您的会话中,直到您执行其他操作。 犯罪PL/SQL 不会自动提交。使用 COMMIT 保存或 ROLLBACK 放弃。

MERGE 执行 upsert 操作——它更新符合连接条件的行,并插入不符合连接条件的行——而不是通过单独的 UPDATE 和 INSERT 操作来完成。

RETURNING INTO 会捕获 INSERT、UPDATE 或 DELETE 刚刚影响的行中的列值,并将它们存储在变量中,从而避免使用额外的 SELECT 来读取更改的数据。

是的。 GitHub 副驾驶 根据简短的注释草拟 INSERT、UPDATE、DELETE 和 SELECT INTO 代码块,建议绑定变量,并完成列列表,但您应该先查看逻辑。

AI助手会扫描DML代码,查找缺失的WHERE子句、COMMIT语句和不安全的字符串拼接,然后提出修复建议并解释错误。这种机器学习审查能够在风险变更进入生产环境之前将其拦截。

总结一下这篇文章: