oracle教程从入门到精通

上传人:gbs****77 文档编号:9290037 上传时间:2020-04-04 格式:DOC 页数:84 大小:992.50KB
返回 下载 相关 举报
oracle教程从入门到精通_第1页
第1页 / 共84页
oracle教程从入门到精通_第2页
第2页 / 共84页
oracle教程从入门到精通_第3页
第3页 / 共84页
点击查看更多>>
资源描述
韩顺平 玩转 oracle 视频教程笔记 一 Oracle 认证 与其它数据库比较 安装 Oracle 安装会自动的生成 sys 用户和 system 用户 1 sys 用户是超级用户 具有最高权限 具有 sysdba 角色 有 create database 的权限 该用户默认的密码是 change on install 2 system 用户是管理操作员 权限也很大 具有 sysoper 角色 没有 create database 的权限 默认的密码是 manager 3 一般讲 对数据库维护 使用 system 用户登录就可以拉 也就是说 sys 和 system 这两个用户最大的区别是在于有没有 create database 的权限 二 Oracle 的基本使用 基本命令 sql plus 的常用命令 连接命令 1 conn ect 用法 conn 用户名 密码 网络服务名 as sysdba sysoper 当用特权用户身份 连接时 必须带上 as sysdba 或是 as sysoper 2 disc onnect 说明 该命令用来断开与当前数据库的连接 3 psssw ord 说明 该命令用于修改用户的密码 如果要想修改其它用户的密码 需要用 sys system 登录 4 show user 说明 显示当前用户名 5 exit 说明 该命令会断开与数据库的连接 同时会退出 sql plus 文件操作命令 1 start 和 说明 运行 sql 脚本 案例 sql d a sql 或是 sql start d a sql 2 edit 说明 该命令可以编辑指定的 sql 脚本 案例 sql edit d a sql 这样会把 d a sql 这个文件打开 3 spool 说明 该命令可以将 sql plus 屏幕上的内容输出到指定文件中去 案例 sql spool d b sql 并输入 sql spool off 交互式命令 1 oracle 有个毛病 密码必须以字母开头 如果以字母 开头 它不会创建用户 给用户修改密码 概述 如果给自己修改密码可以直接使用 password 用户名 如果给别人修改密码则需要具有 dba 的权限 或是拥有 alter user 的系统权限 SQL alter user 用户名 identified by 新密码 删除用户 概述 一般以 dba 的身份去删除某个用户 如果用其它用户去删除用户则需要具有 drop user 的权限 比如 drop user 用户名 cascade 在删除用户时 注意 如果要删除的用户 已经创建了表 那么就需要在删除的时候带一个参数 cascade 用户管理的综合案例 概述 创建的新用户是没有任何权限的 甚至连登陆的数据库的权限都没有 需要为其指 定相应的权限 给一个用户赋权限使用命令 grant 回收权限使用命令 revoke 为了给讲清楚用户的管理 这里我给大家举一个案例 SQL conn xiaoming m12 ERROR ORA 01045 user XIAOMING lacks CREATE SESSION privilege logon denied 警告 您不再连接到 ORACLE SQL show user USER 为 SQL conn system p 已连接 SQL grant connect to xiaoming 授权成功 SQL conn xiaoming m12 后面的为密码分开来输入 已连接 SQL 注意 grant connect to xiaoming 在这里 准确的讲 connect 不是权限 而是角色 看图 现在说下对象权限 现在要做这么件事情 希望 xiaoming 用户可以去查询 emp 表 希望 xiaoming 用户可以去查询 scott 的 emp 表 grant select on emp to xiaoming 希望 xiaoming 用户可以去修改 scott 的 emp 表 grant update on emp to xiaoming 希望 xiaoming 用户可以去修改 删除 查询 添加 scott 的 emp 表 grant all on emp to xiaoming scott 希望收回 xiaoming 对 emp 表的查询权限 revoke select on emp from xiaoming 对权限的维护 希望 xiaoming 用户可以去查询 scott 的 emp 表 还希望 xiaoming 可以把这个权限继续给别 人 如果是对象权限 就加入 with grant option grant select on emp to xiaoming with grant option 我的操作过程 SQL conn scott tiger 已连接 SQL grant select on scott emp to xiaoming with grant option 授权成功 SQL conn system p 已连接 SQL create user xiaohong identified by m123 用户已创建 SQL grant connect to xiaohong 授权成功 SQL conn xiaoming m12 已连接 SQL grant select on scott emp to xiaohong 授权成功 如果是系统权限 system 给 xiaoming 权限时 grant connect to xiaoming with admin option 问题 如果 scott 把 xiaoming 对 emp 表的查询权限回收 那么 xiaohong 会怎样 答案 被回收 下面是我的操作过程 SQL conn scott tiger 已连接 SQL revoke select on emp from xiaoming 撤销成功 SQL conn xiaohong m123 已连接 SQL select from scott emp select from scott emp 第 1 行出现错误 ORA 00942 表或视图不存在 结果显示 小红受到诛连了 使用 profile 管理用户口令 概述 profile 是口令限制 资源限制的命令集合 当建立数据库的 oracle 会自动建立名 称为 default 的 profile 当建立用户没有指定 profile 选项 那么 oracle 就会将 default 分配 给用户 1 账户锁定 概述 指定该账户 用户 登陆时最多可以输入密码的次数 也可以指定用户锁定的时间 天 一般用 dba 的身份去执行该命令 例子 指定 scott 这个用户最多只能尝试 3 次登陆 锁定时间为 2 天 让我们看看怎么实现 创建 profile 文件 SQL create profile lock account limit failed login attempts 3 password lock time 2 SQL alter user scott profile lock account 2 给账户 用户 解锁 SQL alter user tea account unlock 3 终止口令 为了让用户定期修改密码可以使用终止口令的指令来完成 同样这个命令也需要 dba 的身 份来操作 例子 给前面创建的用户 tea 创建一个 profile 文件 要求该用户每隔 10 天要修改自己的登 陆密码 宽限期为 2 天 看看怎么做 SQL create profile myprofile limit password life time 10 password grace time 2 SQL alter user tea profile myprofile 口令历史 概述 如果希望用户在修改密码时 不能使用以前使用过的密码 可使用口令历史 这样 oracle 就会将口令修改的信息存放到数据字典中 这样当用户修改密码时 oracle 就会对新 旧密码进行比较 当发现新旧密码一样时 就提示用户重新输入密码 例子 1 建立 profile SQL create profile password history limit password life time 10 password grace time 2 password reuse time 10 password reuse time 指定口令可重用时间即 10 天后就可以重用 2 分配给某个用户 删除 profile 概述 当不需要某个 profile 文件时 可以删除该文件 SQL drop profile password history casade 注意 文件删除后 用这个文件去约束的那些用户通通也都被释放了 加了 casade 就会把级联的相关东西也给删除掉 四 oracle 表的管理 数据类型 表创建删除 数据 CRUD 操作 oracle 的表的管理 表名和列的命名规则 必须以字母开头 长度不能超过 30 个字符 不能使用 oracle 的保留字 只能使用如下字符 A Z a z 0 9 等 oracle 支持的数据类型 字符类 char 定长 最大 2000 个字符 例子 char 10 小韩 前四个字符放 小韩 后添 6 个空格补全 如 小韩 varchar2 20 变长 最大 4000 个字符 例子 varchar2 10 小韩 oracle 分配四个字符 这样可以节省空间 clob character large object 字符型大对象 最大 4G char 查询的速度极快浪费空间 查询比较多的数据用 varchar 节省空间 数字型 number 范围 10 的 38 次方 到 10 的 38 次方 可以表示整数 也可以表示小数 number 5 2 表示一位小数有 5 位有效数 2 位小数 范围 999 99 到 999 99 number 5 表示一个 5 位整数 范围 99999 到 99999 日期类型 date 包含年月日和时分秒 oracle 默认格式 1 1 月 1999 timestamp 这是 oracle9i 对 date 数据类型的扩展 可以精确到毫秒 图片 blob 二进制数据 可以存放图片 声音 4G 一般来讲 在真实项目中是不会 把图片和声音真的往数据库里存放 一般存放图片 视频的路径 如果安全需 要比较高的话 则放入数据库 怎样创建表 建表 学生表 create table student 表名 xh number 4 学号 xm varchar2 20 姓名 sex char 2 性别 birthday date 出生日期 sal number 7 2 奖学金 班级表 CREATE TABLE class classId NUMBER 2 cName VARCHAR2 40 修改表 添加一个字段 SQL ALTER TABLE student add classId NUMBER 2 修改一个字段的长度 SQL ALTER TABLE student MODIFY xm VARCHAR2 30 修改字段的类型 或是名字 不能有数据 不建议做 SQL ALTER TABLE student modify xm CHAR 30 删除一个字段 不建议做 删了之后 顺序就变了 加就没问题 应为是加在后 面 SQL ALTER TABLE student DROP COLUMN sal 修改表的名字 很少有这种需求 SQL RENAME student TO stu 删除表 SQL DROP TABLE student 添加数据 所有字段都插入数据 INSERT INTO student VALUES A001 张三 男 01 5 月 05 10 oracle 中默认的日期格式 dd mon yy dd 日子 天 mon 月份 yy 2 位 的年 09 6 月 99 1999 年 6 月 9 日 修改日期的默认格式 临时修改 数据库重启后仍为默认 如要修改需要修改 注册表 ALTER SESSION SET NLS DATE FORMAT yyyy mm dd 修改后 可以用我们熟悉的格式添加日期类型 INSERT INTO student VALUES 002 MIKE 男 1905 05 06 10 插入部分字段 INSERT INTO student xh xm sex VALUES A003 JOHN 女 插入空值 INSERT INTO student xh xm sex birthday VALUES A004 MARTIN 男 null 问题来了 如果你要查询 student 表里 birthday 为 null 的记录 怎么写 sql 呢 错误写法 select from student where birthday null 正确写法 select from student where birthday is null 如果要查询 birthday 不为 null 则应该这样写 select from student where birthday is not null 修改数据 修改一个字段 UPDATE student SET sex 女 WHERE xh A001 修改多个字段 UPDATE student SET sex 男 birthday 1984 04 01 WHERE xh A001 修改含有 null 值的数据 不要用 null 而是用 is null SELECT FROM student WHERE birthday IS null 删除数据 DELETE FROM student 删除所有记录 表结构还在 写日志 可以恢复的 速度慢 Delete 的数据可以恢复 savepoint a 创建保存点 DELETE FROM student rollback to a 恢复到保存点 一个有经验的 DBA 在确保完成无误的情况下要定期创建还原点 DROP TABLE student 删除表的结构和数据 delete from student WHERE xh A001 删除一条记录 truncate TABLE student 删除表中的所有记录 表结构还在 不写日志 无法找回删除的记录 速度快 五 oracle 表查询 1 oracle 表基本查询 介绍 在我们讲解的过程中我们利用 scott 用户存在的几张表 emp dept 为大家演示如何使用 select 语句 select 语句在软件编程中非常有用 希望大家好好的掌握 emp 雇员表 clerk 普员工 salesman 销售 manager 经理 analyst 分析师 president 总裁 mgr 上级的编号 hiredate 入职时间 sal 月工资 comm 奖金 deptno 部门 dept 部门表 deptno 部门编号 accounting 财务部 research 研发部 operations 业务部 loc 部门所在地点 salgrade 工资级别 grade 级别 losal 最低工资 hisal 最高工资 简单的查询语句 查看表结构 DESC emp 查询所有列 SELECT FROM dept 切忌动不动就用 select SET TIMING ON 打开显示操作时间的开关 在下面显示查询操作花费的时间 CREATE TABLE users userId VARCHAR2 10 uName VARCHAR2 20 uPassw VARCHAR2 30 INSERT INTO users VALUES a0001 啊啊啊啊 aaaaaaaaaaaaaaaaaaaaaaa 从自己复制 加大数据量 大概几万行就可以了 可以用来测试 sql 语句执行效率 INSERT INTO users userId UNAME UPASSW SELECT FROM users SELECT COUNT FROM users 统计行数 查询指定列 SELECT ename sal job deptno FROM emp 如何取消重复行 DISTINCT SELECT DISTINCT deptno job FROM emp 查询 SMITH 所在部门 工作 薪水 SELECT deptno job sal FROM emp WHERE ename SMITH 注意 oracle 对内容的大小写是区分的 所以 ename SMITH 和 ename smith 是不同的 使用算术表达式 nvl null 问题 如何显示每个雇员的年工资 SELECT sal 13 nvl comm 0 13 年薪 ename comm FROM emp 使用列的别名 SELECT ename 姓名 sal 12 AS 年收入 FROM emp 如何处理 null 值 使用 nvl 函数来处理 如何连接字符串 SELECT ename is a job FROM emp 使用 where 子句 问题 如何显示工资高于 3000 的 员工 SELECT FROM emp WHERE sal 3000 问题 如何查找 1982 1 1 后入职的员工 SELECT ename hiredate FROM emp WHERE hiredate 1 1 月 1982 问题 如何显示工资在 2000 到 3000 的员工 SELECT ename sal FROM emp WHERE sal 2000 AND sal 500 or job MANAGER and ename LIKE J 使用 order by 字句 默认 asc 问题 如何按照工资的从低到高的顺序显示雇员的信息 SELECT FROM emp ORDER by sal 问题 按照部门号升序而雇员的工资降序排列 SELECT FROM emp ORDER by deptno sal DESC 使用列的别名排序 问题 按年薪排序 select ename sal nvl comm 0 12 年薪 from emp order by 年薪 asc 别名需要使用 号圈中 英文不需要 号 分页查询 等学了子查询再说吧 Clear 清屏命令 oracle 表复杂查询 说明 在实际应用中经常需要执行复杂的数据统计 经常需要显示多张表的数据 现在我们给大 家介绍较为复杂的 select 语句 数据分组 max min avg sum count 问题 如何显示所有员工中最高工资和最低工资 SELECT MAX sal min sal FROM emp e 最高工资那个人是谁 错误写法 select ename sal from emp where sal max sal 正确写法 select ename sal from emp where sal select max sal from emp 注意 select ename max sal from emp 这语句执行的时候会报错 说 ORA 00937 非单组 分组函数 因为 max 是分组函数 而 ename 不是分组函数 但是 select min sal max sal from emp 这句是可以执行的 因为 min 和 max 都是分组函数 就是说 如果列里面有一个分组函数 其它的都必须是分组函数 否则就出错 这是语法 规定的问题 如何显示所有员工的平均工资和工资总和 问题 如何计算总共有多少员工问题 如何 扩展要求 查询最高工资员工的名字 工作岗位 SELECT ename job sal FROM emp e where sal SELECT MAX sal FROM emp 显示工资高于平均工资的员工信息 SELECT FROM emp e where sal SELECT AVG sal FROM emp group by 和 having 子句 group by 用于对查询的结果分组统计 having 子句用于限制分组显示结果 问题 如何显示每个部门的平均工资和最高工资 SELECT AVG sal MAX sal deptno FROM emp GROUP by deptno 注意 这里暗藏了一点 如果你要分组查询的话 分组的字段 deptno 一定要出现在查询 的列表里面 否则会报错 因为分组的字段都不出现的话 就没办法分组了 问题 显示每个部门的每种岗位的平均工资和最低工资 SELECT min sal AVG sal deptno job FROM emp GROUP by deptno job 问题 显示平均工资低于 2000 的部门号和它的平均工资 SELECT AVG sal MAX sal deptno FROM emp GROUP by deptno having AVG sal 2000 对数据分组的总结 1 分组函数只能出现在选择列表 having order by 子句中 不能出现在 where 中 2 如果在 select 语句中同时包含有 group by having order by 那么它们的顺序是 group by having order by 3 在选择列中如果有列 表达式和分组函数 那么这些列和表达式必须有一个出现在 group by 子句中 否则就会出错 如 SELECT deptno AVG sal MAX sal FROM emp GROUP by deptno HAVING AVG sal select from salgrade GRADE LOSAL HISAL 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 SELECT e ename e sal s grade FROM emp e salgrade s WHERE e sal BETWEEN s losal AND s hisal 扩展要求 问题 显示雇员名 雇员工资及所在部门的名字 并按部门排序 SELECT e ename e sal d dname FROM emp e dept d WHERE e deptno d deptno ORDER by e deptno 注意 如果用 group by 一定要把 e deptno 放到查询列里面 自连接 自连接是指在同一张表的连接查询 问题 显示某个员工的上级领导的姓名 比如显示员工 FORD 的上级 SELECT worker ename boss ename FROM emp worker emp boss WHERE worker mgr boss empno AND worker ename FORD 子查询 什么是子查询 子查询是指嵌入在其他 sql 语句中的 select 语句 也叫嵌套查询 单行子查询 单行子查询是指只返回一行数据的子查询语句 请思考 显示与 SMITH 同部门的所有员工 思路 1 查询出 SMITH 的部门号 select deptno from emp WHERE ename SMITH 2 显示 SELECT FROM emp WHERE deptno select deptno from emp WHERE ename SMITH 数据库在执行 sql 是从左到右扫描的 如果有括号的话 括号里面的先被优先执行 多行子查询 多行子查询指返回多行数据的子查询 请思考 如何查询和部门 10 的工作相同的雇员的名字 岗位 工资 部门号 SELECT DISTINCT job FROM emp WHERE deptno 10 SELECT FROM emp WHERE job IN SELECT DISTINCT job FROM emp WHERE deptno 10 注意 不能用 job 因为等号 是一对一的 在多行子查询中使用 all 操作符 问题 如何显示工资比部门 30 的所有员工的工资高的员工的姓名 工资和部门号 SELECT ename sal deptno FROM emp WHERE sal all SELECT sal FROM emp WHERE deptno 30 扩展要求 大家想想还有没有别的查询方法 SELECT ename sal deptno FROM emp WHERE sal SELECT MAX sal FROM emp WHERE deptno 30 执行效率上 函数高得多 在多行子查询中使用 any 操作符 问题 如何显示工资比部门 30 的任意一个员工的工资高的员工姓名 工资和部门号 SELECT ename sal deptno FROM emp WHERE sal ANY SELECT sal FROM emp WHERE deptno 30 扩展要求 大家想想还有没有别的查询方法 SELECT ename sal deptno FROM emp WHERE sal SELECT min sal FROM emp WHERE deptno 30 多列子查询 单行子查询是指子查询只返回单列 单行数据 多行子查询是指返回单列多行数据 都是 针对单列而言的 而多列子查询是指查询返回多个列数据的子查询语句 请思考如何查询与 SMITH 的部门和岗位完全相同的所有雇员 SELECT deptno job FROM emp WHERE ename SMITH SELECT FROM emp WHERE deptno job SELECT deptno job FROM emp WHERE ename SMITH 在 from 子句中使用子查询 请思考 如何显示高于自己部门平均工资的员工的信息 思路 1 查出各个部门的平均工资和部门号 SELECT deptno AVG sal mysal FROM emp GROUP by deptno 2 把上面的查询结果看做是一张子表 SELECT e ename e deptno e sal ds mysal FROM emp e SELECT deptno AVG sal mysal FROM emp GROUP by deptno ds WHERE e deptno ds deptno AND e sal ds mysal 如何衡量一个程序员的水平 网络处理能力 数据库 程序代码的优化程序的效率要很高 小总结 在这里需要说明的当在 from 子句中使用子查询时 该子查询会被作为一个视图来对待 因 此叫做内嵌视图 当在 from 子句中使用子查询时 必须给子查询指定别名 注意 别名不能用 as 如 SELECT e ename e deptno e sal ds mysal FROM emp e SELECT deptno AVG sal mysal FROM emp GROUP by deptno as ds WHERE e deptno ds deptno AND e sal ds mysal 在 ds 前不能加 as 否则会报错 给表取别名的时候 不能加 as 但是给列取别名 是可 以加 as 的 分页查询 按雇员的 id 号升序取出 oracle 的分页一共有三种方式 1 根据 rowid 来分 select from t xiaoxi where rowid in select rid from select rownum rn rid from select rowid rid cid from t xiaoxi order by cid desc where rownum9980 order by cid desc 执行时间 0 03 秒 2 按分析函数来分 select from select t row number over order by cid desc rk from t xiaoxi t where rk9980 执行时间 1 01 秒 3 按 rownum 来分 select from select t rownum rn from select from t xiaoxi order by cid desc t where rownum9980 执行时间 0 1 秒 其中 t xiaoxi 为表名称 cid 为表的关键字段 取按 cid 降序排序后的第 9981 9999 条记录 t xiaoxi 表有 70000 多条记录 个人感觉 1 的效率最好 3 次之 2 最差 测试通过的分页查询 okokok select from select a1 rownum rn from select ename job from emp a1 where rownum 5 下面最主要介绍第三种 按 rownum 来分 1 rownum 分页 SELECT FROM emp 2 显示 rownum oracle 分配的 SELECT e ROWNUM rn FROM SELECT FROM emp e rn 相当于 Oracle 分配的行的 ID 号 3 挑选出 6 10 条记录 先查出 1 10 条记录 SELECT e ROWNUM rn FROM SELECT FROM emp e WHERE ROWNUM 6 是不行的 4 然后查出 6 10 条记录 SELECT FROM SELECT e ROWNUM rn FROM SELECT FROM emp e WHERE ROWNUM 6 5 几个查询变化 a 指定查询列 只需要修改最里层的子查询 只查询雇员的编号和工资 SELECT FROM SELECT e ROWNUM rn FROM SELECT ename sal FROM emp e WHERE ROWNUM 6 b 排序查询 只需要修改最里层的子查询 工资排序后查询 6 10 条数据 SELECT FROM SELECT e ROWNUM rn FROM SELECT ename sal FROM emp ORDER by sal e WHERE ROWNUM 6 用查询结果创建新表 这个命令是一种快捷的建表方式 CREATE TABLE mytable id name sal job deptno as SELECT empno ename sal job deptno FROM emp 创建好之后 desc mytable 和 select from mytable 看看结果如何 合并查询 合并查询 有时在实际应用中 为了合并多个 select 语句的结果 可以使用集合操作符号 union union all intersect minus 多用于数据量比较大的数据局库 运行速度快 1 union 该操作符用于取得两个结果集的并集 当使用该操作符时 会自动去掉结果集中重复行 SELECT ename sal job FROM emp WHERE sal 2500 UNION SELECT ename sal job FROM emp WHERE job MANAGER 2 union all 该操作符与 union 相似 但是它不会取消重复行 而且不会排序 SELECT ename sal job FROM emp WHERE sal 2500 UNION ALL SELECT ename sal job FROM emp WHERE job MANAGER 该操作符用于取得两个结果集的并集 当使用该操作符时 会自动去掉结果集中重复行 3 intersect 使用该操作符用于取得两个结果集的交集 SELECT ename sal job FROM emp WHERE sal 2500 INTERSECT SELECT ename sal job FROM emp WHERE job MANAGER 4 minus 使用改操作符用于取得两个结果集的差集 他只会显示存在第一个集合中 而不存在第二 个集合中的数据 SELECT ename sal job FROM emp WHERE sal 2500 MINUS SELECT ename sal job FROM emp WHERE job MANAGER MINUS 就是减法的意思 创建数据库有两种方法 1 通过 oracle 提供的向导工具 database Configuration Assistant 数据库配置助手 2 我们可以用手工步骤直接创建 七 java 操作 oracle java 连接 oracle 介绍 前面我们一直在 plsql 中操作 oracle 那么如何在 java 程序中操作数 据库呢 下面我们举例说明 写一个 java 分页显示 emp 表的用户信息 Java 代码 1 package com sp 2 3 import java sql Connection 4 import java sql DriverManager 5 import java sql ResultSet 6 import java sql Statement 7 8 演示 如何使用 jdbc odbc 桥连接方式 9 public class TestOracle 10 11 public static void main String args 12 try 13 14 1 加载驱动 15 Class forName sun jdbc odbc JdbcOdbcDriver 16 17 2 得到连接 18 Connection ct DriverManager getConnection 19 jdbc odbc testConnectOracle scott 20 21 tiger 22 23 从下面开始 和 SQL Server 一模一样 24 Statement sm ct createStatement 25 ResultSet rs sm executeQuery select from emp 26 while rs next 27 用户名 28 System out println 用户名 rs getString 2 29 默认是从 1 开始编号的 30 31 catch Exception e 32 e printStackTrace 33 34 35 在得到连接那里 要去配置数据源 点击控制面板 系统和安全 管理工具 数据源 ODBC 打开后点添加 如图 可以看到 有个 Oracle in OraDb10g home1 的驱动 它是 Oracle 安装完后自 动加上去的 选中后 点完成 再填如下信息 如图 这样配好后基本就可以了 但为了安全起见 建议大家测试一下 点击 Test Connection 按钮 测试通过后点 ok 然后数据源就生成了 如图 然后把数据源名称写进 jdbc odbc 里 这里要注意 jdbcodbc 能不能远程连接呢 不能远程连接 也就是你这样写的 话就意味着 java 程序和 oracle 数据库应该是在同一台机器上 因为这里没有 指定 IP 地址 肯定默认就是本地 如果要远程连 就用 jdbc jdbc 是可以远程 连的 运行 TestOracle java 控制台输出 可惜我没运行成功 说 java sql SQLException No suitable driver found for jdbc odbc testConnectOracle at java sql DriverManager getConnection Unknown Source at java sql DriverManager getConnection Unknown Source at com sp TestOracle main TestOracle java 18 不知道为什么 接下来讲解用 JDBC 的方式连接 Oracle Java 代码 1 package com sp 2 3 import java sql Connection 4 import java sql DriverManager 5 import java sql ResultSet 6 import java sql Statement 7 8 使用 jdbc 连接 oracle 9 public class TestOracle2 10 11 public static void main String args 12 try 13 14 1 加载驱动 15 Class forName oracle jdbc driver OracleDriver 16 17 2 得到连接 18 Connection ct DriverManager getConnection 19 20 jdbc oracle thin 127 0 0 1 1521 orcl scott tiger 21 22 从下面开始 和 SQL Server 一模一样 23 Statement sm ct createStatement 24 ResultSet rs sm executeQuery select from emp 25 while rs next 26 用户名 27 System out println 用户名 rs getString 2 28 默认是从 1 开始编号的 29 30 catch Exception e 31 e printStackTrace 32 33 34 记得要把驱动包引入 classes12 jar 运行 再次可惜 我还是没运行成功 错误是 java sql SQLException Io 异常 The Network Adapter could not establish the connection at oracle jdbc dbaccess DBError throwSqlException DBError java 134 at oracle jdbc dbaccess DBError throwSqlException DBError java 179 at oracle jdbc dbaccess DBError throwSqlException DBError java 334 at oracle jdbc driver OracleConnection OracleConnection java 418 at oracle jdbc driver OracleDriver getConnectionInstance OracleDriver java 521 at oracle jdbc driver OracleDriver connect OracleDriver java 325 at java sql DriverManager getConnection Unknown Source at java sql DriverManager getConnection Unknown Source at com sp TestOracle2 main TestOracle2 java 18 我也不知道为什么 幽怨了 接下来建个 web project 来测试 oracle 的分页 挺麻烦 不记录了 在 oracle 中操作数据 使用特定格式插入日期值 使用 to date 函数 请大家思考 如何插入列带有日期的表 并按照年 月 日的格式插入 insert into emp values 9998 xiaohong MANAGER 7782 to date 1988 12 12 yyyy mm dd 78 9 55 33 10 注意 insert into emp values 9998 xiaohong MANAGER 7782 12 12 月 1988 78 9 55 33 10 这句语句是可以成功运行的 使用子查询插入数据 介绍 当使用 valus 子句时 一次只能插入一行数据 当使用子查询插入数据时 一 条 inset 语句可以插入大量的数据 当处理行迁移或者装载外部表的数据到数 据库时 可以使用子查询来插入数据 把 emp 表中 10 号部门的数据导入到新表中 create table kkk myId number 4 myName varchar2 50 myDept number 5 insert into kkk myId myName myDept select empno ename deptno from emp where deptno 10 介绍 使用 update 语句更新数据时 既可以使用表达式或者数值直接修改数据 也可 以使用子查询修改 数据 问题 希望员工 SCOTT 的岗位 工资 补助与 SMITH 员工一样 update emp set job sal comm select job sal comm from emp where ename SMITH where ename SCOTT 八 oracle 中事务处理 什么是事务 事务用于保证数据的一致性 它由一组相关的 dml 语句组成 该组的 dml 数据 操作语言 增删改 没有查询 语句要么全部成功 要么全部失败 如 网上转账就是典型的要用事务来处理 用于保证数据的一致性 dml 数据操作语言 银行转账 QQ 申请 车票购买 事务和锁 当执行事务操作时 dml 语句 oracle 会在被作用的表上加锁 防止其它用 户修改表的结构 这里对我们的用户来来讲是非常重要的 其它进程排序 知道 1 号进程完成 锁打开 2 号进程进入 依次进行 如果有进程级别较高的 可以插队 提交事务 当执行用 commit 语句可以提交事务 当执行了 commit 语句之后 会确认事务 的变化 结束事务 删除保存点 释放锁 当使用 commit 语句结束事务之后 其它会话将可以查看到事务变化后的新数据 保存点就是为回退做的 保存点的个数没有限制 回退事务 在介绍回退事务前 我们先介绍一下保存点 savepoint 的概念和作用 保存 点是事务中的一点 用于取消部分事务 当结束事务时 会自动的删除该事务 所定义的所有保存点 当执行 rollback 时 通过指定保存点可以回退到指定的 点 这里我们作图说明 事务的几个重要操作 1 设置保存点 savepoint a 2 取消部分事务 rollback to a 3 取消全部事务 rollback 注意 这个回退事务 必须是没有 commit 前使用的 如果事务提交了 那么无 论你刚才做了多少个保存点 都统统没有 如果没有手动执行 commit 而是 exit 了 那么会自动提交 java 程序中如何使用事务 在 java 操作数据库时 为了保证数据的一致性 比如账户操作 1 从一个账 户中减掉 10 2 在另一个账户上加入 10 我们看看如何使用事务 Java 代码 1 package com sp 2 3 import java sql Connection 4 import java sql DriverManager 5 import java sql ResultSet 6 import java sql Statement 7 8 public class TestTrans 9 10 public static void main String args 11 try 12 13 1 加载驱动 14 Class forName oracle jdbc driver OracleDriver 15 16 2 得到连接 17 Connection ct DriverManager getConnection 18 jdbc oracle thin 127 0 0 1 1521 orcl s cott tiger 19 20 Statement sm ct createStatement 21 22 从 scott 的 sal 中减去 100 23 sm executeUpdate update emp set sal sal 100 where ename SCOTT 24 25 int i 7 0 26 27 给 smith 的 sal 加上 100 28 sm executeUpdate update emp set sal sal 100 where ename SMITH 29 30 关闭打开的资源 31 sm close 32 ct close 33 catch Exception e 34 e printStackTrace 35 36 37 38 39 运行 会出现异常 查看数据库 SCOTT 的 sal 减了 100 但是 SMITH 的 sal 却 不变 很可怕 我们怎样才能保证 这两个操作要么同时成功 要么同时失败呢 Java 代码 1 package com sp 2 3 import java sql Connection 4 import java sql DriverManager 5 import java sql SQLException 6 import java sql Statement 7 8 public class TestTrans 9 10 public static void main String args 11 Connection ct null 12 try 13 1 加载驱动 14 Class forName oracle jdbc driver OracleDriver 15 16 2 得到连接 17 ct DriverManager getConnection 18 jdbc oracle thin 127 0 0 1 1521 orcl s cott tiger 19 20 加入事务处理 21 ct setAutoCommit false 设置不能默认提交 22 23 Statement sm ct createStatement 24 25 从 scott 的 sal 中减去 100 26 sm executeUpdate update emp set sal sal 100 where ename SCOTT 27 28 int i 7 0 29 30 给 smith 的 sal 加上 100 31 sm executeUpdate update emp set sal sal 100 where ename SMITH 32 33 提交事务 34 mit 35 36 关闭打开的资源 37 sm close 38 ct close 39 catch Exception e 40 如果发生异常 就回滚 41 try 42 ct rollback 43 catch SQLException e1 44 e1 printStackTrace 45 46 e printStackTrace 47 48 49 50 51 再运行一下 会出现异常 查看数据库 数据没变化 只读事务 只读事务是指只允许执行查询的操作 而不允许执行任何其它 dml 操作的事务 使用只读事务可以确保用户只能取得某时间点的数据 假定机票代售点每天 18 点开始统计今天的销售情况 这时可以使用只读事务 在设置了只读事务后 尽管其它会话可能会提交新的事务 但是只读事务将不会取得最新数据的变化 从而可以保证取得特定时间点的数据信息 设置只读事务 set transaction read only 九 oracle 的函数 sql 函数的使用 字符函数 介绍 字符函数是 oracle 中最常用的函数 我们来看看有哪些字符函数 lower char 将字符串转化为小写的格式 upper char
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!