Oracle PL/SQL 插入、更新、删除和 Select Into [示例]
在本教程中,我们将学习如何在 PL/SQL 中使用 SQL 。SQL 是负责从数据库中提取和更新数据的实际组件,而 PL/SQL 是处理这些数据的组件。此外,在本文中,我们还将讨论如何在 PL/SQL 块中组合 SQL。
PL/SQL 中的 DML 事务
DML 是 数据操纵语言 的缩写。这些语句主要用于执行操纵活动。它处理以下操作。
- 数据插入
- 数据更新
- 数据删除
- 数据选择
在 PL/SQL 中,我们只能通过使用 SQL 命令来操纵数据。
数据插入
在 PL/SQL 中,我们可以使用 INSERT INTO SQL 命令将数据插入任何表中。此命令将表名、表列和列值作为输入,并将值插入基本表中。
INSERT 命令还可以通过 ‘SELECT’ 语句直接从另一个表中获取值,而不是为每个列提供值。通过 ‘SELECT’ 语句,我们可以插入与基本表包含的行数一样多的行。
语法
BEGIN INSERT INTO <table_name>(<column1 >,<column2>,...<column_n>) VALUES(<valuel><value2>,...:<value_n>); END;
- 上面的语法显示了 INSERT INTO 命令。表名和值是必填字段,而列名则不是必填字段,前提是插入语句为表的所有列都提供了值。
- 如果像上面那样单独提供值,则 ‘VALUES’ 关键字是必填的。
语法
BEGIN INSERT INTO <table_name>(<columnl>,<column2>,...,<column_n>) SELECT <columnl>,<column2>,.. <column_n> FROM <table_name2>; END;
- 上面的语法显示了 INSERT INTO 命令,该命令使用 SELECT 命令直接从 <table_name2> 获取值。
- 在这种情况下,不应存在 ‘VALUES’ 关键字,因为值不是单独提供的。
数据更新
数据更新简单地意味着更新表中任何列的值。这可以通过 ‘UPDATE’ 语句完成。该语句将表名、列名和值作为输入,并更新数据。
语法
BEGIN UPDATE <table_name> SET <columnl>=<VALUE1>,<column2>=<value2>,<column_n>=<value_n> WHERE <condition that uniquely identifies the record that needs to be update>; END;
- 上面的语法显示了 UPDATE。‘SET’ 关键字指示 PL/SQL 引擎使用提供的值更新列的值。
- ‘WHERE’ 子句是可选的。如果未提供此子句,则将更新整个表中所述列的值。
数据删除
数据删除是指从数据库表中删除完整的记录。为此目的使用 ‘DELETE’ 命令。
语法
BEGIN DELETE FROM <table_name> WHERE <condition that uniquely identifies the record that needs to be update>; END;
- 上面的语法显示了 DELETE 命令。‘FROM’ 关键字是可选的,无论是否有 ‘FROM’ 子句,该命令的行为都是相同的。
- ‘WHERE’ 子句是可选的。如果未提供此子句,则将删除整个表。
数据选择
数据投影/获取是指从数据库表中检索所需数据。这可以通过使用带 ‘INTO’ 子句的 ‘SELECT’ 命令来实现。‘SELECT’ 命令将从数据库中获取值,而 ‘INTO’ 子句将这些值分配给 PL/SQL 块 的本地变量。
以下是使用 ‘SELECT’ 语句需要考虑的几点:
- 在使用 ‘INTO’ 子句时,‘SELECT’ 语句应只返回一条记录,因为一个变量只能容纳一个值。如果 ‘SELECT’ 语句返回多个值,则会引发 ‘TOO_MANY_ROWS’ 异常。
- ‘SELECT’ 语句会将值分配给 ‘INTO’ 子句中的变量,因此它需要至少从表中获取一条记录才能填充值。如果未获取任何记录,则会引发 ‘NO_DATA_FOUND’ 异常。
- ‘SELECT’ 子句中的列数及其数据类型应与 ‘INTO’ 子句中的变量数及其数据类型匹配。
- 值将按照语句中提到的顺序获取并填充。
- ‘WHERE’ 子句是可选的,它允许对将要获取的记录进行更多限制。
- ‘SELECT’ 语句可用于其他 DML 语句的 ‘WHERE’ 条件中,以定义条件的值。
- 在使用 ‘INSERT’、‘UPDATE’、‘DELETE’ 语句时,‘SELECT’ 语句不应包含 ‘INTO’ 子句,因为在这种情况下它不会填充任何变量。
语法
BEGIN SELECT <columnl>,..<column_n> INTO <vanable 1 >,. .<variable_n> FROM <table_name> WHERE <condition to fetch the required records>; END;
- 上面的语法显示了 SELECT-INTO 命令。‘FROM’ 关键字是必填的,它标识需要从中获取数据的表名。
- ‘WHERE’ 子句是可选的。如果未提供此子句,则将获取整个表中的数据。
示例 1:在此示例中,我们将看到如何在 PL/SQL 中执行 DML 操作。我们将向 emp 表插入以下四条记录。
EMP_NAME | EMP_NO | SALARY | MANAGER |
---|---|---|---|
BBB | 1000 | 25000 | AAA |
XXX | 1001 | 10000 | BBB |
YYY | 1002 | 10000 | BBB |
ZZZ | 1003 | 7500 | BBB |
然后我们将 ‘XXX’ 的工资更新为 15000,并将员工记录 ‘ZZZ’ 删除。最后,我们将投影 ‘XXX’ 员工的详细信息。
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,managed 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(‘Emplovee 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
代码解释
- 代码行 2-5:声明变量。
- 代码行 7-14:将记录插入 emp 表。
- 代码行 15:提交插入事务。
- 代码行 17-19:将员工 ‘XXX’ 的工资更新为 15000
- 代码行 20:提交更新事务。
- 代码行 22:删除 ‘ZZZ’ 的记录
- 代码行 23:提交删除事务。
- 代码行 25-27:选择 ‘XXX’ 的记录并将其填充到变量 l_emp_name、l_emp_no、l_salary、l_manager 中。
- 代码行 28-32:显示获取的记录值。