使用操纵数据

Oracle提供数据操作语言命令来在数据库中执行数据操作.数据操作可以使用应用程序或业务数据填充数据库表,修改数据并在需要时从数据库中删除数据.除了数据操作之外,还有一组用于控制这些操作的命令.这些命令被分组为事务控制语言.

逻辑SQL事务涉及三种类型的DML语句,即插入,更新,删除和合并.事务是数据库中DML操作的逻辑集合会话.

INSERT语句

INSERT命令用于在表中存储数据. INSERT命令通常用于高级编程语言,如Visual Basic.NET或C ++,作为嵌入式SQL命令;但是,此命令也可以在命令模式下的SQL * PLUS提示符下执行.INSERT命令有两种不同的形式.如果新行将在行的每列中插入值,则使用第一个表单. INSERT命令的第二种形式用于插入某些列数据未知或默认来自另一个业务逻辑的行.这种形式的INSERT命令要求您指定存储数据的列名.

语法:

如果表中所有列的值都是明确且已知的,则可以遵循以下语法.

INSERT INTO table
VALUES (column1 value, column2 value, 
...);

如果表中只有少数列必须填充值,则可以使用以下语法.其余列可以将其值推导为NULL或来自不同的业务逻辑.

INSERT INTO table (column1 name, column2 name, . . .)
VALUES (column1 value, column2 value, . . .);

下面的INSERT语句在EMPLOYEES表中创建一个新的员工记录.请注意,它会插入主列EMPLOYEE_ID,FIRST_NAME,SALARY和DEPARTMENT_ID的值.

 INSERT INTO员工(EMPLOYEE_ID,FIRST_NAME,SALARY,DEPARTMENT_ID)
 VALUES(130,'KEMP',3800,10);

否则,可以在EMPLOYEES表中插入完整的员工数据,而无需使用以下INSERT语句指定列列表 - 如果预先知道这些值,并且必须符合表中列的数据类型和位置.

 INSERT INTO employees 
 VALUES( 130,'KEMP','GARNER','kemp.garner @ xxx.com','48309290',TO_DATE('01 -JAN-2012'),'SALES',3800,0,110,10);

要插入的值必须与列的数据类型兼容.文字,固定值和特殊值(如函数,SYSDATE,CURRENT_DATE,SEQ.CURRVAL(NEXTVAL)或USER)可用作列值.指定的值必须遵循通用规则.字符串文字和日期值必须用引号括起来.日期值可以DD-MON-RR或D-MON-YYYY格式提供,但YYYY是首选,因为它明确指定世纪并且不依赖于内部RR世纪计算逻辑.

INSERT-AS-SELECT(IAS)语句

可以使用INSERT..AS..SELECT将数据从源表填充到目标表中( IAS)操作.它是一个直接路径读取操作.它是一种从一个表创建数据副本到另一个表的简单方法,或者创建源表操作在线的表的备份副本.

For例如,数据可以从EMPLOYEES表复制到EMP_HISTORY表.

 INSERT INTO EMP_HISTORY 
 SELECT EMPLOYEE_ID,EMPLOYEE_NAME,SALARY,DEPARTMENT_ID 
 FROM employees;

UPDATE语句

UPDATE命令修改存储在列中的数据.它可以一次更新单行或多行取决于WHERE子句中指定的条件筛选的结果集.请注意,更新列与更改列不同.在本章的前面部分,您研究了ALTER命令.ALTER命令更改了表结构,但使表数据不受影响.UPDATE命令更改表中的数据,而不是表结构.

语法:

UPDATE table
SET column = value [, column = value ...]
[WHERE condition]

从语法中,

SET列=表达式可以是更新指定列中数据的字符,公式或函数的任意组合name.WHERE子句是可选的,但如果包含它,则指定将更新哪些行.只能使用UPDATE命令一次更新一个表.

UPDATE语句下面将员工JOHN的工资更新为5000.

 UPDATE employees 
 SET salary = 5000 
 WHERE UPPER(first_name)='JOHN' ;

虽然WHERE谓词是可选的,但必须以逻辑方式附加以便只修改表中所需的行.下面的UPDATE语句更新表中所有员工的工资.

 UPDATE employees 
 SET salary = 5000;

也可以通过在逗号分隔的SET子句中指定多个列来更新多个列.例如,如果必须将JOHN和job角色分别更改为5000和SALES,则UPDATE语句看起来像,

 UPDATE employees 
 SET SALARY = 5000,
 JOB_ID ='SALES'
 WHERE UPPER(first_name)='JOHN'; 
 1行已更新.

更新同一行的多列的另一种方法显示了子查询的用法.

 UPDATE employees 
 SET(SALARY,JOB_ID)=(SELECT 5000,'SALES'from DUAL)
 WHERE UPPER(ENAME)='JOHN'

DELETE语句

DELETE命令是最简单的SQL语句之一.它从表中删除一行或多行. SQL中不允许多表删除操作.DELETE命令的语法如下所示.

 DELETE FROM table_name 
 [WHERE condition];

DELETE命令删除表中满足可选WHERE子句中条件的所有行.由于WHERE子句是可选的,因此可以通过省略WHERE子句来轻松删除表中的所有行,因为WHERE子句限制了DELETE操作的范围.

以下DELETE语句将从EMP表中删除EDWIN的详细信息.

DELETE employees
WHERE UPPER (ENAME) = 'EDWIN'

1 row deleted.

注意:DELETE [TABLE NAME]和DELETE FROM [TABLE NAME]具有相同的含义.

条件删除语句中的WHERE条件可以使用子查询,如下所示.

DELETE FROM employees
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
				    FROM LOCATIONS
				    WHERE LOCATION_CODE = 'SFO')

TRUNCATE

Truncate是一个DDL命令,用于清除表中的所有记录但保留表结构.它不支持WHERE条件来删除所选记录.

语法:

 TRUNCATE [表名] ]

它是自动提交,即它提交会话中的当前活动事务.截断表不会丢弃依赖索引,触发器或表约束.如果表A是数据库中表B的引用约束的父表,则表A不能被截断.

事务

事务是数据库中完成的逻辑工作单元.它可以包含 -

  • 以TCL命令结尾的多个DML命令,即COMMIT或ROLLBACK

  • 一个DDL命令

  • 一个DCL命令

事务的开始用第一个DML命令标记.它以TCL,DDL或DCL命令结束. TCL命令即COMMIT或ROLLBACK明确地发出以结束活动事务.凭借其基本行为,如果在数据库会话中执行任何DDL或DCL命令,则在会话中提交正在进行的活动事务.如果数据库实例异常崩溃,则事务将停止.

COMMIT,ROLLBACK和SAVEPOINT是事务控制语言.当ROLLBACK执行反提交操作时,COMMIT将数据更改永久地应用于数据库. SAVEPOINT通过在不同的交易阶段设置标记来控制交易系列.用户可以将当前事务回滚到前面设置的所需保存点.

COMMIT  - 提交通过永久应用数据更改来结束当前活动事务进入数据库表. COMMIT是一个显式结束事务的TCL命令.但是,DDL和DCL命令隐式提交事务.

SAVEPOINT  -  Savepoint用于标记会话中当前事务中的特定点.由于它是事务中的逻辑标记,因此无法在数据字典中查询保存点.

ROLLBACK  -  ROLLBACK命令用于通过丢弃来结束整个事务数据发生了变化.如果事务包含标记的保存点,则可以使用ROLLBACK TO SAVEPOINT [name]将事务回滚到指定的保存点.因此,将丢弃指定保存点之前的所有数据更改.

演示

考虑员工每年第一季度都会填上新雇用的员工详细信息的表格.文书工作人员为每个员工细节附加一个保存点,以便在数据馈送活动期间随时回滚任何有缺陷的数据.请注意,他将保存点名称与员工姓名保持一致.

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (105, 'Allen',TO_DATE ('15-JAN-2013','SALES',10000,10);

SAVEPOINT Allen;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',10000,20);

SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',12000,30);

SAVEPOINT McMan;

假设数据输入操作员意识到他错误地输入了' Kate'和'McMan'.他将活动交易回滚到保存点Kate并重新输入Kate和McMan的员工详细信息.

ROLLBACK TO SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',12500,20);

SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',13200,30);

SAVEPOINT McMan;

完成数据输入后,他可以通过以下方式提交整个交易在当前会话中发出COMMIT.

读取一致性

Oracle在每个会话中保持用户之间的一致性数据访问和读/写操作.

当表上发生DML时,操作更改的原始数据值将记录在数据库撤消记录中.只要事务不是提交到数据库,其他会话中的任何用户稍后查询修改后的数据查看原始数据值.Oracle使用系统全局区域中的当前信息和撤消记录中的信息来构建查询的表数据的读一致视图只有当事务被提交时,ch交易的年龄是永久性的.该事务是Oracle提供读取一致性策略的关键.

代表读者生成读一致视图的起点

控制何时可以看到修改后的数据通过数据库的其他交易进行阅读或更新