在sqlplus中使用变量,在生成的spool文件中怎么样才能不让他显示原有的和变量替换过的SQL语句?

chnic 2009-03-11 05:03:31
系统环境HP-UNIX + Oracle 10g
假如有一个sql文件 abc.sql


set pagesize 0
set feedback off
set heading off

spool /abc/123.spool

select count(1) from input_tbl where insert_date < add_months(sysdate,&1);

spool off
exit


我在shell中写了下述一行命令

sqlplus -s username/passsword@dbname@${HOME}abc.sql -2 把-2作为参数传入到 abc.sql文件中
现在遇到一个问题,在生成的123.spool文件中 第一行个第二行永远都是没有被变量替换和替换过的SQL语句。

old 1: select count(1) from input_tbl where insert_date < add_months(sysdate,&1)
new 1: select count(1) from input_tbl where insert_date < add_months(sysdate,-2)
1

因为生成的这个123.spool文件 我要继续拿来分析生成报表 实际上在这个文件中 只有第三行数字 1 才是我想要的结果
现在的问题是有什么办法 或者配置选项 能让生成的文件不显示第一行和第二行的SQL语句?

...全文
1149 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic6321 2009-03-27
  • 打赏
  • 举报
回复
我加了 SET VERIFY OFF 还是不起作用呢?
Linux scana 2.6.18-53.el5xen , Oracle Database 10g

set pagesize 0; -- 输出每页行数,缺省为24,为了避免分页,可设定为0
set heading off; -- 输出域标题,缺省为on
set echo off; -- 显示start启动的脚本中的每个sql命令,缺省为on
set feedback on; -- 回显本次sql命令处理的记录条数,缺省为on
set termout off; -- 显示脚本中的命令的执行结果,缺省为on
set trimout on; -- 去除标准输出每行的拖尾空格,缺省为off
set trimspool on; -- 去除重定向(spool)输出每行的拖尾空格,缺省为off
set linesize 30000; -- 输出一行字符个数,缺省为80
set numwidth 22; -- 输出number类型域长度,缺省为10
SET VERIFY OFF ; -- 去掉输出结果中的脚本回写
set colsep | -- 域输出分隔符 缺省为 TAB键
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; -- 修改日期显示格式

[gmcc@tmpana ~]$ cat test_spool2.txt
SQL> select * from tmp_user where rownum<10;
admin |8a7a7cad2022005c0120232b19f40013|admin |系统管理员 |0|
SQL>spool off;
chnic 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 oracledbalgtu 的回复:]
加上:
SET VERIFY OFF


引用楼主 chnic 的帖子:
系统环境HP-UNIX + Oracle 10g
假如有一个sql文件 abc.sql


SQL code
set pagesize 0
set feedback off
set heading off

spool /abc/123.spool

select count(1) from input_tbl where insert_date < add_months(sysdate,&1);

spool off
exit


我在shell中写了下述一行命令

sqlplus -s username/passsword@dbname@${HOME}abc.sql -2  把-2作为参数…
[/Quote]

谢谢 已经搞定 网上查了很多SQLPLUS的配置选项 都没有提过这个VERIFY 囧rz
oracledbalgtu 2009-03-11
  • 打赏
  • 举报
回复
加上:
SET VERIFY OFF



[Quote=引用楼主 chnic 的帖子:]
系统环境HP-UNIX + Oracle 10g
假如有一个sql文件 abc.sql


SQL code
set pagesize 0
set feedback off
set heading off

spool /abc/123.spool

select count(1) from input_tbl where insert_date < add_months(sysdate,&1);

spool off
exit




我在shell中写了下述一行命令

sqlplus -s username/passsword@dbname@${HOME}abc.sql -2 把-2作为参数传入到 abc.sql文件中
现在遇到一个问题,在生…
[/Quote]
第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24 §1.2.2 数据字典概念 25 §1.3 SQL、SQL*Plus及 PL/SQL 25 §1.3.1 SQL和SQL*PLUS的差别 25 §1.3.2 PL/SQL语言 27 §1.4 登录到SQL*PLUS 27 §1.4.1 UNIX环境 27 §1.4.2 Windows NT和WINDOWS/2000环境 29 §1.5 常用SQL*PLUS 附加命令简介 32 §1.5.1 登录到SQL*PLUS 32 §1.5.2 EXIT和QUIT 32 §1.5.3 DESCRIBE(显示表、视图结构) 33 §1.5.4 LIST(列出)命令 33 §1.5.5 Change(替换字符串)命令 34 §1.5.6 Append(追加字符串)命令 34 §1.5.7 Save保存当前缓冲区命令到文件 35 §1.5.8 GET将命令文件读到缓冲区 35 §1.5.9 SPOOL将信息记录到文件 36 §1.5.10 再运行当前缓冲区的命令 36 §1.6 常用数据字典简介 37 §1.7 ORACLE数据类型 38 §1.8 SQL 语句基础 44 §1.8.1 SQL语句所用符号 44 §1.8.2 简单select 查询 45 §1.9 伪列及伪表 46 §1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §2.2.4 单记录转换函数 65 §2.2.5 其它的单记录函数 68 §2.3 SQL的组函数 73 §2.3.1 多记录组函数 73 §2.3.2 带 GROUP BY 的计算 75 §2.3.3 用 HAVING 来限制分组的计算 75 §2.4 控制和格式化输出 76 §2.4.1 用 ORDER BY 子句来对结果进行排序 76 §2.4.2 用 BREAK 命令 来对结果进行排列 76 §2.4.3 用 COMPUTE 命令对结果进行格式化 79 §2.5 配置会话环境 82 §2.5.1 ARRAYSIZE(取回的行数) 82 §2.5.2 AUTOCOMMIT(自动提交) 83 §2.5.3 LINESIZE(行显示宽度) 83 §2.5.4 LONG(长类型显示字节数) 83 §2.5.5 PAGESIZE(页行数) 83 §2.5.6 PAUSE(暂停) 84 §2.5.7 SPACE(列间空格) 84 §2.5.8 Termout (启/停屏幕显示) 84 §2.5.9 ECHO (启/停命令显示) 84 §2.5.10 TRANSACTION (启动事务) 85 §2.5.11 SHOW ALL(列出所有参数) 85 §2.6 格式化输出 87 §2.6.1 一般数据的格式化输出 87 §2.6.2 日期的格式化输出 88 §2.7 加标题 89 §2.8 建立简单报告 90 §2.9 输入变量 91 第三章 表及索引的定义操作 94 §3.1 建立表结构 94 §3.1.1 建立表结构命令 94 §3.1.2 建立表结构例子 96 §3.1.3 建立临时表结构 97 §3.3 修改表结构 98 §3.3.1 修改表结构命令 98 §3.3.2 修改表结构例子 99 §3.3.3 删除表结构 101 §3.3.4 使用CHECK作限制约束 101 §3.3.5 使用UNRECOVERABLE创建表 102 §3.3.6 将表移动到新的数据段或新的表空间 102 §3.3.7 手工分配表的存储空间 104 §3.3.8 标记不使用的列和删除不使用的列 104 §3.3 主键 106 §3.3.1 创建主键 106 §3.3.2 改变主键 109 §3.3.3 删除主键 109 §3.4 外部键 110 §3.4.1 建立外部键 110 §3.4.2 修改外部键 112 §3.4.3 删除外部键 112 §3.5 索引 112 §3.5.1 建立索引 112 §3.5.2 修改索引 114 §3.5.3 删除索引 115 §3.6 新索引类型 115 §3.6.1 基于函数的索引 115 §3.6.2 反向键索引 117 §3.6.3 索引组织表 117 §3.7 抽象数据类型的使用 118 §3.8 大数据类型的使用 119 §3.8.1 可用数据类型 119 §3.8.2 为LOB数据类型指定存储 120 §3.8.3 操作和检索LOB数据 121 §3.9 表和索引有关的数据字典 124 §3.9.1 表和索引数据字典 124 §3.9.2 数据字典查询例子 125 第四章 视图、同义词和序列 128 §4.1 视图 128 §4.1.1 使用视图来修改表数据 128 §4.1.2 创建一个新视图 128 §4.1.3 删除一个视图 130 §4.1.4 改变视图 131 §4.2 实体视图(MATERIALIZED VIEW) 131 §4.2.1 创建实体视图 131 §4.2.2 创建实体视图日志 137 §4.2.3 修改实体视图 139 §4.2.4 修改实体视图日志 141 §4.2.45 实体视图完整例子 142 §4.3 序号(sequence) 146 §4.3.1 建立序号 146 §4.3.2 修改序号 147 §4.3.3 使用序号 147 §4.3.4 删除序号 147 §4.4 同义词 148 §4.4.1 建立同义词 148 §4.4.2 删除同义词 149 §4.5 视图、同义词和序列有关的数据字典 149 第五章 簇与分区 150 §5.1 簇( cluster ) 150 §5.1.0 簇概念 150 §5.1.1 建立簇 152 §5.1.2 改变簇 155 §5.1.3 删除簇 155 §5.1.4 删除簇索引 156 §5.1.5 收集簇信息 156 §5.2 分区 158 §5.2.1 分区的优点 158 §5.2.2 分区的方法 159 §5.2.3 创建表的分区 159 §5.2.3 创建索引的分区 164 §5.2.4 维护表分区和索引分区 167 §5.3 簇与分区有关的数据字典 169 §5.3.1 分区、簇数据字典列表 169 §5.3.2 基本的分区、簇信息查询 169 第六章 使用SQL 进行数据操作 170 §6.1 INSERT操作 170 §6.1.1 用文字插入操作 171 §6.1.2 用子查询插入操作 171 §6.2 UPDATE操作 172 §6.2.1 用文字更新操作 173 §6.2.2 用查询更新操作 173 §6.2.3 用相关子查询更新操作 174 §6.3 DETELE操作 174 §6.3.1 用delete删除全部记录的操作 174 §6.3.2 用delete有条件删除部分记录 175 §6.3.3 用delete分段删除大量记录 175 §6.4 insert、delete及update 的提交和撤消 176 §6.4.1 自动提交的设置 176 §6.4.2 保留点和撤消 177 第七章 复杂查询语句的使用 180 §7.1 复杂查询语句的使用 180 §7.1.1 相关子查询 180 §7.1.2 外连接 180 §7.1.3 自我连接 181 §7.1.4 UNION,INTERSECT及MINUS 182 §7.2 创建复杂的视图 183 §7.2.1 分组视图 183 §7.2.2 合计视图 183 §7.2.3 组合视图 184 §7.3 家族树 184 §7.3.1 排除单一体和分枝 184 §7.3.2 遍历至根 185 §7.4 在from 使用视图 187 第八章 一些高级的用法 188 §8.1 关于DECODE 188 §8.1.1 DECODE 的if-then-else逻辑 188 §8.1.2 DECODE 的简单例子 188 §8.1.3 DECODE实现表的转置 189 §8.2 关于访问远程数据库 192 §8.2.1 数据库链接 192 §8.2.2 使用同义词获得本地透明 193 §8.2.3 在视图使用user伪列 194 §8.2.4 使用COPY功能 195 §8.2.5 管理Oracle名称服务器 196 §8.3 关于上下文的使用 196 §8.3.1 设置上下文选项 196 §8.3.2 为上下文查询设置表 197 §8.3.3 优化文本索引 199 §8.4 关于维数(DIMENSION) 199 §8.4.1 CREATE DIMENSION语法 200 §8.4.2 创建维的例子 201 第九章 安全管理 203 §9.1 CREATE USER 命令 203 §9.2 建立用户 204 §9.2.1 外部验证(Authenticated )用户 204 §9.2.2 全局(Globally)验证用户-企业验证 204 §9.3 ALTER USER 命令 205 §9.4 DROP USER 命令 205 §9.5 GRANT 命令与REVOKE 命令 206 §9.5.1 GRANT 命令 206 §9.5.2 REVOKE 命令 206 §9.6 权限和角色 207 §9.6.1 建立角色 207 §9.6.2 给角色授权 208 §9.6.3 授权角色给用户 209 §9.7 有关的数据字典 209 §9.7.1 与用户、角色与权限有关的数据字典 209 §9.7.2 查询数据字典信息 209 第十章 其它一些常见问题及技巧 212 §10.1 一些常见问题 212 §10.1.1 Oracle与2000年问题 212 §10.1.2 如何正确插入日期数据 213 §10.1.3 在查询只返回满足条件的部分记录 214 §10.1.4 快速大量删除数据Truncate 215 §10.1.5 Rowid的使用 215 §10.1.6 在查询不让记录被更新 217 §10.1.7 EXCEPTIONS(违反完整性)问题 217 §10.1.8 Not in和Not Exists 218 §10.1.9 关于 COPY命令 218 §10.1.10 列值为NULL情形的处理 219 §10.1.11 使用 product_user_file来限制用户使用产品 220 §10.2 常用技巧 221 §10.2.1 long 类型的查询 222 §10.2.2 如何确定执行时间 222 §10.2.3 如何终止用户会话 222 §10.2.4 用TRANSLATE对数据加密和解密 224 §10.2.5 如何用查询来修改数据 225 §10.2.6 如何产生创建用户的脚本 226 §10.2.7 如何产生创建表结构的脚本 227 §10.2.8 如何产生创建视图的脚本 229 §10.2.9 如何产生创建序号的脚本 229 §10.2.10 如何为用户创建公共同义词 229 第二部分 Oracle PL/SQL基础 231 第十一章 PL/SQL 程序设计简介 231 §11.1 概述 231 §11.2 SQL与PL/SQL 231 §11.2.1 什么是PL/SQL? 231 §11.2.1 PL/SQL的好处 232 §11.2.1.1 有利于客户/服务器环境应用的运行 232 §11.2.1.2 适合于客户环境 232 §11.2.1.3 客户及服务器端的好处 232 §11.2.2 PL/SQL 可用的SQL语句 233 §11.3 运行PL/SQL程序 233 §11.4 PL/SQL内置包 234 第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE 240 §12.4.4 LOB类型 240 §12.4.5 用户定义的子类型 241 §12.4.6 数据类型的转换 243 §12.5 运算符和表达式(数据定义) 243 §12.5.1 关系运算符 243 §12.5.2 一般运算符 244 §12.5.3 逻辑运算符 244 §12.6 变量赋值 245 §12.6.1 字符及数字运算特点 245 §12.6.2 Boolean 赋值 245 §12.6.3 数据库赋值 245 §12.6.4 可转换的类型赋值 246 §12.7 变量作用范围以可见性 248 §12.8 注释 248 §12.9 简单例子 249 §12.9.1 简单数据插入例子 249 §12.9.2 简单数据删除例子 249 第十三章PL/SQL 处理流程 250 §13.1 条件语句 250 §13.2 循环 251 §13.3 标号和GOTO 254 §13.4 NULL 语句 255 第十四章 光标的使用 255 §14.1 光标概念 255 §14.1.1 处理显式光标 255 §14.1.2 处理隐式光标 257 §14.2 光标循环 258 §14.2.1 简单循环 258 §14.2.2 WHILE循环 259 §14.2.3 光标 FOR 循环 260 §14.2.4 关于NO_DATA_FOUND和%NOTFOUND 260 §14.2.5 SELECT FOR UPDATE 光标 261 §14.3 光标变量 262 §14.3.1 声明光标变量 262 §14.3.2 为光标变量分配存储空间 262 §14.3.3 打开光标变量 262 §14.3.4 关闭光标变量 262 §14.3.5 光标变量例子 263 §14.3.6 光标变量 265 第十五章 错误处理 267 §15.1 异常处理概念 267 §15.1.1 预定义的异常处理 267 §15.1.2 触发异常情态 268 §15.1.3 处理异常情态 269 §15.1.4 用户定义的异常处理 270 §15.2 异常情态传播 271 §15.2.1 在执行部分引发异常情态 271 §15.2.2 在声明部分引发异常情态 272 §15.3 异常处理编程 273 §15.4 在 PL/SQL 使用 sqlcode,sqlerrm 273 第十六章 存储过程和函数 276 §16.1 引言 276 §16.2 存储过程 276 §16.2.1 创建过程 276 §16.2.2 使用过程 278 §16.2.3 开发存储过程步骤 279 §16.2.3.1 编辑存储过程源码 279 §16.2.3.2 对存储过程程序进行解释 279 §16.2.3.3 调试源码直到正确 279 §16.2.3.4 授权执行权给相关的用户或角色 279 §16.2.4 与存储过程相关数据字典 280 §16.3 创建函数 281 §16.4 过程和函数的例外处理 282 §16.4.1 使用系统定义的例外处理 282 §16.4.1.1 没有例外处理的缺点 283 §16.4.1.2 使用预定义的例外处理 283 §16.4.2 使用用户定义的例外处理+ 286 §16.4.2.1 定义的用户例外处理 286 §16.4.2.2 使用户EXCEPTION_INIT处理 286 §16.4.2.3 使用户raise_application_error处理 286 第十七章 创建包和使用包 287 §17.1 引言 287 §17.2 包的定义 288 §17.3 包的开发步骤 289 §17.4 包的头部说明 289 §17.5 包体的说明 290 §17.6 删除过程、函数和包 293 §17.7 包的管理 293 §17.7.1 包有关的数据字典 293 §17.7.2 包无效对象的查询和编译 294 §17.7.3 包源代码的导出 296 第十八章 触发器 297 §18.1 触发器类型 297 §18.1.1 DML触发器 297 §18.1.2 替代触发器 298 §18.1.3 系统触发器 298 §18.2 创建触发器 298 §18.2.1 创建DML触发器 299 §18.2.2 创建替代(Instead_of)触发器 300 §18.2.3 创建系统触发器 300 §18.2.4 触发器触发次序 302 §18.2.5 使用触发器谓词 302 §18.3 删除和使能触发器 303 §18.4 创建触发器的限制 304 §18.5 变异表 305 §18.5.1 变异表典型例子 307 §18.5.2 变异表错误的处理 308 §18.6 触发器数据字典与管理 309 §18.6.1 触发器数据字典 309 §18.6.2 无效触发器的编译 310 第十九章 外部存储过程 311 §19.1 什么是外部例程 311 §19.2 C外部例程 311 §19.2.1 调用步骤 312 §19.2.2 参数映射( 转换) 317 第二十章 会话间通信 319 §20.1 DBMS_PIPE 319 §20.1.1 发送消息 319 §20.1.2 接收消息 320 §20.1.3 示例 321 §20.2 DBMS_ALERT 340 §20.2.1 使用警告 341 §20.2.2 警告所用的各个过程 341 §20.2.3 警告例子 342 §20.3 DBMS_PIPE 和 DBMS_ALERT 343 第二十一章 数据库作业和文件I/O 344 §21.1 数据库作业 344 §21.1.1后台进程 344 §21.1.2运行作业 344 §21.1.3失效作业 346 §21.1.4删除作业 347 §21.1.5修改作业参数 348 §21.1.6与作业参数有关数据字典 350 §21.2 文件I/O 350 §21.2.1 安全性 351 §21.2.2 打开和关闭文件 351 §21.2.3文件输出 353 §21.2.3文件输入 354 §21.2.4文件操作例子 354 第二十二章 在PL/SQL 使用SQL语句 355 §22.1在PL/SQL 使用DML语句 355 §22.2 伪列 357 §22.3 GRANT、REVOKE 和权限 358 §22.3.1 对象和系统权限 358 §22.3.2 GRANT和REVOKE命令语法 358 §22.4 事务控制 359 §22.4.1 COMMIT 和 ROLLBACK 359 §22.4.2 保留点 SAVEPOINT 360 §22.5 在PL/SQL使用SQL函数 361 §22.5.1 错误处理函数 362 §22.5.2 数字函数 362 第二十三章 PL/SQL程序的测试和调试 363 §23.1 问题诊断 363 §23.1.1 调试指南 363 §23.1.2 显示在编译产生的错误 363 §23.2 插入测试表 364 §23.3 DBMS_OUTPUT的使用 364 §23.4 PL/SQL调试器 365 §23.4.1 Procedure Builder调试器 365 §23.4.2 SQL-Station调试器 366 §23.5 程序设计方法 366 §23.5.1 模块化程序设计 366 §23.5.2 自顶向下设计 366 §23.5.3 数据抽象 366 第二十四章 性能及其它问题 367 §24.1共享池 367 §24.1.1 共享池工作原理 367 §24.1.2 估计共享池大小 368 §24.1.3 将PL/SQL 驻留在共享池 369 §24.2 SQL 语句调整 370 §24.3 网络问题 373 §24.4 PL/SQL wrap(转换器) 373 §24.4.1 运行 wrap实用程序 373 §24.4.2 输入和输出文件 374 §24.5 DBMS_OUTPUT的使用 374 第二十五章 对象类型 376 §25.1 对象类型定义 376 §25.1.1 定义对象类型头 376 §25.1.2 定义对象类型体 376 §25.1.3 定义对象类型例子 377 §25.1.4 初始化对象类型 378 §25.1.5 使用对象类型 379 §25.2 对象类型修改 381 §25.3 对象类型删除 381 第二十六章 动态PL/SQL简介 383 §26.1 概述 383 §26.1.1 静态SQL和动态SQL 383 §26.1.2 用DBMS_SQL 包实现动态 383 §26.1.3 用本地动态SQL实现动态 385 §26.2 使用DBMS_SQL进行动态编程 385 §26.2.1 执行DML、DDL及Alter session语句 385 §26.2.2 示例 388 §26.2.3 执行DDL 语句 389 §26.2.4 执行PL/SQL 块 390 §26.4 本地动态SQL 391 §26.4.1使用EXECUTE IMMEDIATE语句 391 §26.4.2向后兼容情况 392 §26.4.3指定参数模式 393 第二十七章 LOB和DBMS_LOB包简介 394 §27.1 LOB类型一般使用 394 §27.1.1 LOB类型存储 395 §27.1.2 临时LOB类型 395 §27.1.3 LOB类型的接口 396 §27.2 一般LOB表与数据加载 396 §27.2.1 建立包含LOB的表 396 §27.2.2 用EMPTY_CLOB或EMPTY_BLOB插入LOB 398 §27.2.3 一般的LOB插入 399 §27.3 内部LOB和DBMS_LOB的使用 399 §27.3.1 APPEND过程 400 §27.3.2 CLOSE过程 401 §27.3.3 COMPARE函数 401 §27.3.4 COPY过程 403 §27.3.5 ERASE过程 405 §27.3.6 GETCHUNKSIZE函数 406 §27.3.7 GETLENGTH函数 407 §27.3.8 INSTR函数 408 §27.3.9 READ过程 409 §27.3.10 SUBSTR函数 410 §27.3.11 WRITE过程 411 §27.3.12 WRITEAPPEND过程 412 §27.4临时LOB 413 §27.4.1 建立临时LOB 413 §27.4.2 查看临时LOB 414 §27.4.3 释放临时LOB 414 §27.4.4 从BFILE加载临时LOB 415 §27.4.5 查看临时LOB是否打开 415 §27.4.6 显示临时LOB数据 416 §27.4.7 从临时LOB读数据 417 §27.4.8 从临时LOB读部分数据 418 §27.4.9 比较两个临时LOB数据 419 §27.4.10 查看临时LOB模式的存在 420 §27.4.11 得到临时LOB的长度 421 §27.4.12 拷贝部分临时LOB数据 421 §27.4.13 为临时LOB拷贝位置 422 §27.4.14 加临时LOB到另外的LOB 423 §27.4.15 写追加到临时LOB 424 §27.4.16 写数据到临时LOB 424 §27.4.17 修理临时LOB数据 425 §27.4.18 删除临时LOB数据 426 §27.5外部LOB (BFILE) 426 §27.5.1 BFILE目录指定 426 §27.5.2 建立包括BFILE列的表 427 §27.5.3 用BFILENAME()插入数据 428 §27.5.4 从另外表选择BFILE插入数据 429 §27.5.5 用初始化BFILE位置来插入数据BFILE行 429 §27.5.6 动态加载数据BFILE的表 429 §27.5.7 用BFILE数据来加载LOB数据 430 §27.5.8 用FILEOPEN打开BFILE 431 §27.5.9 用OPEN打开BFILE 431 §27.5.10 用FILEISOPEN看BFILE是否打开 431 §27.5.11 用ISOPEN看BFILE是否打开 432 §27.5.12 显示BFILE 432 §27.5.13 从BFILE读数据 433 §27.5.14 读部分BFILE 433 §27.5.15 比较BFILE 434 §27.5.16 判断BFILE是否存在模式 434 §27.5.17 判断BFILE是否存在 435 §27.5.18 得到BFILE长度 435 §27.5.19 拷贝BFILE的LOB位置 436 §27.5.20 得到目录别名和文件名字 436 §27.5.21 用初始化BFILE位置更新BFILE 437 §27.5.22 用FILECLOSE关闭BFILE 437 §27.5.23 用CLOSE关闭BFILE 437 §27.5.24 用CLOSEALL关闭所有BFILE 438 §27.5.25 用DELETE等删除BFILE数据 438 §27.6 使用SQL*loader加载LOB 438 §27.6.1 加载图象和文本文件 438 §27.6.2 加载文本文件 439 第二十八章 PL/SQL编程技巧 442 §28.1用触发器实现日期格式的自动设置 442 §28.2如何避免TOO_MANY_ROWS错误 443 §28.3如何解决TOO_MANY_ROWS问题 446 §28.4如何在PL/SQL使用数组 447 §28.5如何使用触发器完成数据复制 448 §28.6在PL/SQL实现Truncate 449 §28.7如何导出存储过程、触发器的代码 450 附录A:SQL及SQL*PLUS 命令参考 459
先登陆服务器: telnet 192.168.0.23 公帐号: openlab-open123 tarena-tarena 再进入SQL:sqlplus sd0807/sd0807 帐号:sd0807-密码同样 公帐号:openlab-open123 设置环境变量: ORACLE_SID=oral10g\ --变局部变量 export ORACLE_SID --变全局变量 unset ORACLE_SID --卸载环境变量 ORACLE_HOME=... --安装路径;直接用一句语句也可以,如下 export ORACLE_HOME=/oracledata/.../bin: 一、注意事项: 大小写不敏感,即不区分大小写。提倡关键字大写,便于阅读和调式。 “!”在SQL环境下执行Unix命令。 SQL语句是由简单的英语单词构成;这些英语单词称为关键字/保留字,不做它用。SQL由多个关键字构成。 SQL语句由子句构成,有些子句是必须的,有些是可选的。 在处理SQL语句时,其所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。 SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后加分号,但特定的DBMS可能必须在单条SQL语句后加分号。 SQL语句的最后一句要以 “;”号结束 二、写子句顺序 Select column,group_function From table [Where condition] [Group by group_by_expression] [Having group_condition] …… [Order by column]; --最后 三、常用简单语句: clear screen:清屏 edit:编辑刚才的一句。 desc/describe:(列出所有列名称) 用法: DESCRIBE [schema.]object[@db_link] dual:亚表,临时用。如:desc dual;/from dual; rollback:回溯,回溯到上次操作前的状态,把这次事务操作作废,只有一次(DDL和DCL语句会自动提交,不能回溯)。 可以用commit语句提交,这样就回溯不回了。 set pause on\off :设置分屏(设置不分屏) set pause "please put an enter key" 且 set pause on:设置带有提示的分屏 oerr ora 904 :查看错误 set head off :去掉表头 set feed off :去掉表尾 保存在oracle数据库的所有操作细节: spool oracleday01.txt :开始记录 spool off :开始保存细节 四、SELECT语句:选择操作、投影操作。 select:从一个或多个表检索一个或多个数据列。包含信息:想选择什么表,从什么地方选择。必须要有From子句。(最常用) 当从多张表里查询的时候,会产生笛卡尔积;可用条件过滤它。 当两个表有相同字段时必须加前缀,列名前需加表名和“.”,如“s_emp.id”。 1、用法:SELECT columns,prod2,prod3<列> FROM Table1,table2<表名> 分号结束 如: select id from s_emp; select last_name,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;--列表每人所在部门 SELECT * FROM Products; --检索所有列。 数据太多时,最好别使用上句,会使DBMS降低检索和应用程序的性能。(*通配符) 2、对数据类型的列可进行运算(如加减乘除)。 3、对列起别名:有直接起别名,加AS起别名,用双引号起别名等三种方法 (单引号,引起字符串;双引号,引起别名。起别名有符号,或者区分大小写时,必须用双引号) 多表查询时,可给表起别名。(给列起别名,列<空格>列别名;给表起别名,表<空格>表别名;)。 如:Select first_name EMPLOYEES, 12*(salary+100) AS MONEY, manager_id "ID1" From s_emp E; 4、字段的拼接,可用双竖线(双竖线只能用于select语句里)。不同的DBMS可能使用不同的操作符;拼接的字段同样可以起别名。 如:Select first_name ||' '|| last_name || ', '|| title "Employees" From s_emp; 排他锁:Select id,salary From s_emp where id=1 For Update; 可以阻止他人并发的修改,直到你解锁。 如果已有锁则自动退出:Select id,salary From s_emp where id=1 For Update NoWait; FOR UPDATE :可以再加 OF 精确到某格。如: ... For Update OF salary ... 注意要解锁。 五、ORDER BY 子句,排序 Order by:按某排序列表(默认升序 asc,由低到高;可加 desc,改成降序由高到低) 检索返回数据的顺序没有特殊意义,为了明确地排序用 SELECT 语句检索出的数据,可使用 ORDER BY 子句。 ORDER BY 子句取一个或多个列的名字。 对空值,按无穷大处理(升序,空值排最后;降序排最前)。 1、用法:Select prod_id,prod_price,prod_name From Products Order By prod_price,prod_name; (从左到右执行排序,先排price) ORDER BY子句使用的列将是为显示所选择的列,但是实际上并不一定要这样,用非检索的列排序数据是完全合法的。 为了按多个列排序,列名之间用逗号分开。 2、支持按相对列位置进行排序。 输入 SELECT prod_id,prod_price,prod_name FROM Products ORDER BY 2,3 --(2指price,3指name) 3、升序、降序。默认是升序(asc,从小到大排序),想降序时用desc。 如:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC; 注意:DESC 关键字只应用到直接位于其前面的列名。如果想在多个列上进行排序,必须对每个列指定DESC关键字。 升序是默认的,可不写,但降序必须写。 六、WHERE子句,选择、过滤 其后只能跟逻辑语句,返回值只有ture或false 如: select last_name,salary from s_emp where salary=1000;--找出工资1000的人 WHERE子句操作符: 1、逻辑比较运算符 = 等于 != 不等于,还有(<> ^= 这两个同样表示不等于) > 大于 >= 大于等于 < 小于 <= 小于等于 2、SQL 比较运算符 between…and… :在两者之间。(BETWEEN 小值 AND 大值) 如:select last_name,salary from s_emp where salary between 1000 and 1500; --工资1000到1500的人,包括1000和1500。 in(列表):在列表里面的。 如:select last_name,dept_id from s_emp where dept_id in(41,42);第41、42部门的人 like : 包含某内容的。模糊查询 可以利用通配符创建比较特定数据的搜索模式,通配符只能用于文本,非文本数据类型不能使用通配符。 通配符在搜索模式任意位置使用,并且可以使用多个通配符。 通配符%表示任何字符出现任意次数;还能代表搜索模式给定位置的0个或多个字符。下划线匹配单个任意字符。 如:select table_name from user_tables where table_name like 'S\_%' escape'\'; ' 找出“S_“开头的,由于下划线有任意字符的含义,故需另外定义转移符。 但习惯用“\”,为方便其他程序员阅读和检测,一般不改用其他的。 like 'M%':M开头的 like '_a%':第二个字符是a的 like '%a%'所有含a的 (“_”表示一个任意字符;“%”表示任意多个任意字符。) 单引号里面的内容,大小写敏感。单引号用来限定字符串, 如果将值与串类型的列进行比较,则需要限定引号;用来与数值列进行比较时,不用引号。 is null:是空。(NULL表示不包含值。与空格、0是不同的。) 如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL; 七、高级检索(逻辑运算符): 通常我们需要根据多个条件检索数据。可以使用AND或OR、NOT等连接相关的条件 计算次序可以通过圆括号()来明确地分组。不要过分依赖默认计算次序,使用圆括号()没有坏处,它能消除二义性。 and:条件与 如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 AND vend_id=‘DELL’ or:条件或 (注: and 的优先级比 or 更高,改变优先级可用括号) 如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 OR vend_id=‘DELL’ not:条件非。否定它之后所跟的任何条件 否定的SQL 比较运算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL: (注意,按英语习惯用 is not,而不是 not is) NOT 与 IN 在一起使用时,NOT 是找出与条件列表不匹配的行。 IN 列表里有 NULL 时不处理,不影响结果;用 NOT IN 时,有 NULL 则出错,必须排除空值再运算。 in :选择列表的条件 使用IN操作符的优点: 在长的选项清单时,语法直观; 计算的次序容易管理; 比 OR 操作符清单执行更快;最大优点是可以包含其他 SELECT 语句,使用能够动态地建立 WHERE 子句。 如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’); 八、单行函数: 函数一般在数据上执行,它给数据的转换和处理提供了方便。不同的DBMS提供的函数不同。 函数可能会带来系统的不可移植性(可移植性:所编写的代码可以在多个系统上运行)。 加入注释是一个使用函数的好习惯。 大多数SQL实现支持以下类型的函数: 文本处理, 算术运算, 日期和时间, 数值处理。 Null:空值 空值当成无穷大处理,所有空值参与的运算皆为空。 空值与空值并不相等,因为空值不能直接运算。 如:prod_price="" 这种写法是错的(不要受到corejava的影响) prod_price=NULL 这种写法是错的(不要受到corejava的影响) prod_price IS NULL 这种写法才是对的 NVL:处理空值,把空值转化为指定值。可转化为日期、字符、数值等三种(注意:转化时,两参数必须要同类型) 如:NVL(date, '01-JAN-95') NVL(title,'NO Title Yet') NVL(salary,0) 错误写法: Select last_name,title,salary*commission_pct/100 COMM From s_emp;--没提成的人没法显示工资 正确写法: Select last_name,title,salary*NVL(commission_pct,0)/100 COMM From s_emp;--把提成是空值的转化为0 DISTINCT:过滤重复 把重复的行过滤掉;多个字段组合时,只排除组合重复的。 DISTINCT必须使用列名,不能使用计算或者表达式。 所有的聚合函数都可以使用。如果指定列名,则DISTINCT只能用于COUNT(列名),DISTINCT不能用于COUNT(*)。 如:Select Distinct name From s_dept; Select Distinct dept_id,title From s_emp; 文本处理: TRIM()/LTRIM()/RTIRM():去空格。只能去掉头和尾的空格,间的不理。 trim(' heo Are fdou ') --> heo Are fdou 输入:select trim(' heo Are fdou ') from dual; -->:heo Are fdou LOWER:转小写 lower('SQL Course') --> sql course UPPER:转大写 upper(' SQL Course') --->SQL COURSE INITCAP:首字母转大写,其余转小写 initcap(SQL Course') '--> Sql Course CONCAT:合成。双竖线只能在select语句里面用,这个可用于任何语句。 Concat('Good','String') --> GoodString SUBSTR:截取。 Substr('String', 1 ,3) --> Str 第一个数字“1”,表示从第几个开始截取;若要从倒数第几个开始,用负数,如“-2”表示倒数第2个。 上式第2个数字“3”表示截取多少个。 LENGTH:统计长度。 Length('String') --> 6 NVL:转换空值 日期和时间处理: Oracle日期格式:DD-MMM-YYYY (D代表日期date,M代表月month,Y代表年year) 如:SELECT prod_name (DAY表示完整的星期几,DY显示星期的前三个字母) FROM Products WHERE prod_time BETWEEN to_date(’01-JAN-2008’) AND to_date(’31-DEC-2008’); 日期可以进行加减,默认单位是1天。日期与日期可以相减,得出天数;日期与日期但不能相加。 sysdate -> 系统的当天 Months_Between('01-Sep-95','11-Jan-94') --> 19.774194 相差多少个月,Between里面也可以填函数。 Add_months('11-Jan-94',6) --> 11-Jul-94 增加多少个月 Next_day('01-Sep-95','Friday') --> '08-Sep-95' 下一个星期五。其的'Friday'可用6替代,因为星期日=1 Last_day('01-Sep-95') --> '30-Sep-95' 这个月的最后一天 数值处理:可以运用于代数,三角,几何 ROUND:四舍五入 Round(45.925,2) -> 45.93 Round(45.925,0) -> 46 Round(45.925,-1) -> 50 逗号前一个数是要处理的数据源,后一个参数表示保留多少位小数。 后一参数是负数时,表示舍去小数点前的几位,例3是舍去个位及其后的。不写后一参数时,默认不保留小数。 TRUNC:舍去末位。直接舍去,不会进位。 Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92 Trung(45.925,2) -> 45.92 日期的舍取: 常用的数值处理函数有: ABS() 绝对值 ABS(-5741.5854) --> 5741.5854 PI() 圆周率 注意:oracle不支持 PI()函数;MYSql 支持PI()函数。 SIN() 正统值 Oracle还支持COS()、ASIN()、ACOS()函数 SQRT() 平方根 转化: TO_CHAR(number,'fmt'):把数值转换成字符串 显示数字的命令 9:正常显示数字; 0:显示包括0的数值形式,空位强制补0; $:以美元符号显示货币; L:按当前环境显示相关的货币符号; . 和,:在固定位置出现“.”点 和“,”逗号;不够位时,四舍五入。 例题:SQL> select 'Order'||To_char(id)|| 2 'was filled for a total of' 3 ||To_char(total,'fm$9,999,999') 4 from s_ord 5 where ship_date ='21-SEP-92'; TO_NUMBER(char):把字符转换成数字 九、链接 内链接:严格匹配两表的记录。 外链接分左链接和右链接: 会使用一方表的所有记录去和另一格表的记录按条件匹配,空值也会匹配,这个表的所有记录都会显示, 数据库会模拟出记录去和那些不匹配的记录匹配。 左链接 加号在右面 如:有 TABLE1 TABLE2 1的一条记录在2里面没有匹配上,那么1里面的记录保留 2的一条记录在1里面没有匹配上 ,那么2丢弃 右链接正好相反 --例题:哪些人是领导。 select distinct b.id,b.last_name manager from s_emp a,s_emp b where a.manager_id=b.id(+); 左右顺序有区别,这是另外新建一个表,要显示的是第二个表格的内容。 +放在没有匹配行的表一侧,令表格能完整显示出来。 标准写法:内连接用INNER,左连接用LEFT,右连接用RIGHT。 select distinct b.id,b.last_name manager from s_emp a LEFT join s_emp b ON a.manager_id=b.id; 十、组函数: 分组允许将数据分为多个逻辑组,以便能对每个组进行聚集计算。 Group:分组 Group by:分组。(默认按升序对所分的组排序;想要降序要用 order by)可以包括任意数目的列。 如果嵌入了分组,数据将在最后规定的分组上进行汇总。 GROUP BY 子句列出的每个列都必须是检索列或有效的表达式,但不能是聚集函数。 *如果在SELECT 使用表达式,则必须在GROUP BY子句指定相同的表达式,不能使用别名。 除聚合计算语句外,SELECT语句的每个列都必须在GROUP BY子句给出。 如果分组列具有NULL值,则NULL将作为一个分组返回。如果列有多行NULL,它们将分为一组。 Having:过滤。分组之后,不能再用where,要用having 选择过滤。Having不能单独存在,必须跟在group by后面。 WHERE在数据分组前进行过滤,HAVING在数据分组后过滤。 可以在SQL同时使用 WHERE和HAVING,先执行WHERE,再执行HAVING。 聚合函数: AVG:平均值 (忽略值为NULL的行,但不能用 AVG(*)) COUNT:计数 (Count(列)不计算空值;但 COUNT(*)表示统计表所有行数,包含空值) MAX:最大值 (忽略列值为 NULL 的行。但有些DBMS还允许返回文本列的最大值, 在作用于文本数据时,如果数据按照相应的列排序,则 MAX()返回最后一行。) MIN:最小值 (忽略值为 NULL 的行。不能用 MIN(*)。一般是找出数值或者日期值的最小值。 但有些DBMS还允许返回文本列的最小值,这时返回文本最前一行) SUM:求和 (忽略值为 NULL 的值。SUM 不能作用于字符串类型,而 MAX(),MIN()函数能。也不能 SUM(*)) 子查询:查询语句的嵌套 可以用于任意select 语句里面,但子查询不能出现 order by。 子查询总是从内向外处理。作为子查询的SELECT 语句只能查询单个列,企图检索多个列,将会错误。 如:找出工资最低的人select min(last_name),min(salary) from s_emp; 或者用子查询select last_name,salary from s_emp where salary=(select min(salary) from s_emp); E-R图:属性: E(Entity) -R(Relationship) * (Mandatory marked 强制的) 强制的非空属性 o (Optional marked 可选的) 可选属性(可以有值也可以没有) #* (Primary marked ) 表示此属性唯一且非空 约束:针对表的字段进行定义的。 PK:primary key (主键约束,PK=UK+NN)保证实体的完整性,保证记录的唯一 主键约束,唯一且非空,并且每一个表只能有一个主键,有两个字段联合作为主键, 只有两个字段放在一起唯一标识记录,叫做联合主键(Composite Primary Key)。 FK:foreign key (外建约束)保证引用的完整性,外键约束,外键的取值是受另外一张表的主键或唯一值的约束,不能够取其他值, 只能够引用主键会唯一键的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表); child table(子表),要想创建子表,就要先创建父表,后创建子表,记录的插入也是如此,先父表后子表, 删除记录,要先删除子表记录,后删除父表记录, 要修改记录,如果要修改父表的记录要保证没有被子表引用。要删表时,要先删子表,后删除父表。 U:unique key(唯一键 UK),值为唯一,不能重复。 在有唯一性约束的列,可以有多个空值,因为空值不相等。 NN:NOT NULL,不能为空。 index(索引)是数据库特有的一类对象,实际应用一定要考虑索引,view(示图) 数量关系: 一对一关系 多对一关系 一对多关系 多对多关系 范式: 好处:降低数据冗余;减少完整性问题;标识实体,关系和表 第一范式(First normal form:1Nf),每一个属性说一件事情。所有的属性都必须是单值,也就是属性只表示单一的意义。 (记录可以重复,会有大量冗余,没有任何限制) 第二范式(2N范式),最少有一个属性要求唯一且非空PK,其他跟他有关联(记录不可重复,但是数据可能会出现冗余)。 第三范式(3N范式),非主属性只能依赖于主属性,不能依赖于其他非主属性。(解决数据冗余问题,不能存在推理能得出的数据) 一般情况会做到第三范式。 创建表: Create Table 表名 (字段名1 类型(数据长度)(default ...) 约束条件, 字段名2 类型(数据长度) 约束条件 ); 建表的名称: 必须字母开头;最多30字符;只能使用“A~Z、a~z、0~9、_、$、#”; 同一目录下不能有同名的表;表名不能跟关键字、特殊含意字符同样。 如:create table number_1 (n1 number(2,4), n2 number(3,-1), n3 number); create table t_sd0808(id number(12) primary key,name varchar(30) not null); MySQL的: create table student (oid int primary key, ACTNO varchar(20) not null unique, BALANCE double); --MySQL的number类型分小类了,Oracle只有number,且MySQL的数值型不用定大小 Oracle的: create table t_ad (oid number(15) primary key, ACTNO varchar(20) not null unique,BALANCE number(20)); INSERT:插入(或添加)行到数据库表的关键字。 插入方式有以下几种:插入完整的行;插入行的一部分;插入某些查询的结果。 对于INSERT操作,可能需要客户机/服务器的DBMS的特定的安全权限。 插入行(方式一) INSERT INTO products VALUES(2008,’TV’,222.22,’US’); 依赖于表定义的顺序,不提倡使用。有空值时需要自己补上。 插入行(方式二) INSERT INTO products(id,name,price,vend_name) VALUES(2008,’TV’,222.22,’US’); 依赖于逻辑顺序,会自动补上空值,提倡使用。 插入检索出的数据:可以插入多条行到数据库表 INSERT INTO products(*,*,*,*) SELECT *,*,*,* FROM products_copy; 如果这个表为空,则没有行被插入,不会产生错误,因为操作是合法的。 可以使用WHERE加以行过滤。 复制表: 将一个表的内容复制到一个全新的表(在运行创建,开始可以不存在) CREATE TABLE 新表名 AS SELECT * FROM 表名; INSERT INTO 与 CREATE TABLE AS SELECT 不同,前者是导入数据,而后者是导入表。 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY。 可利用联接从多个表插入数据。不管从多少个表检索数据,数据都只能插入到单个表。 更新数据 UPDATE 语句 需要提供以下信息:要更新的表;列名和新值;确定要更新的哪些行的过滤条件。 UPDATE 表名 SET vend_name = ‘HP’, prod_name = ‘NEWCOMPUTER’ WHERE vend_name = ‘IBM’; --UPDATE 语句可以使用子查询,使得能用SELECT语句检索出的数据更新列数据。也可以将一个列值更新为 NULL。 删除数据 DELETE 语句 DELETE FROM products WHERE prod_name = ‘COMPUTER’; 全行删除,不要省略WHERE,注意安全。 DELETE不需要列名或通配符。删除整行而不是删除列。DELETE是删除表的内容而不是删除表。 如果想从表删除所有内容,可以使用TRUNCATE TABLE语句(清空表格),它更快。 数字字典表: Sequence:排列。存储物理地址 Index:索引。依附于表,为提高检索速度。 View:视图。看到表的一部分数据。 限制数据访问。简化查询。数据独立性。本质上是一个sql查询语句。 Create[or Relace][Force|noForce] View 视图名 [(alias[,alias]…)] 别名列表 As subquery [With Check Option [Constraint ……]] [With Read Only] 注意:有些DBMS不允许分组或排序视图,不能有 Order by 语句。可以有 Select 语句。 删除视图: DROP VIEW 视图名 Rownum:纬列。内存里排序的前N个。 在where语句,可以用=1,和<=N 或 N。 因为这是内存读取,没有1就丢弃再新建1。只能从1开始。需要从间开始时,需二重子rownum语句需取别名。 经典应用: Top-n Analysis (求前N名或最后N名) Select [查询列表], Rownum From (Select [查询列表(要对应)] From 表 Order by Top-N_字段) Where Rownum <= N 分页显示: --取工资第5~10名的员工(二重子rownum语句,取别名) select rn,id,last_name,salary From ( select id,last_name,salary,Rownum rn From (Select id,last_name,salary from s_emp order by salary desc) where rownum <= 10) where rn between 5 and 10; Union:合并表 Select … Union Select… 把两个Select语句的表合并。 要求两表的字段数目和类型按顺序对应。合并后的表,自动过滤重复的行。 Intersect:交。 同上例,把两个Select表相交。 Minus:减。 把相交的内容减去。 not exists 除运算。 添加字段(列): Alter Table 表名 Add (column dataype [Default expr][Not Null] [,column datatype]…); 添加有非空限制的字段时,要加Default语句 字段名字不可以直接改名,需要添加新字段,再复制旧字段后删除旧字段。 添加约束: Alter Table 表名 Add [CONSTRAINT constraint] type (column); 添加非空约束时,要用Modify语句。 查看约束名时,可以违反约束再看出错提示;或者查看约束字典desc user_constraints 减少字段: Alter Table 表名 Drop (column [,column]…); 删除约束: Alter Table 表名 Drop CONSTRAINT column; 或: Alter Table 表名 Drop Primary Key Cascade; 暂时关闭约束,并非删除: Alter Table 表名 Disable CONSTRAINT column Cascade; 打开刚才关闭的约束: Alter Table 表名 Enable CONSTRAINTcolumn; 修改字段: Alter Table 表名 Modify (column dataype [Default expr][Not Null] [,column datatype]…); 修改字段的类型、大小、约束、非空限制、空值转换。 删除表: 会删除表的所有数据,所有索引也会删除,约束条件也删除,不可以roll back恢复。 Drop Table 表名 [Cascade Constraints]; 加 [Cascade Constraints] 把子表的约束条件也删除;但只加 [Cascade]会把子表也删除。 改表名: Rename 原表名 To 新表名; 清空表格: TRUNCATE TABLE 表名; 相比Delete,Truncate Table清空很快,但不可恢复。清空后释放内存。 Delete 删除后可以roll back。清空后不释放内存。
1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>sqlplus SQL>connect internal SQL>startup SQL>quit b、关闭ORACLE系统 oracle>sqlplus SQL>connect internal SQL>shutdown SQL>quit 启动oracle9i数据库命令: $ sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Production on Fri Oct 31 13:53:53 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> connect / as sysdba Connected to an idle instance. SQL> startup^C SQL> startup ORACLE instance started. 2、在双机环境下 要想启动或关闭ORACLE系统必须首先切换到root用户,如下 su - root a、启动ORACLE系统 hareg -y oracle b、关闭ORACLE系统 hareg -n oracle Oracle数据库有哪几种启动方式 说明: 有以下几种启动方式: 1、startup nomount 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库 读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。 2、startup mount dbname 安装启动,这种方式启动下可执行: 数据库日志归档、 数据库介质恢复、 使数据文件联机或脱机, 重新定位数据文件、重做日志文件。 执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置, 但此时不对数据文件和日志文件进行校验检查。 3、startup open dbname 先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件, 这种方式下可访问数据库的数据。 4、startup,等于以下三个命令 startup nomount alter database mount alter database open 5、startup restrict 约束方式启动 这种方式能够启动数据库,但只允许具有一定特权的用户访问 非特权用户访问时,会出现以下提示: ERROR: ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用 6、startup force 强制启动方式 当不能关闭数据库时,可以用startup force来完成数据库的关闭 先关闭数据库,再执行正常启动数据库命令 7、startup pfile=参数文件名 带初始化参数文件的启动方式 先读取参数文件,再按参数文件的设置启动数据库 例:startup pfile=E:Oracleadminoradbpfileinit.ora 8、startup EXCLUSIVE 二、用户如何有效地利用数据字典  ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化, 体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。 数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。   很多时候,一般的ORACLE用户不知道如何有效地利用它。   dictionary   全部数据字典表的名称和解释,它有一个同义词dict dict_column   全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句: SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES'; 依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; 2、表 查看用户下所有的表 SQL>select * from user_tables; 查看名称包含log字符的表 SQL>select object_name,object_id from user_objects where instr(object_name,'LOG')>0; 查看某表的创建时间 SQL>select object_name,created from user_objects where object_name=upper('&table_name'); 查看某表的大小 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name'); 查看放在ORACLE的内存区里的表 SQL>select table_name,cache from user_tables where instr(cache,'Y')>0; 3、索引 查看索引个数和类别 SQL>select index_name,index_type,table_name from user_indexes order by table_name; 查看索引被索引的字段 SQL>select * from user_ind_columns where index_name=upper('&index_name'); 查看索引的大小 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&index_name'); 4、序列号 查看序列号,last_number是当前值 SQL>select * from user_sequences; 5、视图 查看视图的名称 SQL>select view_name from user_views; 查看创建视图的select语句 SQL>set view_name,text_length from user_views; SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小 SQL>select text from user_views where view_name=upper('&view_name'); 6、同义词 查看同义词的名称 SQL>select * from user_synonyms; 7、约束条件 查看某表的约束条件 SQL>select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints where table_name = upper('&table_name'); SQL>select c.constraint_name,c.constraint_type,cc.column_name from user_constraints c,user_cons_columns cc where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position; 8、存储函数和过程 查看函数和过程的状态 SQL>select object_name,status from user_objects where object_type='FUNCTION'; SQL>select object_name,status from user_objects where object_type='PROCEDURE'; 查看函数和过程的源代码 SQL>select text from all_source where wner=user and name=upper('&plsql_name'); 三、查看数据库的SQL 1、查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name; 2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滚段名称及大小 select segment_name, tablespace_name, r.status, (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, max_extents, v.curext CurExtent From dba_rollback_segs r, v$rollstat v Where r.segment_id = v.usn(+) order by segment_name ; 4、查看控制文件 select name from v$controlfile; 5、查看日志文件 select member from v$logfile; 6、查看表空间的使用情况 select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name; SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE, (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE" FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME; 7、查看数据库库对象 select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status; 8、查看数据库的版本 Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle'; 9、查看数据库的创建日期和归档方式 Select Created, Log_Mode, Log_Mode From V$Database; 四、ORACLE用户连接的管理 用系统管理员,查看当前数据库有几个用户连接: SQL> select username,sid,serial# from v$session; 如果要停某个连接用 SQL> alter system kill session 'sid,serial#'; 如果这命令不行,找它UNIX的进程数 SQL> select pro.spid from v$session ses,v$process pro where ses.sid=21 and ses.paddr=pro.addr; 说明:21是某个连接的sid数 然后用 kill 命令杀此进程号。 五、SQL*PLUS使用 a、近入SQL*Plus $sqlplus 用户名/密码 退出SQL*Plus SQL>exit b、在sqlplus下得到帮助信息 列出全部SQL命令和SQL*Plus命令 SQL>help 列出某个特定的命令的信息 SQL>help 命令名 c、显示表结构命令DESCRIBE SQL>DESC 表名 d、SQL*Plus的编辑命令 显示SQL缓冲区命令 SQL>L 修改SQL命令 首先要将待改正行变为当前行 SQL>n 用CHANGE命令修改内容 SQL>c/旧/新 重新确认是否已正确 SQL>L 使用INPUT命令可以在SQL缓冲区增加一行或多行 SQL>i SQL>输入内容 e、调用外部系统编辑器 SQL>edit 文件名 可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件定义如下一行 DEFINE_EDITOR=vi f、运行命令文件 SQL>START test SQL>@test 常用SQL*Plus语句 a、表的创建、修改、删除 创建表的命令格式如下: create table 表名 (列说明列表); 为基表增加新列命令如下: ALTER TABLE 表名 ADD (列说明列表) 例:为test表增加一列Age,用来存放年龄 sql>alter table test add (Age number(3)); 修改基表列定义命令如下: ALTER TABLE 表名 MODIFY (列名 数据类型) 例:将test表的Count列宽度加长为10个字符 sql>alter atble test modify (County char(10)); b、将一张表删除语句的格式如下: DORP TABLE 表名; 例:表删除将同时删除表的数据和表的定义 sql>drop table test c、表空间的创建、删除 六、ORACLE逻辑备份的SH文件 完全备份的SH文件:exp_comp.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/export/db_comp$rq.dmp" 累计备份的SH文件:exp_cumu.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager full=y inctype=cumulative file=/oracle/export/db_cumu$rq.dmp" 增量备份的SH文件: exp_incr.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager full=y inctype=incremental file=/oracle/export/db_incr$rq.dmp" root用户crontab文件 /var/spool/cron/crontabs/root增加以下内容 0 2 1 * * /oracle/exp_comp.sh 30 2 * * 0-5 /oracle/exp_incr.sh 45 2 * * 6 /oracle/exp_cumu.sh 当然这个时间表可以根据不同的需求来改变的,这只是一个例子。 七、ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个单引号''. 字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验. 日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒 或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’) TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC. 年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS INSERT时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包. INSERT时如果要用到从1开始自动增长的序列号, 应该先建立一个序列号 CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 其最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999 INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL 2.DELETE (删除数据表里记录的语句) DELETE FROM表名 WHERE 条件; 注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused. 如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间 TRUNCATE TABLE 表名; 此操作不可回退. 3.UPDATE (修改数据表里记录的语句) UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件; 如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 最好在修改前进行非空校验; 值N超过定义的长度会出错, 最好在插入前进行长度校验.. 注意事项: A. 以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令 COMMIT 才能正式生效, 否则改变不一定写入数据库里. 如果想撤回这些操作, 可以用命令 ROLLBACK 复原. B. 在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, 应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段. 程序响应慢甚至失去响应. 如果记录数上十万以上这些操作, 可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理. 二.数据定义 (DDL) 部分 1.CREATE (创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等) ORACLE常用的字段类型有 CHAR 固定长度的字符串 VARCHAR2 可变长度的字符串 NUMBER(M,N) 数字型M是位数总长度, N是小数的长度 DATE 日期类型 创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面 创建表时可以用文的字段名, 但最好还是用英文的字段名 创建表时可以给字段加上默认值, 例如 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间 创建表时可以给字段加上约束条件 例如 不允许重复 UNIQUE, 关键字 PRIMARY KEY 2.ALTER (改变表, 索引, 视图等) 改变表的名称 ALTER TABLE 表名1 TO 表名2; 在表的后面增加一个字段 ALTER TABLE表名 ADD 字段名 字段名描述; 修改表里字段的定义描述 ALTER TABLE表名 MODIFY字段名 字段名描述; 给表里的字段加上约束条件 ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名); ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名); 把表放在或取出数据库的内存区 ALTER TABLE 表名 CACHE; ALTER TABLE 表名 NOCACHE; 3.DROP (删除表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等) 删除表和它所有的约束条件 DROP TABLE 表名 CASCADE CONSTRAINTS; 4.TRUNCATE (清空表里的所有记录, 保留表的结构) TRUNCATE 表名; 三.查询语句 (SELECT) 部分 SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 条件; 字段名可以带入函数 例如: COUNT(*), MIN(字段名), MAX(字段名), AVG(字段名), DISTINCT(字段名), TO_CHAR(DATE字段名,'YYYY-MM-DD HH24:MI:SS') NVL(EXPR1, EXPR2)函数 解释: IF EXPR1=NULL RETURN EXPR2 ELSE RETURN EXPR1 DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数 解释: IF AA=V1 THEN RETURN R1 IF AA=V2 THEN RETURN R2 ..… ELSE RETURN NULL LPAD(char1,n,char2)函数 解释: 字符char1按制定的位数n显示,不足的位数用char2字符串替换左边的空位 字段名之间可以进行算术运算 例如: (字段名1*字段名1)/3 查询语句可以嵌套 例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2; 两个查询语句的结果可以做集合操作 例如: 并集UNION(去掉重复记录), 并集UNION ALL(不去掉重复记录), 差集MINUS, 交集INTERSECT 分组查询 SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] GROUP BY字段名1 [HAVING 条件] ; 两个以上表之间的连接查询 SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2. 字段名 [ AND ……] ; SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2. 字段名(+) [ AND ……] ; 有(+)号的字段位置自动补空值 查询结果集的排序操作, 默认的排序是升序ASC, 降序是DESC SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] ORDER BY字段名1, 字段名2 DESC; 字符串模糊比较的方法 INSTR(字段名, ‘字符串’)>0 字段名 LIKE ‘字符串%’ [‘%字符串%’] 每个表都有一个隐含的字段ROWID, 它标记着记录的唯一性. 四.ORACLE里常用的数据对象 (SCHEMA) 1.索引 (INDEX) CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, ……] ); ALTER INDEX 索引名 REBUILD; 一个表的索引最好不要超过三个 (特殊的大表除外), 最好用单字段索引, 结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引 ORACLE8.1.7字符串可以索引的最大长度为1578 单字节 ORACLE8.0.6字符串可以索引的最大长度为758 单字节 2.视图 (VIEW) CREATE VIEW 视图名AS SELECT …. FROM …..; ALTER VIEW视图名 COMPILE; 视图仅是一个SQL查询语句, 它可以把表之间复杂的关系简洁化. 3.同义词 (SYNONMY) CREATE SYNONYM同义词名FOR 表名; CREATE SYNONYM同义词名FOR 表名@数据库链接名; 4.数据库链接 (DATABASE LINK) CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘数据库连接字符串’; 数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义. 数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样 数据库全局名称可以用以下命令查出 SELECT * FROM GLOBAL_NAME; 查询远端数据库里的表 SELECT …… FROM 表名@数据库链接名; 五.权限管理 (DCL) 语句 1.GRANT 赋于权限 常用的系统权限集合有以下三个: CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理) 常用的数据对象权限有以下五个: ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名, DELETE ON 数据对象名, INSERT ON 数据对象名, ALTER ON 数据对象名 GRANT CONNECT, RESOURCE TO 用户名; GRANT SELECT ON 表名 TO 用户名; GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2; 2.REVOKE 回收权限 REVOKE CONNECT, RESOURCE FROM 用户名; REVOKE SELECT ON 表名 FROM 用户名; REVOKE SELECT, INSERT, DELETE ON表名 FROM 用户名1, 用户名2; 查询数据库第63号错误: select orgaddr,destaddr from sm_histable0116 where error_code='63'; 查询数据库开户用户最大提交和最大下发数: select MSISDN,TCOS,OCOS from ms_usertable; 查询数据库各种错误代码的总和: select error_code,count(*) from sm_histable0513 group by error_code order by error_code; 查询报表数据库话单统计种类查询。 select sum(Successcount) from tbl_MiddleMt0411 where ServiceType2=111 select sum(successcount),servicetype from tbl_middlemt0411 group by servicetype 导文件exp和imp 例子: exp cjxt/cjxt tables=dcardres file=dcardres.dmp impgzcj/gzcj@oracletables=dcardres file=dcardres.dmp 查看有没有锁表 SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, o.owner,o.object_name,o.object_type,s.sid,s.serial# FROM v$locked_object l,dba_objects o,v$session s WHERE l.object_id=o.object_id AND l.session_id=s.sid [Q]怎么杀掉特定的数据库会话 [A] Alter system kill session 'sid,serial#'; 或者 alter system disconnect session 'sid,serial#' immediate; 在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程) 在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程 [Q]怎么快速查找锁与锁等待 [A]数据库的锁是比较耗费资源的, 特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。 这个语句将查找到数据库所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。 可以通过alter system kill session ‘sid,serial#’来杀掉会话 SELECT /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK', 'TX','ROW LOCK', NULL) LOCK_LEVEL, o.owner,o.object_name,o.object_type, s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser FROM v$session s,v$lock l,dba_objects o WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username is NOT NULL 如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待 以下的语句可以查询到谁锁了表,而谁在等待。 SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, o.owner,o.object_name,o.object_type,s.sid,s.serial# FROM v$locked_object l,dba_objects o,v$session s WHERE l.object_id=o.object_id AND l.session_id=s.sid ORDER BY o.object_id,xidusn DESC ------------------------------- ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>shutdown SVRMGR>quit 启动oracle9i数据库命令: $ sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Production on Fri Oct 31 13:53:53 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> connect / as sysdba Connected to an idle instance. SQL> startup^C SQL> startup ORACLE instance started. 2、在双机环境下 要想启动或关闭ORACLE系统必须首先切换到root用户,如下 su - root a、启动ORACLE系统 hareg -y oracle b、关闭ORACLE系统 hareg -n oracle Oracle数据库有哪几种启动方式 说明: 有以下几种启动方式: 1、startup nomount 非安装启动,这种方式启动下可执行:重建控制文件、重建数据库 读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。 2、startup mount dbname 安装启动,这种方式启动下可执行: 数据库日志归档、 数据库介质恢复、 使数据文件联机或脱机, 重新定位数据文件、重做日志文件。 执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置, 但此时不对数据文件和日志文件进行校验检查。 3、startup open dbname 先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件, 这种方式下可访问数据库的数据。 4、startup,等于以下三个命令 startup nomount alter database mount alter database open 5、startup restrict 约束方式启动 这种方式能够启动数据库,但只允许具有一定特权的用户访问 非特权用户访问时,会出现以下提示: ERROR: ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用 6、startup force 强制启动方式 当不能关闭数据库时,可以用startup force来完成数据库的关闭 先关闭数据库,再执行正常启动数据库命令 7、startup pfile=参数文件名 带初始化参数文件的启动方式 先读取参数文件,再按参数文件的设置启动数据库 例:startup pfile=E:Oracleadminoradbpfileinit.ora 8、startup EXCLUSIVE 二、用户如何有效地利用数据字典  ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化, 体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。 数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。   很多时候,一般的ORACLE用户不知道如何有效地利用它。   dictionary   全部数据字典表的名称和解释,它有一个同义词dict dict_column   全部数据字典表里字段名称和解释 如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句: SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES'; 依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; 2、表 查看用户下所有的表 SQL>select * from user_tables; 查看名称包含log字符的表 SQL>select object_name,object_id from user_objects where instr(object_name,'LOG')>0; 查看某表的创建时间 SQL>select object_name,created from user_objects where object_name=upper('&table_name'); 查看某表的大小 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name'); 查看放在ORACLE的内存区里的表 SQL>select table_name,cache from user_tables where instr(cache,'Y')>0; 3、索引 查看索引个数和类别 SQL>select index_name,index_type,table_name from user_indexes order by table_name; 查看索引被索引的字段 SQL>select * from user_ind_columns where index_name=upper('&index_name'); 查看索引的大小 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&index_name'); 4、序列号 查看序列号,last_number是当前值 SQL>select * from user_sequences; 5、视图 查看视图的名称 SQL>select view_name from user_views; 查看创建视图的select语句 SQL>set view_name,text_length from user_views; SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小 SQL>select text from user_views where view_name=upper('&view_name'); 6、同义词 查看同义词的名称 SQL>select * from user_synonyms; 7、约束条件 查看某表的约束条件 SQL>select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints where table_name = upper('&table_name'); SQL>select c.constraint_name,c.constraint_type,cc.column_name from user_constraints c,user_cons_columns cc where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position; 8、存储函数和过程 查看函数和过程的状态 SQL>select object_name,status from user_objects where object_type='FUNCTION'; SQL>select object_name,status from user_objects where object_type='PROCEDURE'; 查看函数和过程的源代码 SQL>select text from all_source where owner=user and name=upper('&plsql_name'); 三、查看数据库的SQL 1、查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name; 2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滚段名称及大小 select segment_name, tablespace_name, r.status, (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, max_extents, v.curext CurExtent From dba_rollback_segs r, v$rollstat v Where r.segment_id = v.usn(+) order by segment_name ; 4、查看控制文件 select name from v$controlfile; 5、查看日志文件 select member from v$logfile; 6、查看表空间的使用情况 select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name; SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE, (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE" FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME; 7、查看数据库库对象 select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status; 8、查看数据库的版本 Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle'; 9、查看数据库的创建日期和归档方式 Select Created, Log_Mode, Log_Mode From V$Database; 四、ORACLE用户连接的管理 用系统管理员,查看当前数据库有几个用户连接: SQL> select username,sid,serial# from v$session; 如果要停某个连接用 SQL> alter system kill session 'sid,serial#'; 如果这命令不行,找它UNIX的进程数 SQL> select pro.spid from v$session ses,v$process pro where ses.sid=21 and ses.paddr=pro.addr; 说明:21是某个连接的sid数 然后用 kill 命令杀此进程号。 五、SQL*PLUS使用 a、近入SQL*Plus $sqlplus 用户名/密码 退出SQL*Plus SQL>exit b、在sqlplus下得到帮助信息 列出全部SQL命令和SQL*Plus命令 SQL>help 列出某个特定的命令的信息 SQL>help 命令名 c、显示表结构命令DESCRIBE SQL>DESC 表名 d、SQL*Plus的编辑命令 显示SQL缓冲区命令 SQL>L 修改SQL命令 首先要将待改正行变为当前行 SQL>n 用CHANGE命令修改内容 SQL>c/旧/新 重新确认是否已正确 SQL>L 使用INPUT命令可以在SQL缓冲区增加一行或多行 SQL>i SQL>输入内容 e、调用外部系统编辑器 SQL>edit 文件名 可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件定义如下一行 DEFINE_EDITOR=vi f、运行命令文件 SQL>START test SQL>@test 常用SQL*Plus语句 a、表的创建、修改、删除 创建表的命令格式如下: create table 表名 (列说明列表); 为基表增加新列命令如下: ALTER TABLE 表名 ADD (列说明列表) 例:为test表增加一列Age,用来存放年龄 sql>alter table test add (Age number(3)); 修改基表列定义命令如下: ALTER TABLE 表名 MODIFY (列名 数据类型) 例:将test表的Count列宽度加长为10个字符 sql>alter atble test modify (County char(10)); b、将一张表删除语句的格式如下: DORP TABLE 表名; 例:表删除将同时删除表的数据和表的定义 sql>drop table test c、表空间的创建、删除 六、ORACLE逻辑备份的SH文件 完全备份的SH文件:exp_comp.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager full=y inctype=complete file=/oracle/export/db_comp$rq.dmp" 累计备份的SH文件:exp_cumu.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager full=y inctype=cumulative file=/oracle/export/db_cumu$rq.dmp" 增量备份的SH文件: exp_incr.sh rq=` date +"%m%d" ` su - oracle -c "exp system/manager full=y inctype=incremental file=/oracle/export/db_incr$rq.dmp" root用户crontab文件 /var/spool/cron/crontabs/root增加以下内容 0 2 1 * * /oracle/exp_comp.sh 30 2 * * 0-5 /oracle/exp_incr.sh 45 2 * * 6 /oracle/exp_cumu.sh 当然这个时间表可以根据不同的需求来改变的,这只是一个例子。 七、ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个单引号''. 字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验. 日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒 或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’) TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC. 年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS INSERT时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包. INSERT时如果要用到从1开始自动增长的序列号, 应该先建立一个序列号 CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 其最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999 INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL 2.DELETE (删除数据表里记录的语句) DELETE FROM表名 WHERE 条件; 注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些被删除的数据块标成unused. 如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间 TRUNCATE TABLE 表名; 此操作不可回退. 3.UPDATE (修改数据表里记录的语句) UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件; 如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 最好在修改前进行非空校验; 值N超过定义的长度会出错, 最好在插入前进行长度校验.. 注意事项: A. 以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令 COMMIT 才能正式生效, 否则改变不一定写入数据库里. 如果想撤回这些操作, 可以用命令 ROLLBACK 复原. B. 在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, 应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段. 程序响应慢甚至失去响应. 如果记录数上十万以上这些操作, 可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理. 二.数据定义 (DDL) 部分 1.CREATE (创建表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等) ORACLE常用的字段类型有 CHAR 固定长度的字符串 VARCHAR2 可变长度的字符串 NUMBER(M,N) 数字型M是位数总长度, N是小数的长度 DATE 日期类型 创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面 创建表时可以用文的字段名, 但最好还是用英文的字段名 创建表时可以给字段加上默认值, 例如 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间 创建表时可以给字段加上约束条件 例如 不允许重复 UNIQUE, 关键字 PRIMARY KEY 2.ALTER (改变表, 索引, 视图等) 改变表的名称 ALTER TABLE 表名1 TO 表名2; 在表的后面增加一个字段 ALTER TABLE表名 ADD 字段名 字段名描述; 修改表里字段的定义描述 ALTER TABLE表名 MODIFY字段名 字段名描述; 给表里的字段加上约束条件 ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名); ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名); 把表放在或取出数据库的内存区 ALTER TABLE 表名 CACHE; ALTER TABLE 表名 NOCACHE; 3.DROP (删除表, 索引, 视图, 同义词, 过程, 函数, 数据库链接等) 删除表和它所有的约束条件 DROP TABLE 表名 CASCADE CONSTRAINTS; 4.TRUNCATE (清空表里的所有记录, 保留表的结构) TRUNCATE 表名; 三.查询语句 (SELECT) 部分 SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 条件; 字段名可以带入函数 例如: COUNT(*), MIN(字段名), MAX(字段名), AVG(字段名), DISTINCT(字段名), TO_CHAR(DATE字段名,'YYYY-MM-DD HH24:MI:SS') NVL(EXPR1, EXPR2)函数 解释: IF EXPR1=NULL RETURN EXPR2 ELSE RETURN EXPR1 DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数 解释: IF AA=V1 THEN RETURN R1 IF AA=V2 THEN RETURN R2 ..… ELSE RETURN NULL LPAD(char1,n,char2)函数 解释: 字符char1按制定的位数n显示,不足的位数用char2字符串替换左边的空位 字段名之间可以进行算术运算 例如: (字段名1*字段名1)/3 查询语句可以嵌套 例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2; 两个查询语句的结果可以做集合操作 例如: 并集UNION(去掉重复记录), 并集UNION ALL(不去掉重复记录), 差集MINUS, 交集INTERSECT 分组查询 SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] GROUP BY字段名1 [HAVING 条件] ; 两个以上表之间的连接查询 SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2. 字段名 [ AND ……] ; SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2. 字段名(+) [ AND ……] ; 有(+)号的字段位置自动补空值 查询结果集的排序操作, 默认的排序是升序ASC, 降序是DESC SELECT字段名1, 字段名2, …… FROM 表名1, [表名2, ……] ORDER BY字段名1, 字段名2 DESC; 字符串模糊比较的方法 INSTR(字段名, ‘字符串’)>0 字段名 LIKE ‘字符串%’ [‘%字符串%’] 每个表都有一个隐含的字段ROWID, 它标记着记录的唯一性. 四.ORACLE里常用的数据对象 (SCHEMA) 1.索引 (INDEX) CREATE INDEX 索引名ON 表名 ( 字段1, [字段2, ……] ); ALTER INDEX 索引名 REBUILD; 一个表的索引最好不要超过三个 (特殊的大表除外), 最好用单字段索引, 结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引 ORACLE8.1.7字符串可以索引的最大长度为1578 单字节 ORACLE8.0.6字符串可以索引的最大长度为758 单字节 2.视图 (VIEW) CREATE VIEW 视图名AS SELECT …. FROM …..; ALTER VIEW视图名 COMPILE; 视图仅是一个SQL查询语句, 它可以把表之间复杂的关系简洁化. 3.同义词 (SYNONMY) CREATE SYNONYM同义词名FOR 表名; CREATE SYNONYM同义词名FOR 表名@数据库链接名; 4.数据库链接 (DATABASE LINK) CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘数据库连接字符串’; 数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义. 数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样 数据库全局名称可以用以下命令查出 SELECT * FROM GLOBAL_NAME; 查询远端数据库里的表 SELECT …… FROM 表名@数据库链接名; 五.权限管理 (DCL) 语句 1.GRANT 赋于权限 常用的系统权限集合有以下三个: CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理) 常用的数据对象权限有以下五个: ALL ON 数据对象名, SELECT ON 数据对象名, UPDATE ON 数据对象名, DELETE ON 数据对象名, INSERT ON 数据对象名, ALTER ON 数据对象名 GRANT CONNECT, RESOURCE TO 用户名; GRANT SELECT ON 表名 TO 用户名; GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2; 2.REVOKE 回收权限 REVOKE CONNECT, RESOURCE FROM 用户名; REVOKE SELECT ON 表名 FROM 用户名; REVOKE SELECT, INSERT, DELETE ON表名 FROM 用户名1, 用户名2; 查询数据库第63号错误: select orgaddr,destaddr from sm_histable0116 where error_code='63'; 查询数据库开户用户最大提交和最大下发数: select MSISDN,TCOS,OCOS from ms_usertable; 查询数据库各种错误代码的总和: select error_code,count(*) from sm_histable0513 group by error_code order by error_code; 查询报表数据库话单统计种类查询。 select sum(Successcount) from tbl_MiddleMt0411 where ServiceType2=111 select sum(successcount),servicetype from tbl_middlemt0411 group by servicetype //创建一个控制文件命令到跟踪文件 alter database backup controlfile to trace; //增加一个新的日志文件组的语句 connect internal as sysdba alter database add logfile group 4 (’/db01/oracle/CC1/log_1c.dbf’, ’/db02/oracle/CC1/log_2c.dbf’) size 5M; alter database add logfile member ’/db03/oracle/CC1/log_3c.dbf’ to group 4;
韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的数据库(sql server,mysql , access) 教程推荐:oracle使用教程, 深入浅出oracle 记住:欲速则不达,做任何事情要遵循他的规律,循序渐进,信心很重要 成为一个oracle高手过程:理解小知识点->做小练习->把小的只是点连成线->做oracle项目->形成只是面->深刻理解 Oracle基础部分:oracle基础使用; oracle用户管理; oracle表管理 Oracle高级部分:oracle表的查询; oracle的函数; oracle数据库管理;oracle 的权角色; pl/sql 编程; 索引,约束和事物。 期望目标: 1 学会安装、启动、卸载oracle 2 使用sql *plus工具 3 掌握oracle用户管理 4 学会在oracle编写简单的select语句 第1讲:基础语法 内容介绍: 1.为什么学习oracle 2.介绍oracle及其公司的背景 3.学会安装、启动、卸载oracle 4.oracle开发工具 5.Sql*plus的常用命令 6.oracle用户管理 一、主流数据库包括: ?微软:sql server 和 access ?瑞典:mysql AB公司 ?IBM公司:DB2 ?美国sybase公司:sybase ?IBM公司:infromix ?美国oracle公司:oracle(目前最流行的之一) 数据库分类: 小型数据库 型数据库 大型数据库 mysql Sybase access sql server Oracle informix DB2 负载量在100人内,比如比如在负载日访问量负载可以处理海量数据板,信息系信息留言统。 5000-15000 库 sybase生成sys和system两个用户 2 说明: 1Sys用户 是 超级用户,具有最高权限,具有sysdba角色,create database? 的权限,默认密码是manager 2System 用户 是 管理操作员,权限也很大,具有sysoper角色,没有create ? database权限,默认密码是 change_on_install 3一般讲,对数据库维护,使用system用户登录就可以了 ? 3.启动oracle 右键单击我的电脑->服务和应用程序:服务->启动OracleServiceMYORA1(MYORA1 是安装oracle时起的名字各有不同)和OracleOracleHome90TNSLlistener 4.卸载oracle 1、先关掉oralce,net stop OracleServiceORCL(ORCL是我的实例名字,换成你的),或者去我的电脑服务关闭 2、开始,,程序,,Oracle - oracle的版本号,我的是10ghome,,Oracle Installation Products,, Universal Installer 卸载oracle 3、进注册表,regedit,删除选择 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE下所有的key。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\App lication这个里面所有有oracle这个字眼的,删除 4、删除c盘\Program Files\Oracle目录的东西以及oracle安装目录下所有的文件以及文件夹 5、环境变量删除有关oracle的classpath和path ,, 三、oracle开发工具, Sqlplus是Oracle自带的工具软件,主要用于执行sql语句,pl/sql块。,如何使用:,, 1)在开始,程序,oracle,orachome90,, ,,application,development,sql*plus(这个是在dos下操作), 2)在运行栏输入:sqlplusw或者sqlplus即可, 3)在开始,程序,oracle,orahome90,, Application,development,sql*plus,worksheet,,4)pl/sql,developer,属于第三方软件,主要用于开发,测试,优化oracle,pl/sql,的 存储过程.如:触发器,此软件oracle不带,需要单独安装。,5)oracle的企业管理器(oem,oracle,enterprise,manager),位置在,,开始,程序,oracle,oracle,oraclehome90,enterprise,manager,console, ,,即可启动oracle的企业管理器,是一个图形界面环境, , , , 四、Sql*plus的常用命令, 3 1.连接命令 (1) conn[ect] 用法:conn 用户名/密码 @ 网络服务名[as sysdba/sysoper](角色登陆)当 用特权用户身份连接时,必须带上as sysdba 或是 as sysoper 例:conn scott/tiger; show user; 显示当前用户 2.断开连接命令 (2) disc[onnect] 说明:该命令用来断开与当前数据库的连接 (3)passw[ord] 说明:该命令用于修改用户名的密码。如果要想修改其他用户的密码,需要用sys/system登陆。 (4) show user 说明:显示当前用户名 (5) exit 说明:该命令会断开与数据库的连接,同时会退出sql*plus 3.文件操作命令 (1) start和@ 说明:运行sql脚本 案例:sql>@ d:\a.sql 或者 sql>start d:a.sql (2) edit 说明:该命令可以编辑指定的sql脚本。 案例:sql>edit d:\a.sql (3) spool 说明:该命令可以将sql*plus屏幕上的内容输出到指定文件去。 案例:sql>spool d:\b.sql 并输入 sql>spool off 4(交互式命令 (1), 说明:可以替代变量,而该变量在执行时,需要用户输入。如:sql>select * from emp where job=‘&job;’ 输入job是注意大小写 (2) edit 说明:该命令可以编辑指定的sql脚本 案例: sql>edit d:\a.sql 5.显示和设置环境变量 概述:可以用来控制输出的各种格式,set show 如果希望永久的保存相关的设置,可以去修改 glogin.sql脚本 (1)linesize 说明:设置显示行的宽度,默认是80个字符 sql>show linesize sql>set linesize 90 (2)pagesize 说明:设置每页显示的行数目,默认是14,用法和linesize一样,至于其他环境参数的使用也是大同小异 sql>set pagesize 8 实际得到的不是14/8=2页 而是:14/(8-3)=5页 五Oracle用户的管理 4 1.创建用户 概述:在oracle要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。 create user 用户名 identified by 密码; 2.给用户修改密码 概述:如果给自己修改密码可以直接使用 sql>password 用户名 如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限 sql>alter user 用户名 identified by 新密码 3.删除用户 概述:一般以dba的身份去删除某个用户,如果用其他用户去删除用户则需要具有 drop user的权限。 比如 drop user 用户名【cascade】 注意:在删除用户时,如果要删除的用户已经创建了表,就需要在删除的时候带一个参数cascade 4.用户管理的综合案例 概述:创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需要为其指定相应的权限。给一个用户赋权限(connect登陆,dba管理员,resource建表)使用命令grant,回收权限使用命令revoke. 为了给讲清楚用户管理,给大家举一个案例。 案例: 新建一个用户lady 并给该用户赋可登陆可创建表 Sql>create user lady identified by lady123(密码) 受登陆权限:,grant connect to lady 受可创建表:grant resource to lady 可以多个同时授权:grant connect,resource to lady; 注意授权用户级别应该为(dba以上sys/system) 还可以使用PL/SQL工具创建:文件->新建->用户 现在我要把scott用户里面的emp表的权限赋给lady用户但lady只能有对emp查询权限: grant select on emp to lady;(授权用户级别应该:授权本身,或者sys/system) lady 查询emp的方式:select * from scott.emp; 案例:同上我想把update的权限也赋给leng , grant update on emp to leng; 2)我想把emp所有的(增,删,改,查/insert,delete,update,select这四个一起可以用all代替) 操作权限赋给leng grant all on emp to leng;(此时登陆用户为scott) 案例2:这时我想把权限收回来怎么办呢, 这时用关键字revoke(撤回), revoke select on emp from lady; 收回lady的查权限 案例: 5 现在scott希望吧查询emp表权限通过lady用户继续给别的用户, Scott > grant select on emp to lady with grant option; Leng > grant select on scott.emp to 新建用户 案例: scott想把emp表的权限从leng用户赋权给新用户yoyo; Scott> grant select on emp to leng with grant option; Leng> grant select on scott.emp to yoyo; Yoyo> select * from scott.emp; 如果是对象权限,就加入with grant option 例:grant select on emp to xiaoming with grant option 如果是系统管理权限,system 给xiaoming权限时: 例:grant connect to xiaoming with admin option 如果scott把xiaoming 对emp表的查询权限回收,那么xiaohong会怎么样 Scott->xiaoming->xiaohong ,结果就是xiaoming,xiaohong,都不能查询emp表

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧