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

在本教程中,我们将学习如何使用 SQL 在 PL/SQL 中。SQL 是负责获取和更新数据库中数据的实际组件,而 PL/SQL 是处理这些数据的组件。此外,在本文中,我们还将讨论如何在 PL/SQL 块中组合 SQL。

PL/SQL 中的 DML 事务

DML 代表 数据处理语言。这些语句主要用于执行操作活动。它处理以下操作。

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

在PL/SQL中,我们只能使用SQL命令来进行数据操作。

数据插入

在 PL/SQL 中,我们可以使用 SQL 命令 INSERT INTO 将数据插入任何表中。此命令将以表名、表列和列值作为输入,并将值插入基表中。

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 命令。
  • 在这种情况下,不应出现关键字“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. 我们将把以下四条记录插入到 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,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:显示获取的记录值。