- 浏览: 98755 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
鸟气凌人:
最经正在看基础
Oracle PL/SQL中游标和游标变量的使用 -
matraxa:
讲得很清楚,顶一个!
JVM垃圾回收机制总结(1) —基本概念 -
ZavaKid:
顶楼主,通俗易懂。
byw,上面的图用什么软件画的?
JVM垃圾回收机制总结(1) —基本概念 -
47478220:
对这里还不太了解,学习了。
Java 虚拟机体系结构
小型数据库:access,foxbase
你该用什么数据库?
1.项目规模:
a,负载量多大,用户多大
b,成本
c,安全性
成本在千元内
负载量小,100人内,比如留言板,信息系统
以成本在千元内,对安全性要求不高.
中型数据库:mysql,sql server,informix
比如在负载 日访问量5000-15000,成本在万元内
比如商务网站.
大型数据库:sybase,oracle,db2
负载可以处理海量数据库.
sybase<oracle<db2
这几个数据库安全性很高,相对贵.
-------------------------------
修改密码:
passw
create user xiaoming identified by m123;
drop user xx cascade
权限:
系统权限:用户对数据库的相关权限.
对象权限:用户对其他用户的数据对象操作的权限.
grant select on emp to xiaoming;
grant all on emp to xx;
revoke select on emp from xx;
grant all on emp to xx with grant option;
grant connect to xx with admin option;
Oracle用户管理:
创建profile文件
create profile lock_account limit
failed_login_attempts 3 password_lock_time 2;
alter user tea profile lock_account;
解锁:alter user tea account unlock;
定期更新密码(强制):
create profile myprofile limit password_life_time
10 password_grace_time 2;
alter user tea profile myprofile;
口令历史:禁止使用以前使用过的密码.
create profile password_history limit password_life_time
10 password_grace_time 2 password_reuse_time 10;
删除profile:
drop profile password_history [cascade];
表名和列名的命名规则:
必须以字母开头
长度不能超过30字符
不能使用Oracle保留字.
只能使用如下字符a-z,0-9,$,#等.
数据类型:
字符型:char,varchar2,clob
char的查询速度极快.
varchar 最长为4000
数字型:number
number(5,2):一共五位,有两位小数
number(5):五位整数
日期类型:date,timestamp
图片类型:blob,二进制数据,可以存放图片/声音 4G.
alter table student add(classid number(2));
alter table student modify(xm varchar2(3));
alter table student modify(xm char(30));
alter table student drop column sal;
rename student to stu;
drop table student;
修改日期格式:
alter session set nls_date_format = 'yy-mm-dd';
删除数据
delete from student;
drop table student;
delete from student where xx=xx
truncate table student;
savepoint a;
rollback; / rollback to a;
=====================
查询
查看表结构:desc dept;
select * from xx ; 对速度影响很大.
所以在查询时最好写出列名.
set timing on;
begin
for i in 1 .. 100000 loop
insert into users(userid,username,password)
select * from users;
end loop;
end;
如何处理NULl值:nvl(xx,xx)
使用LIKE操作符
% 表示任意多个字符
_ 代表任意单个字符.
--------------
对数据分组的总结
1,分组函数只能出现在选择列表,having,order by 子句中.
2,顺序:group by , having, order by.
多表查询
避免笛卡尔积
规定:多表查询的条件至少不能少于表的个数-1
子查询
单行子查询,多行子查询.
数据库在执行sql是从左到右,所以将条件强的写到最右边.
select ename from emp where job in(
select distinct job from emp
where deptno=10);
select ename,sal from emp where sal>
all(select sal from emp where deptno=30);的执行效率不如
下面的高:
select ename,sal from emp where sal >
(select max(sal) from emp where deptno=30);
在多行子查询中使用all,any
--------------
* 子查询中返回多列
select ename,sal,job from emp
where(deptno,job)=
(select deptno,job from emp where ename='SMITH')
select ename,sal,mysal from emp e,
(select deptno,avg(sal) mysal from emp group by deptno) a
where e.deptno=a.deptno and e.sal>a.mysal order by e.sal
子查询被看作一个视图来对待,也叫内嵌视图,因此必须给内嵌视图
起一个别名,不然是没法用的.并且起别名时,不能加as,为表起别名
不加as,列可以加as.
---------------------
分页查询
共有三种方式:
1,rownum分页
select * from (select a1.*,rownum rn from (select * from emp) a1
where rownum<=10) where rn>=6;
2,根据rowid来分
select * from xx where rowid in(
select rid from (select rownum rn,rid from(
select rowid rid,cid from xx order by cid desc)
where rownum<10000)where rn>9980 order by cid desc;
3,根据分析函数,效率最低
create table myemp (id,ename,sal)
as select empno,ename,sal from emp
-------------------
Oracle合并查询
union 并集, intersect 交集, minus 差集
update emp set(job,sal,comm)=(select
job,sal,comm from emp where ename='SMITH')
where ename ='SCOTT';
=======================
Oracle 事务
只读事务:只允许执行查询的操作.只会取到特定点的数据信息.
set transaction read only;
设置之后,将不再看然新的事务产生的效果,比如说新插入的数据.
-----------
字符函数:
lower(char),upper(char),length(char),substr(char,m,n),
replace(char1,search_string,replace_string),instr(str,char);
select lower(ename) from emp;
select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename))) from emp
select substr(ename,1,3) from emp;
select replace(ename,'A','我是老鼠') from emp;
数学函数:
round(n,[m]),trunc(n,[m]),mod(m,n),floor(n),ceil(n);
日期函数
sysdate,add_months(hire_date,8);
select * from emp where sysdate>add_months(hiredate,8);
select ename,trunc(sysdate-hiredate) "入职天数" from emp;
SELECT HIREDATE, ENAME FROM EMP WHERE LAST_DAY(HIREDATE)-2=HIREDATE
转换函数
TO_CHAR
SQL> SELECT ENAME, TO_CHAR(HIREDATE,'YYYY/MM/DD hh24:mi:ss')
, TO_CHAR(SAL,'L99999.99') FROM EMP;
SQL> SELECT ENAME,HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE,'
YYYY')=1988;
SQL> SELECT ENAME,HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE,'
YYYY-MM')='1988-12';
系统函数:
TERMINAL:
LANGUAGE:
DB_NAME:
NLS_DATE_FORMAT:
SESSION_USER:
SELECT SYS_CONTEXT('USERENV','LANGUAGE') FROM DUAL;
SELECT SYS_CONTEXT('USERENV','SESSION_USER') FROM DUAL;
PL/SQL编程
1,过程,函数,触发器是PL/SQL编写的.
2,它们存在Oracle中
3,pl/sql非常强大
4,可以在Java中调用.
学习必要性
1,提高应用程序运行性能.
传统操作数据库的方法是基于网络连接,接收SQL语句,编译再执行
2,模块化的设计思想(分页过程)
3,减少网络传输量
4,提高安全性.
缺点
移植性不好.
如何查看错误信息: SHOW ERROR;
如何调用该过程:
1,EXEC 过程名(参数 .. )
2,CALL 过程名(参数 .. )
create or replace procedure pr01 is
begin
insert into mytest values('xxxx','xxxx');
end;
----------------------------
pl/sql基础
分类:过程(存储过程),函数,触发器,包
编写规范
常量:c_xx
变量:v_xx
游标:xxx_cursor
例外:e_error
1 create or replace procedure pr03(name varchar2, new_sal
number) is
2 begin
3 update emp set sal=new_sal where ename=name;
4* end;
========================
在Java中调用存储过程
// 调用存储过程
cs = conn.prepareCall("{call pr03(?,?)}");
cs.setString(1, "SMITH");
cs.setInt(2, 100);
cs.execute();
PL/SQL 控制结构
条件分支
if - then end if
if -- then -- else - end if
CREATE OR REPLACE PROCEDURE PR06(NO NUMBER) IS
--定义部分
V_JOB EMP.JOB%TYPE;
BEGIN
SELECT JOB INTO V_JOB FROM EMP WHERE EMPNO=NO;
IF V_JOB='PRESIDENT' THEN
UPDATE EMP SET SAL=SAL+1000 WHERE EMPNO=NO;
ELSIF V_JOB='MANAGER' THEN
UPDATE EMP SET SAL=SAL+500 WHERE EMPNO=NO;
ELSE
UPDATE EMP SET SAL=SAL+200 WHERE EMPNO=NO;
END IF;
END;
-------------------------
CREATE OR REPLACE PROCEDURE PR6(NAME VARCHAR2) IS
V_NUM NUMBER := 1;
BEGIN
LOOP
INSERT INTO USERS1 VALUES(V_NUM, NAME);
EXIT WHEN V_NUM = 10;
V_NUM := V_NUM+1;
END LOOP;
END;
------------------------------
分页
CREATE OR REPLACE PROCEDURE PR7
(BOOK_ID IN NUMBER, BOOK_NAME IN VARCHAR2, PUBLISH IN VARCHAR2) IS
BEGIN
INSERT INTO BOOK VALUES(BOOK_ID,BOOK_NAME,PUBLISH);
END;
CREATE OR REPLACE PROCEDURE PR8
(SPNO IN NUMBER,SPNAME OUT VARCHAR2) IS
BEGIN
SELECT ENAME INTO SPNAME FROM EMP WHERE EMPNO=SPNO;
END;
-------------
建包
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE TEST_CURSOR IS REF CURSOR;
END TESTPACKAGE;
建过程
CREATE OR REPLACE PROCEDURE PR9
(SPNO IN NUMBER,P_CURSOR OUT TESTPACKAGE.TEST_CURSOR) IS
BEGIN
OPEN P_CURSOR FOR SELECT * FROM EMP WHERE DEPTNO=SPNO;
END;
JAVA代码
cs = conn.prepareCall("{call pr9(?,?)}");
cs.setInt(1, 10);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
rs = (ResultSet)cs.getObject(2);
while(rs.next()) {
System.out.println(rs.getInt(1) + "," + rs.getString(2));
}
====================================
分页完整过程
-- 包
-- CREATE OR REPLACE PACKAGE
CREATE OR REPLACE PROCEDURE PAGER
(TABLENAME IN VARCHAR2,
PAGESIZE IN NUMBER,
PAGENOW IN NUMBER,
MYROWS OUT NUMBER,--总记录数
MYPAGECOUNT OUT NUMBER,--总页数
P_CURSOR OUT TESTPACKAGE.TEST_CURSOR -- 返回一个记录集
) IS
-- 定义部分
-- 定义SQL语句
V_SQL VARCHAR2(1000);
V_BEGIN NUMBER := (PAGENOW-1)*PAGESIZE+1;
V_END NUMBER := PAGENOW*PAGESIZE;
BEGIN
V_SQL := 'SELECT * FROM (SELECT T1.*,ROWNUM RN FROM (SELECT * FROM '|| TABLENAME ||') T1 WHERE ROWNUM<='|| V_END ||') WHERE RN>='|| V_BEGIN;
OPEN P_CURSOR FOR V_SQL;
V_SQL := 'SELECT COUNT(*) FROM '||TABLENAME;
EXECUTE IMMEDIATE V_SQL INTO MYROWS;
IF MOD(MYROWS,PAGESIZE)=0 THEN
MYPAGECOUNT := MYROWS/PAGESIZE;
ELSE
MYPAGECOUNT := MYROWS/PAGESIZE;
END IF;
CLOSE P_CURSOR;
END;
/
------------------
CORE JAVA CODE ...
cs = conn.prepareCall("{call pager(?,?,?,?,?,?)}");
cs.setString(1, "EMP");
cs.setInt(2, 5);
cs.setInt(3, 1);
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER); cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR); cs.execute();
int rowNum = cs.getInt(4);
int pageCount = cs.getInt(5);
rs = (ResultSet)cs.getObject(6);
System.out.println("总记录条数为: " + rowNum);
System.out.println("总页数为: " + pageCount);
while(rs.next()) {
System.out.println(rs.getString(1)+ "," + rs.getString(2));
====================
异常处理
DECLARE
V_ENAME EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO=&GNO;
DBMS_OUTPUT.PUT_LINE('名字: ' || V_ENAME);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('EXCEPTION ACCURED!');
END;
常见预定义例外
CASE_NOT_FOUND,CURSOR_ALREADY_OPEN,DUL_VAL_ON_INDEX,INVALID_CURSOR
INVALID_NUMBER,NO_DATA_FOUND,TO_MANY_ROWS,ZERO_DIVIDE,VALUE_ERROR.
其它预定义例外
LOGON_DENIED, NOT_LOGGED_ON, STORAGE_ERROR,TIMEOUT_ON_RESOURCE.
自定义例外
CREATE OR REPLACE PROCUDURE EX_TEST(NO NUMBER) IS
MYEX EXCEPTION;
BEGIN
UPDATE EMP SET SAL := SAL+1000 WHERE EMPNO = NO;
IF SQL%NOTFOUND THEN
-- %NOTFOUND 表示没有UPDATE
-- RAISE MYEX; 触发MYEX这个例外
RAISE MYEX;
END IF;
EXCEPTIN
WHEN MYEX THEN
DBMS_OUTPUT.PUT_LINE("没有更新任何用户");
END;
========================
ORACLE视图
视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称
的列和行数据.但是, 视图并不在数据库中以存储的数据值集形式存在.行和列数据
来自由定义视图的查询所引用的表,并且在引用视图时动态生成.
视图与表的区别:
视图不要空间,表要
视图不能添加索引
提高安全性.
创建视图:
CREATE [OR REPLACE] VIEW XX AS SELECT XXX [WITH READ ONLY];
DROP VIEW XX;
发表评论
-
Oracle中函数使用技巧(2) - NULLIF
2013-07-09 01:42 835NULLIF 函数 功能 通过比较表达式提供 ... -
Oracle中函数使用技巧(1) - Decode
2013-07-09 01:38 704ecode()函数是ORACLE PL/SQL是功能强大的函 ... -
Oracle数据库备份与恢复的三种方法
2013-07-09 00:56 667Oracle数据库有三种标准的备份方法,它们分别是导出/导 ... -
Oracle 字符集详解
2013-07-09 00:31 618一、什么是Oracle字符集 Oracle字 ... -
Oracle中逻辑导出Exp/导入Imp详解
2013-07-09 00:27 977导入/导出是O ... -
Oracle触发器详细介绍(二)
2011-08-11 15:46 1355Sql代码 --触发器 trigger ... -
Oracle 游标的使用(二)
2011-08-11 15:44 1247Sql代码 --ref 游标 /* ... -
exp/imp命令详解
2011-06-27 16:45 1184exp/imp两个命令可以说是oracle中最常用的命令了。 ... -
ora-00020超出最大进程数的解决方法
2011-06-23 09:42 1812一般原因是因为你的应用程序的连接数超过了ORACLE系统设 ... -
ORACLE中客户端连接服务器端常见问题与解决
2011-06-23 09:36 1066要排除客户端与服务器 ... -
Oracle 常用数据字典
2011-06-23 09:33 895--Oracle 数据字典 --Oracle 数据字典 ... -
ORACLE函数大全
2011-04-14 16:55 668SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制 ... -
ORACLE面试题及答案
2011-04-14 16:54 14841.解释冷备份和热备份 ... -
Oracle(SQL)优化
2011-04-14 16:47 8211. 选用适合的优化器 Ora ... -
ORACLE AUTOTRACE介绍
2011-04-14 16:46 1069AUTOTRACE是一项 SQL*Plus 功 ... -
Oracle数据字典
2011-04-14 16:44 782oracle数据库系统是一个复杂的软件系统。如果不了解 ... -
Oracle SQL合并查询笔记
2010-11-14 10:45 1117在Oracle sql查询过程当中,可以使用 ... -
Oracle SQL子查询笔记
2010-11-14 00:53 2395子查询是指嵌入在其他SQL语句中的SELECT语 ... -
Oracle 连接查询学习笔记
2010-11-13 20:51 779一、内连接和外连接 内连接用于返回满足连接条件的记录;而 ... -
Oracle 统计分组语句
2010-11-12 17:24 1359在应用系统开发中,进行需要统计数据库中的数据,当执 ...
相关推荐
oracle学习总结.docx
Oracle 学习总结,包含从Oracle入门到触发器的学习,内含一些学习中的练习题及资源
oracle学习过程中的一些总结,包括一些基本的sql语法,oracle时间字符串函数等。
oracle学习心得和总结,本人看过,感觉超好
Oracle数据库学习日记-实用性最强的Oracle学习总结
Oracle学习总结以及真实练习题目、答案详解
这是我学习oracle后的学习总结,里面很多东西还是很有用的,时候刚学习oracle 的人
有关Oracle学习总结.docx