学习笔记--Oracle

基本语句

登陆创建用户并设置权限

#sqlplus /nolog
  SQL> conn / as sysdba;
  SQL>create user username identified by password
  SQL> grant dba to username;
  SQL> conn username/password
  SQL> select * from user_sys_privs;//查看当前用户所有权限
  SQL> select * from user_tab_privs;//查看所用用户对表的权限

用户级别:
  sys;//系统管理员,拥有最高权限
  system;//本地管理员,次高权限
  scott;//普通用户,密码默认为tiger,默认未解锁

登陆:
    sqlplus / as sysdba;//登陆sys帐户
  sqlplus sys as sysdba;//同上
  sqlplus scott/tiger;//登陆普通用户scott

管理用户:
  create user zhangsan;//在管理员帐户下,创建用户zhangsan
  alert user scott identified by tiger;//修改密码

授予权限:
       grant create session to zhangsan;//授予zhangsan用户创建session的权限,即登陆权限
  grant unlimited tablespace to zhangsan;//授予zhangsan用户使用表空间的权限
  grant create table to zhangsan;//授予创建表的权限
  grante drop table to zhangsan;//授予删除表的权限
  grant insert table to zhangsan;//插入表的权限
  grant update table to zhangsan;//修改表的权限
  grant all to public;//这条比较重要,授予所有权限(all)给所有用户(public)
        grant dba, resource, connect to zhangsan;

权限:
  create session
  create table
  unlimited tablespace
  connect
  resource
  dba
创建角色:
  create role myrole;//创建角色
  grant create session to myrole;//将创建session的权限授予myrole
  grant myrole to zhangsan;//授予zhangsan用户myrole的角色
  drop role myrole;删除角色

删除创建数据库

drop user jingyan cascade;
drop tablespace jingyan including contents;
create tablespace jingyan datafile ‘D:\oradata\jingyan.DBF‘ size 200m reuse autoextend on next 50m maxsize 1000m;
create user jingyan identified by 1 default tablespace jingyan;
grant dba, resource, connect to jingyan;

查询当前数据库中表空间及文件路径,数据库用户的默认表空间,表所在的表空间

select tablespace_name, file_name from dba_data_files order by file_name;
select user_id, username, default_tablespace from dba_users order by user_id;
select table_name, tablespace_name from user_tables;
select table_name from all_tables where owner = ‘USER‘;  //查看某用户的所有表名,需要有sysdba权限

查看表空间大小使用情况

SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name 

修改数据库默认表空间

alter database default tablespace test;

创建数据表

create table table_name(column1 type1, column2 type2, ...) tablespace tablespace_name;
或者
create table table_name as select ... from ...;

创建索引

CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;

建表示例:

create temporary tablespace DRGS_TEMP0 TEMPFILE ‘/data/oradata/oracle/oradata/orcl/DRGS_TEMP0.bdf‘size 100m reuse autoextend on next 20m maxsize unlimited;

CREATE TABLESPACE "DRGS2017"
    LOGGING
    DATAFILE
    ‘/data/oradata/oracle/oradata/orcl/drgs201701.dbf‘ SIZE 32000M,
    ‘/data/oradata/oracle/oradata/orcl/drgs201702.dbf‘ SIZE 32000M,
    ‘/data/oradata/oracle/oradata/orcl/drgs201703.dbf‘ SIZE 32000M,
    ‘/data/oradata/oracle/oradata/orcl/drgs201704.dbf‘ SIZE 32000M,
    ‘/data/oradata/oracle/oradata/orcl/drgs201705.dbf‘ SIZE 32000M,
    ‘/data/oradata/oracle/oradata/orcl/drgs201706.dbf‘ SIZE 32000M
  REUSE EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT  AUTO;

create user drgsuser2017 identified by drgsuser2017 default tablespace DRGS2017 temporary  tablespace DRGS_TEMP0;
grant connect,resource to drgsuser2017;
grant exp_full_database,imp_full_database to drgsuser2017;
grant dba to drgsuser2017;

alter操作

alter table student add(class_id number);
alter table student modify(class_id varchar2(20));
alter table student rename column student_id to id;
alter table student drop column class_id;
alter table student move tablespace users;

导出数据

一、Spool常用的设置
set arraysize 5000;  //此参数可提高SPOOL卸载的速度,最大可以设置为5000
set autotrace on;    //设置允许对执行的sql进行分析
set colsep ‘,‘;   //域输出分隔符
set echo off;    //显示start启动的脚本中的每个sql命令,缺省为on
set feedback off;  //回显本次sql命令处理的记录条数,缺省为on,设置显示“已选择XX行”
set heading off;   //输出域标题,字段的名称,缺省为on
SET LINESIZE 2500;  //每行允许的最大字符数,设置大些,免得数据被截断,但不宜过大,太大会大大降低导出的速度(注意必须与trimspool结合使用防止导出的文本有太多的尾部空格)
set newpage 1;      //设置页与页之间的分隔{1|n|NONE};当值为0时在每页开头有一个小的黑方框;当值为n时在页和页之间隔着n个空行;当为none时,会在页和页之间没有任何间隔;
set newp none;      //设置查询出来的数据分多少页显示,如果需要连续的数据,中间不要出现空行就把newp设置为none,这样输出的数据行都是连续的,中间没有空行之类的
set num 18;          //设置数字的长度,如果不够大,则用科学记数法显示
set numwidth 12;   //输出number类型域长度,缺省为10
SET NULL text;      //显示时,用text值代替NULL值
set pagesize 2000;  //输出每页行数,页面大小,缺省为24,为了避免分页,可设定为0
set serveroutput on; //设置允许显示输出类似dbms_output;--编写存储过程时,大多会将必要的信息输出;
SET SPACE 0;
set term off;        //不在屏幕上输出执行结果
set termout off;   //显示脚本中的命令的执行结果,缺省为on
set timing on;      //显示每个sql语句花费的执行时间,设置显示“已用时间:XXXX”
set trimout on;   //去除标准输出每行的拖尾空格,缺省为off
set trimspool on;  //去除重定向(spool)输出每行的拖尾空格,缺省为off
set verify off      //是否显示替代变量被替代前后的语句
SET wrap on;        //输出行长度大于设置行长度时(用set linesize n命令设置);值为on时,多余的字符另起一行显示,否则多余的字符将被切除,不予显示;

二、Spool 使用方法
说明:spool不但可以把数据导出到txt,也可以导出到csv等;不但可以导数据,也可以导出字符,拼装成sql文件等
1.采用设置分隔符的方法
说明:设定分隔符后,由sqlplus自己使用设定的分隔符对字段进行分割,这种方法不怎么用,在此不详述。
set colsep ‘|‘ --设置|为列分隔符   
set trimspool on   
set linesize 120   
set pagesize 2000   
set newpage 1   
set heading off   
set term off
set num 18
set feedback off   
spool e:\temp.txt
select * from tablename;   
spool off

查看oracle正在运行的sql进程

set linesize 400;
set pagesize 400;
set long 4000;
col SQL_FULLTEXT format a100;
col machine format a25;
col username format a15;
SELECT a.username,a.machine, b.sql_id, b.SQL_FULLTEXT
FROM v$session a, v$sqlarea b
WHERE a.sql_address = b.address
    AND a.SQL_HASH_VALUE = b.HASH_VALUE;

特殊的数据表dual

dual表提供了一行一列的数据格式,从而使各种表达式、函数运算在以其为数据源时,能够输出单行单列的形式。

select sysdate from dual;

数据类型

类型 | 解释

----------------|------------------------

CHAR | 固定长度字符串,长度1-2000字节,未指定为1字节

VARCHAR2 | 可变长度字符串,长度1-4000个字节,必须指定大小

LONG | 可变长度字符串,最多2GB,长文本信息,一个表只能一列,不能建立索引

NUMBER | 数值型

DATE | 存储表中日期和时间数据

TIMESTAMP | 存储日期、时间和时区信息

RAW | 二进制数据或字节串,长度1-2000字节,应指定大小,可建索引

LONG RAW | 可变长度的二进制数据,最大2GB,限制类似LONG类型

CLOB | 大对象数据类型,存储大量字符数据

BLOB | 存储大量二进制对象

BFILE | 能够将二进制文件存储在数据库外部的操作系统文件中

SQL优化

可能引起全表扫描(索引失效)的操作,应尽量避免:

  1. 在索引列上使用NOT或者“<>”;
  2. 对索引列使用函数或者计算;
  3. NOT IN操作;
  4. 通配符位于查询字符串的第一个字符;
  5. IS NULL或者IS NOT NULL;
  6. 多列索引,但它的第一个列并没有被Where子句引用;

SQL分析

EXPLAIN用法

EXPLAIN PLAN FOR SELECT * FROM T_USER;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Oracle和Mysql的一些异同

1,oracle没有offset,limit,在mysql中我们用它们来控制显示的行数,最多的是分页了。oracle要分页的话,要换成rownum。

2,oracle有一个dual表,当select后没有表时,加上的。不加会报错的。select 1 这个在mysql不会报错的,oracle下会。select 1 from dual这样的话,oracle就不会报错了。

3,对空值的判断,name != “”这样在mysql下不会报错的,但是oracle下会报错。在oracle下的要换成name is not null,(innull(**))

4,oracle下对单引号,双引号要求的很死,一般不准用双引号

5,oracle有to_number,to_date这样的转换函数,oracle表字段是number型的,如果你$_POST得到的参数是123456,入库的时候,你还要to_number来强制转换一下,不然后会被当成字符串来处理。而mysql却不会。

6,group_concat这个函数,oracle是wm_concat。

7,group by,在下oracle下用group by的话,group by后面的字段必须在select后面出现,不然会报错的,而mysql却不会。

8,oracle的表字段类型也没有mysql多,并且有很多不同,例如:mysql的int,float合成了oracle的number型等。

9,oracle查询时from 表名后面 不能加上as 不然会报错的,select t.username from test as t而在mysql下是可以的。

10,Oracle截取字符串的函数为:substr(字段名,起始位置,字符串长度) 起始位置可从0开始,截取结果和从1开始一样。MySql截取字符串的函数为:substring(字段名,起始位置,字符串长度) 起始位置必须从1开始,0开始不能获取到数据。

11,oracle默认不自动提交,需手动提交。mysql默认是自动提交

常见问题:

中文乱码或者显示为??

1.切换至oracle数据库的安装用户
                                        $ su oracle
                                        $ cd ~                                                //进入oracle用户的家目录
                                        $ vim .bash_profile                            //编辑oracle用户下的.bash_profile文件
                          .bash_profile文件内容:(每个人的这个文件具体的设置可能都不太一样,不用担心,注意红色那一行就行了)
                                                PATH=$PATH:$HOME/bin:/usr/bin:/usr/sbin:/sbin
                                                export PATH
                                                export ORACLE_SID=orcl
                                                export ORACLE_BASE=/u01/app/oracle
                                                export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
                                                export PATH=$PATH:$ORACLE_HOME/bin
                                                export ORACLE_TERM=xterm
                                                export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
                                                export CLASSPATH=$ORACLE_HOME/JRE:ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

                                              export NLS_LANG=AMERICAN_AMERICA.UTF8                        //设置这个参数就代表设置用户客户端的字符集,在创建数据库的时候不设置这个参数也没问题,建议是最好规划好自己的库需要用到什么时候类型的字体,然后再设置这个值,最好保持与数据库一致,当然这个参数可以随时改变.(我自己的数据库是用UTF8字符集)

                                      $ source .bash_profile                //执行source命令使修改完的.bash_profile文件生效
                        至此,设置完毕,再次登录Oracle数据库,查询显示正常,但有一点要注意,就是如果你插入数据时的字符集不是UTF8下执行的,当你客户端和服务器都变成UTF8字符集后,以后插入的中文可能显示就为乱码了。所以说只有三个点(客户端、操作系统、数据库)的字符集保持一致的时候才能让数据库里面的中文正常显示。

日期格式问题

日期格式冲突问题
    输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: ‘01-Jan-01‘
    alter system set NLS_DATE_LANGUAGE = American scope=spfile
    alter session set NLS_DATE_LANGUAGE = American scope=spfile
    或者在to_date中写
    select to_char(to_date(‘2002-08-26‘,‘yyyy-mm-dd‘),‘day‘,‘NLS_DATE_LANGUAGE = American‘) from dual;
    注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,
    可查看
    select * from nls_session_parameters
    select * from V$NLS_PARAMETERS  

    显示时间需要将日期型列转换成字符型,使用to_char(日期, ‘yyyy-mm-dd hh24:mi:ss‘)或者修改oracle缺省日期格式。

重启监听器

lsnrctl status          //查看状态
lsnrctl start            //开启监听器
lsnrctl stop            //停止监听器
lsnrctl reload         //重启监听器

通过ip登陆oracle

sqlplus username/[email protected]/ORCL

not null和default顺序问题

default必须放在null或not null前面

CREATE TABLE datp0 (
  GLOBALID number(11,0) DEFAULT ‘0‘ NOT NULL,
  CYCLE number(11,0) DEFAULT ‘0‘ NOT NULL,
  P1 varchar2(5) DEFAULT NULL,
  ...
);

后台执行sql

nohup sqlplus oracle/[email protected] @sql.sql &

查看被锁进程

//查看被锁的表
SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name
FROM v$process p, v$session a, v$locked_object b, all_objects c
WHERE p.addr = a.paddr
AND a.process = b.process
AND c.object_id = b.object_id;
// 查看是哪个进程锁的
SELECT sid, serial#, username, status, osuser FROM v$session where serial# = ‘3789‘
//查看指定进程的sql内容
select sql_text from v$sqlarea s,v$session ses where s.address=ses.sql_address and ses.serial# =‘12345‘;
// 杀掉这个进程
alter system kill session ‘sid,serial#‘;
//查看执行时间太长的sql语句
select sid,serial#,sql_text,executions from v$sql join v$session on v$sql.sql_id=v$session.sql_id where cpu_time>20000;

ORA-00031: session marked for kill 处理Oracle中杀不掉的锁

alter system kill session ‘sid,serial#‘;   //若执行此语句提示ORA-00031: session marked for kill,则进行如下处理
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=33;
#kill -9 12345  //在OS界面终端执行

原文地址:https://www.cnblogs.com/kioluo/p/8824781.html

时间: 2024-10-31 09:25:38

学习笔记--Oracle的相关文章

学习笔记:Oracle 12C 数据非常规恢复工具bbed的使用说明

ORACLE 12C 依然支持 bbed,ORACLE 12C的测试版出来了,对于习惯了使用bbed(ORACLE 手术刀)的人来说,12C是否继续被支持是一个很让人关注的问题,通过本实验测试,12C继续支持bbed,很多艰难的数据库恢复依然可以通过bbed来实现,也从侧面说明,ORACLE 12C在块的结构上还依然和以往版本相似 数据库信息 [[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.0.2 Beta

学习笔记:Oracle dul数据挖掘 使用DUL数据恢复软件恢复分区表中

使用Oracle dul数据恢复工具对Oracle数据库分区表中的数据进行恢复 创建SALES分区表案例 CREATE TABLE SALES ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE, SALES_COST NUMBER(10), STATUS VARCHAR2(20) ) PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) SUBPARTITION TEMPLATE ( SUBPA

学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中

试验模拟导出Oracle 11G数据库中数据文件坏块中表中的数据 以前一直以为dul对应的版本只能恢复最高的数据库版本一致,今天测试发现dul 10可以恢复11g最新版的数据库.模拟环境 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition

Oracle学习笔记—oracle体系架构及状态(nomount、mount和open)简介

oracle体系架构简介 先来简要了解一下Oracle数据库体系架构以便于后面深入理解,Oracle Server主要由实例(instance)和数据库(database)组成.实例(instance)由共享内存(SGA)和后台进程系统组成,数据库(database)是存储在磁盘上的一系列物理文件. SGA主要由Share Pool(共享池,又分Library Cache和Data Dictionary Cache,前者临时存储最近执行过的语句代码等,后者临时存储数据位置.表定义及用户权限等).

Oracle Rac11g 学习笔记

查看集群节点状态 命令是olsnodes -i 显示每个节点的VIP, -n 显示每个节点在RAC集群中的编号 -p 显示每个节点所使用的私有IP地址 -s 显示每个节点的状态(activive或者inactive) 列车集群中所有资源 crs_stat -t 查看crs资源状态 crsctl check crs 查看ctss服务的状态 crsctl check ctss 查看集群中所有节点状态 crsctl check cluster -all 查看ASM实例进程 ps -ef | grep

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

oracle 触发器 学习笔记

触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们. 功能: 1. 允许/限制对表的修改 2. 自动生成派生列,比如自增字段 3. 强制数据一致性 4. 提供审计和日志记录 5. 防止无效的事务处理 6. 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old

Oracle 学习笔记 17 -- 异常处理(PL/SQL)

程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的.但是要有相应的异常处理的机 制,来保证程序的正常执行.PL/SQL程序执行过程中出现的错误,称为异常.一个优秀的程序都应该能够正确处理 各种出错的情况,并尽可能的从错误中恢复.PL/SQL提供了异常处理机制. 概念: 异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止. 有三种类型的错误

oracle学习笔记之用户管理-3

用户权限机制 1.不同用户表权限的赋予 grant select on scott.emp to software; ---当前登录用户为表所有者,则表名前不用指定所属用户 2.用software登录后 select * from scott.emp; ---software才有权限查询到scott的emp表 方案(schema) 当用户创建好后,如果该用户创建了一个数据对象(如表),此时dbms会创建一个对应的方案与改用户对应,并且该方案的名称和用户名称一致. system与scott都拥有自