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’ 员工的详细信息。

Data Selection in 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,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:显示获取的记录值。