`

Oracle 基础

阅读更多
Oracle 基础
----------------

1.
sqlplus

1.1
连接数据库:
sqlplus "sys/pwd as sysdba"
sqlplus scott/tiger

conn scott/tiger

1.2
帮助:
help index
? SET

1.3
保存与加载SQL脚本
save c:\dept.sql

spool c:\dept.sql
spool off

@c:\dept.sql

edit c:\dept.sql

1.4
查询表结构:
DESC dept;

1.5
查询当前用户:
SELECT user FROM dual;

2
用户管理

OS 用户组:
ORA_DBA
SQL> conn sys/pwd as sysdba


SQL> CREATE USER userdb IDENTIFIED BY userdb;

用户已创建。

SQL> CREATE USER sysdb IDENTIFIED BY sysdb;

用户已创建。

SQL> ALTER user sysdb ACCOUNT UNLOCK;

用户已更改。

SQL> ALTER user userdb ACCOUNT UNLOCK;

用户已更改。

SQL> grant connect to userdb;

授权成功。

SQL> grant connect to sysdb;

授权成功。

SQL> grant sysdba to sysdb;

授权成功。

SQL> grant sysdba to userdb;

授权成功。



SQL> grant connect, resource, sysdba to userdb with admin option;

授权成功。

SQL> grant connect, resource, sysdba to sysdb with admin option;

授权成功。


SQL> revoke sysdba from userdb;

撤销成功。

SQL> revoke sysdba from sysdb;

撤销成功。

3.
表空间管理

SQL> CREATE TABLESPACE sysdb
  2  DATAFILE 'E:\app\oradata\bisoft\SYSDB.MDF' SIZE 50M;

表空间已创建。

SQL> CREATE TABLE test(id int primary key, name varchar2(20)) TABLESPACE sysdb;

表已创建。


4.
查询当前用户的所有表对象:
SQL> select table_name, tablespace_name from user_tables;

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TEST                           USERS
SALGRADE                       USERS
BONUS                          USERS
EMP                            USERS
DEPT                           USERS

5.
PL/SQL

SQL> SET SERVEROUTPUT ON SIZE 1000000
SQL> l
  1  DECLARE
  2  x varchar2(50);
  3  BEGIN
  4  x:='Hello World!';
  5  DBMS_OUTPUT.PUT_LINE('x='||x);
  6* END;
SQL> /
x=Hello World!

PL/SQL 过程已成功完成。


4  DECLARE
5     x varchar2(50);
6     y INTEGER:=100;
7     i number:=0;
8  BEGIN
9     -- 赋值
0     x:='Hello World!';
1     DBMS_OUTPUT.PUT_LINE('x='||x||' y='||y);
2     -- IF THEN ELSE, 注意ELSIF ,不是ELSEIF
3     IF y=10 THEN
4             x:='ok';
5     ELSIF y=100 THEN
6             x:='error';
7     ELSE
8             x:='none';
9     END IF;
0     DBMS_OUTPUT.PUT_LINE('x='||x||' y='||y);
1     -- CASE WHEN THEN ELSE
2     CASE
3             WHEN y=0 THEN
4                     x:='ok2';
5             WHEN y=100 THEN
6                     x:='error2';
7             ELSE
8                     x:='none';
9     END CASE;
0     DBMS_OUTPUT.PUT_LINE('x='||x||' y='||y);
1     -- LOOP, 基本循环
2     LOOP
3             i:=i+1;
4             IF i > 3 THEN
5                     EXIT;
6             END IF;
7             DBMS_OUTPUT.PUT_LINE('i='||i);
8     END LOOP;
9     -- WHILE, 条件循环
0     i:=0;
1     WHILE i <=3 LOOP
2             DBMS_OUTPUT.PUT_LINE('i='||i);
3             i:=i+1;
4     END LOOP;
5     -- FOR, 计数器可以不用声明, 反向输出reverse.
6     FOR k IN 1..5 LOOP
7             DBMS_OUTPUT.PUT_LINE('k='||k);
8     END LOOP;
9     FOR k IN REVERSE 1..5 LOOP
0             DBMS_OUTPUT.PUT_LINE('k='||k);
1     END LOOP;
2     -- GOTO, 模拟循环
3     i:=0;
4     -- 标签
5     <<repeat_loop>>
6     i:=i+1;
7     DBMS_OUTPUT.PUT_LINE('i='||i);
8     IF i<3 THEN
9             GOTO repeat_loop;
0     END IF;
1* END;
L> /


异常处理:

  1  DECLARE
  2  test varchar2(50);
  3  BEGIN
  4  SELECT dname INTO test FROM dept WHERE deptno=0;
  5  DBMS_OUTPUT.PUT_LINE(test);
  6  -- 系统异常 NO_DATA_FOUND
  7  EXCEPTION
  8     WHEN NO_DATA_FOUND THEN
  9             DBMS_OUTPUT.PUT_LINE('未查询到数据.');
 10* END;
SQL> /
未查询到数据.


  1  DECLARE
  2  test varchar2(50);
  3  e exception;
  4  BEGIN
  5     SELECT dname INTO test FROM dept WHERE deptno=10;
  6     IF test<>'XX部门' THEN
  7             RAISE e;
  8     END IF;
  9     DBMS_OUTPUT.PUT_LINE(test);
 10     -- 自定义异常 e
 11     EXCEPTION
 12             WHEN e THEN
 13                     DBMS_OUTPUT.PUT_LINE('未查询到数据XX部门.');
 14* END;
SQL> /
未查询到数据XX部门.

PL/SQL 过程已成功完成。


系统异常:
DUP_VALUE_ON_INDEX:
违反惟一约束

NO_DATA_FOUND:
查询数据没有返回值

TOO_MANY_ROWS:
查询语句返回了多行

VALUE_ERROR:
违反字段取值约束

ZERO_DIVIDE:
除零错误

...

5.2
记录
DECLARE
	TYPE myrecord IS RECORD(
	    id dept.deptno%TYPE,
	    name dept.dname%TYPE
	);
	myrecord_instance myrecord;
BEGIN
	SELECT deptno,dname INTO myrecord_instance FROM dept WHERE deptno=10;
	DBMS_OUTPUT.PUT_LINE('id= '||myrecord_instance.id||' name= '||myrecord_instance.name);
END;
/

SQL> /
id= 10 name= ACCOUNTING

PL/SQL 过程已成功完成。



-- 简洁定义,直接映射表中每个字段
DECLARE
	dept_record dept%ROWTYPE;
BEGIN
	SELECT * INTO dept_record FROM dept WHERE deptno=10;
	DBMS_OUTPUT.PUT_LINE('deptno= '||dept_record.deptno||' dname= '||dept_record.dname);
END;
/




5.3
游标

  1  DECLARE
  2     --  显示游标
  3     --  1 声明游标, 有参数
  4     CURSOR mycur(id dept.deptno%TYPE) IS
  5             SELECT * FROM dept WHERE deptno = id;
  6     dept_record dept%ROWTYPE;
  7  BEGIN
  8     --  2 打开游标
  9     OPEN mycur(10);
 10     --  3 使用游标
 11     FETCH mycur INTO dept_record; -- 取第一条
 12     WHILE mycur%FOUND LOOP
 13             DBMS_OUTPUT.PUT_LINE(dept_record.deptno||' '||dept_record.dname|
|' '||dept_record.loc);
 14             FETCH mycur INTO dept_record; -- 取下一条
 15     END LOOP;
 16     --  4 关闭游标
 17     CLOSE mycur;
 18* END;
SQL> /
10 ACCOUNTING NEW YORK

PL/SQL 过程已成功完成。




  1  DECLARE
  2     --  隐式游标
  3     --  1 声明游标
  4     CURSOR mycur(id dept.deptno%TYPE) IS
  5             SELECT * FROM dept WHERE deptno = id;
  6  BEGIN
  7     --  2 使用游标
  8     FOR tmpcur IN mycur(10) LOOP
  9             DBMS_OUTPUT.PUT_LINE(tmpcur.deptno||' '||tmpcur.dname||' '||tmpc
ur.loc);
 10     END LOOP;
 11* END;
SQL> /
10 ACCOUNTING NEW YORK

PL/SQL 过程已成功完成。





DECLARE
   --  使用游标更新数据
   CURSOR mycur(id dept.deptno%TYPE) IS
           SELECT dname FROM dept WHERE deptno = id FOR UPDATE;
   new_dname dept.dname%TYPE:='财务部';
   old_dname dept.dname%TYPE;
BEGIN
   OPEN mycur(10);
   FETCH mycur INTO old_dname;
   WHILE mycur%FOUND LOOP
	UPDATE dept SET dname=new_dname WHERE CURRENT OF mycur;
	DBMS_OUTPUT.PUT_LINE(old_dname||' -> '||new_dname);
	FETCH mycur INTO old_dname;
   END LOOP;
END;
/
ACCOUNTING -> 财务部

PL/SQL 过程已成功完成。




5.4
存储过程
参数:
IN
OUT
IN OUT

参数不能指定长度,变量必须指定长度.

查看编译存储过程错误:
SHOW ERRORS PROCEDURE proc;

6
语句块必须以分号结束.

7

全局变量
VARIABLE SUM NUMBER;
在声明块之前定义
引用:
:SUM:=0;

8
查看源码:
select * from user_source;

9
函数

函数多了个返回值.
函数可以在SQL中使用.


10
大批量数据导入
alter table member nologging;
BEGIN 
for i in 1..1000000 loop
	insert /*+ append */ into member values(i, 36, 9000);
end loop;
commit;
for i in 1000001..2000000 loop
	insert /*+ append */ into member values(i, 25, 8000);
end loop;
commit;
for i in 2000001..3000000 loop
	insert /*+ append */ into member values(i, 36, 10000);
end loop;
commit;
for i in 3000001..4000000 loop
	insert /*+ append */ into member values(i, 20, 12000);
end loop;
commit;
for i in 4000001..5000000 loop
	insert /*+ append */ into member values(i, 40, 8500);
end loop;
commit;
for i in 5000001..6000000 loop
	insert /*+ append */ into member values(i, 24, 7000);
end loop;
commit;
for i in 6000001..7000000 loop
	insert /*+ append */ into member values(i, 38, 15000);
end loop;
commit;
for i in 7000001..8000000 loop
	insert /*+ append */ into member values(i, 21, 20000);
end loop;
commit;
for i in 8000001..9000000 loop
	insert /*+ append */ into member values(i, 39, 60000);
end loop;
commit;
for i in 9000001..10000000 loop
	insert /*+ append */ into member values(i, 20, 6000);
end loop;
commit;
END;
/

alter table member logging;

大约 10分钟左右

11
千万数据查询
行转列

select 
	sum(decode(rownum, 1, a, 0)) AS "A",
	sum(decode(rownum, 2, a, 0)) AS "B",
	sum(decode(rownum, 3, a, 0)) AS "C",
	sum(decode(rownum, 4, a, 0)) AS "D"
from 
(
select count(1) a from member where age > 35 and sal <  9999
union all
select count(1) a from member where age > 35 and sal >  9999
union all
select count(1) a from member where age < 35 and sal <  9999
union all
select count(1) a from member where age < 35 and sal >  9999
);








分享到:
评论

相关推荐

    oracle基础教程

    oracle基础教程 课程说明 1 课程介绍 1 课程目标 1 相关资料 1 第1章 ORACLE数据库概述 2 1.1 产品概述 2 1.1.1 产品简介 2 1.1.2 基本概念 3 1.2 ORACLE系统结构 4 1.2.2 ORACLE物理结构 4 1.2.3 系统全局区 6 ...

    oracle基础知识入门

    对于初学者来说,掌握Oracle基础知识是进入数据库领域的第一步。本文将深入浅出地介绍Oracle数据库的一些核心概念和基本操作,帮助你快速入门。 一、Oracle数据库系统概述 Oracle数据库是由美国Oracle公司开发的,...

    oracle基础资料学习oracle的来下

    oracle ORACLE 基础资料 基础知识 培训资料oracle ORACLE 基础资料 基础知识 培训资料oracle ORACLE 基础资料 基础知识 培训资料oracle ORACLE 基础资料 基础知识 培训资料

    Oracle基础教程

    Oracle 基础教程 Oracle 是一款流行的关系型数据库管理系统,由 Oracle 公司开发和维护。作为一个功能强大且广泛应用的数据库管理系统,Oracle 具有强大的数据存储和管理能力,广泛应用于各种 Industries,包括金融...

    oracle基础教程ppt

    通过本Oracle基础教程PPT,你将逐步了解并掌握这些概念,为你的Oracle学习之路打下坚实基础。随着对Oracle的理解加深,你还可以进一步探索高级主题,如数据仓库、分布式数据库、RAC集群等。学习Oracle不仅是技术的...

    Oracle 基础知识 -大全- 原创整理.pdf

    以下将详细讲解Oracle基础知识,包括数据库管理、表的创建与维护、SQL查询技巧、权限管理以及PL/SQL编程等方面。 1. **Oracle数据库优势** Oracle数据库因其高性能、高可用性和安全性而受到青睐。它支持大规模并发...

    oracle基础知识考试题_答案.zip

    这个"oracle基础知识考试题_答案.zip"压缩包文件包含了关于Oracle数据库的基础知识学习材料,特别是针对初学者或者准备Oracle相关资格考试的人员。 首先,Oracle数据库的核心概念包括SQL(结构化查询语言)的使用,...

    oracle基础知识回顾与练习.zip

    本资料“oracle基础知识回顾与练习.zip”是针对Oracle数据库的基础知识进行整理,采用纯SQL语句的形式,适合初学者及需要巩固基础的用户进行学习和实践。 1. SQL基础 SQL(Structured Query Language)是用于管理...

    Oracle基础教程.pdf

    Oracle基础教程.pdf

    ORACLE基础知识及故障定位.pdf

    ORACLE基础知识及故障定位 学校oracle基础知识,包含所有orcale的数据库知识,以及常见问题解决思路,解决方案,问题怎么定位。

    oracle基础

    oracle基础创建表,删除表,修改表,查看表的结构和数据,添加数据语法:删除数据语法,更新数据语法:基础查询语法:

    Oracle基础教程源码下载 James Perry , Gerald Post 著,钟鸣 郝玉洁 等译

    《Oracle基础教程》是由James Perry和Gerald Post合著,并由钟鸣、郝玉洁等人翻译的一本教育性书籍,旨在帮助初学者和专业人士理解Oracle数据库的基础知识。源码下载部分提供了书中各章节实例的数据文件,使读者能够...

    oracle基础资料

    本文将基于"Oracle基础资料"这一主题,结合提供的压缩包文件"Oracle8i_9i数据库基础.doc",深入探讨Oracle数据库的基础知识,包括其核心概念、数据类型、SQL语句、表的创建以及备份恢复策略。 首先,Oracle数据库的...

    图灵邮电版oracle基础教程+数据库文件

    oracle基础教程,很适合oracle的学习和数据库的操作练习。同时里面主要是以练习为主。包括了ORACLE的基础操作。

    ORACLE基础培训文档

    这篇“Oracle基础培训文档”旨在为初学者提供一个全面了解Oracle数据库的平台,帮助大家掌握其基本概念、操作和管理技巧。 首先,我们从基础开始,Oracle数据库的核心是SQL(结构化查询语言),它是用于管理和处理...

    oracle基础教程.pdf

    "Oracle基础教程.pdf" 提供了丰富的学习资源,共分为21章,涵盖了Oracle数据库的核心概念和技术。 第1章:Oracle简介 本章将介绍Oracle数据库的历史、特点和应用领域,以及它在现代企业级数据管理中的重要地位。你...

    ORACLE 基础训练

    以上是Oracle基础训练的主要内容,通过深入学习和实践,你将能熟练掌握Oracle数据库的基础操作和高级特性。"Oracle基礎教程(一).ppt"至"Oracle基礎教程(三).ppt"中的材料将帮助你逐步掌握这些知识,为你的数据库管理...

    Oracle基础知识

    "Oracle基础知识"涵盖了SQL语言的基本概念以及Oracle 10G版本的相关特性。以下将详细介绍这些知识点。 首先,SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言。SQL基础包括以下几个部分...

    Oracle基础.ppt

    Oracle 基础知识点总览 Oracle 基础知识点可以概括为以下几个方面: 1. Oracle 概述 Oracle 是一种对象关系数据库管理系统(ORDBMS),它提供了关系数据库系统和面向对象数据库系统这二者的功能。Oracle 数据库...

Global site tag (gtag.js) - Google Analytics