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

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 代码块。
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 行: 显示已获取的记录值。

