本章假定使用标量主机变量。
您可以在以下嵌入式 SQL 语句中查询和操作 Oracle 数据:
| 嵌入式 SQL 语句 | 描述 |
|---|---|
SELECT | 从一个或多个表中返回行。 |
INSERT | 向表添加新行。 |
UPDATE | 更改表中的行。 |
DELETE | 从表中删除不需要的行。 |
显式游标的定义和操作在以下嵌入式 SQL 语句中完成:
| 嵌入式 SQL 语句 | 描述 |
|---|---|
DECLARE | 命名游标并关联查询。 |
OPEN | 运行查询以确定活动集。 |
FETCH | 移动光标以逐个检索活动集中的每行。 |
CLOSE | 禁用游标(未定义活动集)。 |
以下各节首先介绍如何编写插入、更新、删除和单行选择语句。 接下来,我们将介绍如何使用多行 SELECT 语句。
SELECT 语句
查询数据库是一种日常的 SQL 过程。 使用 SELECT 语句发出查询。 下面的示例查询 EMP 表。
EXEC SQL SELECT ename, job, sal + 2000 INTO :emp_name, :job_title, :salary FROM emp WHERE empno = :emp_number;
关键字 SELECT 后面的列名称和表达式创建选择列表。 示例选择列表包含三个项目。 在 WHERE 子句(如果存在,则为后续子句)中指定的条件下,Oracle 将列值返回到 INTO 子句的主机变量。
选择列表中的项数与 INTO 子句中的主机变量数相同,并且有一个存储所有返回值的位置。
最简单的示例是,如果查询仅返回一行,则格式应类似于前面的示例。 但是,如果在单个查询中返回多行,则必须使用游标提取这些行,或将这些行 SELECT 放入主机变量数组中。 本章稍后将介绍光标和 FETCH 语句。
如果创建仅返回一行的查询实际上返回多行,则 SELECT 的结果是不可预知的。 这是否是错误的原因取决于指定SELECT_ERROR选项的方式。 如果默认值为“是”,则返回多行将导致错误。
可用子句
在 SELECT 语句中,以下所有标准 SQL 子句
INTO
FROM
WHERE
CONNECT BY
START WITH
GROUP BY
HAVING
ORDER BY
FOR UPDATE OF
除 INTO 子句外,嵌入式 SELECT 语句可以使用 SQL_Plus 以交互方式执行和测试。 SQL_Plus 使用替换变量或常量而不是输入主机变量。
插入语句
可以使用 INSERT 语句向表或视图添加行。 下面的示例向 EMP 表添加一行。
EXEC SQL INSERT INTO emp (empno, ename, sal, deptno) VALUES (:emp_number, :emp_name, :salary, :dept_number);
列列表中的每个列都必须包含在 INTO 子句中指定的表中。 VALUES 子句指定要插入的行的值。 这些值可以是常量、主机变量、SQL 表达式、SQL 函数(USER、SYSDATE 等)或用户定义的 PL/SQL 函数。
VALUES 子句中的值数必须等于列列表中的名称数。 但是,如果 VALUES 子句按表中定义的顺序为表中的每个列指定了所有值,则可以省略此列列表。
如何使用子查询
子查询是嵌套的 SELECT 语句。 您可以使用子查询执行多部分搜索。 子查询可用于:
指定用于在“选择”、“更新”和“删除”语句的“发送”和“开始”子句中进行比较的值。
定义要通过创建表或插入语句插入的行集。
为更新语句的 SET 子句定义值。
下面的示例使用 INSERT 语句中的子查询将行从一个表复制到另一个表。
EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno) SELECT empno, ename, sal, deptno FROM emp WHERE job= :job_title ;
此 INSERT 语句使用子查询来获取中间结果。
更新语句
可以使用 UPDATE 语句更改表或视图中指定列的值。 下面的示例更新表中的列和列。EMPSALCOMM
EXEC SQL UPDATE emp SET sal = :salary, comm = :commission WHERE empno = :emp_number;
SET 子句是必须指定值的一个或多个列的名称序列。 可以使用子查询指定值,如以下示例所示:
EXEC SQL UPDATE emp SET sal = (SELECT AVG(sal)*1.1 FROM emp WHERE deptno = 20) WHERE empno = :emp_number;
与插入和删除语句一样,更新语句可以选择指定子句。 只能在可选 WHERE 条件之后指定。RETURNING
DELETE文
可以使用“删除”语句从表或视图中删除行。 下面的示例从 EMP 表中删除指定部门中的所有员工。
EXEC SQL DELETE FROM emp WHERE deptno = :dept_number ;
RETURNING子句选项也可用于删除语句。 它可以在可选的 WHERE 条件之后指定。 在前面的示例中,建议提前记录要删除的每个员工的字段值。
WHERE 子句
WHERE 子句允许您仅选择、更新或删除满足表或视图中搜索条件的行。 WHERE 子句中的搜索条件是布尔表达式,可以包含标量主机变量、主机数组(SELECT 语句除外)、子查询和用户定义的存储函数。
如果省略 WHERE 子句,则处理表或视图中的所有行。 如果在更新或删除语句中省略 WHERE 子句,Oracle 会将 SQLCA 设置为“W”,以指示已处理所有列。sqlwarn[4]




