Oracle 笔记

来源:互联网 发布:网上卖东西的软件 编辑:程序博客网 时间:2024/06/11 16:43
创建用户: CREATE USER 用户名 IDENTIFIED BY 密码;
用户解锁: ALTER USER 用户名 ACCOUNT UNLOCK/LOCK;
授予权限: GRANT CREATE SESSION TO 用户名;
管理员权限: GRANT DBA TO 用户名;
删除用户: DROP USER 用户名;
删除用户及数据:DROP USER 用户名 cAScade;

创建表:
CREATE TABLE 表名 (id Number NOT NULL Primary Key,email Varchar2(20),age Number Default 0);
修改数据表名:ALTER TABLE 表名 RENAME TO 新表名;
修改列名:ALTER TABLE 表名 RENAME COLUMN 列名 TO 新列名;
修改列的数据类型:ALTER TABLE 表名 MODIFY 列名 NEW_DATATYPE;
插入列:ALTER TABLE 表名 ADD 列名 DATATYPE;
删除列:ALTER TABLE 表名 DROP COLUMN 列名;
清空表: TRUNCATE TABLE 表名;
删除表: DROP TABLE 表名;

创建序列:
CREATE SEQUENCE SEQ_序列名 START WITH 1 INCREMENT BY 1 NOCYCLE nomaxvalue;
修改序列: ALTER SEQUENCE SEQ_序列名  INCREMENT BY 10 MAXVALUE 10000 ;  
删除序列: DROP SEQUENCE SEQ_序列名;

创建视图:
CREATE OR REPLACE VIEW VW_视图名 AS SELECT * FROM 表名 [WITH READ ONLY];
查询视图: SELECT VIEW_NAME FROM USER_VIEWS;
视图授权: GRANT CREATE ANY VIEW TO 用户名;
删除视图: DROP VIEW 视图名;
强制创建视图: CREATE FORCE VIEW
创建复杂视图:
CREATE VIEW VW_视图名 (job,avg,sum,max,min) AS SELECT job,avg(sal),sum(sal),max(sal),min(sal) FROM emp group by job;
创建连接视图:
CREATE VIEW 视图名 AS SELECT d.deptno,d.dname,d.loc,e.ename,e.sal FROM dept d,emp e where d.deptno= e.deptno and d.deptno in(10,30);

查询索引: SELECT * [INDEX_NAME] FROM USER_INDEXES;
创建索引: CREATE INDEX PK_索引名 ON 表名(列1,列2);
删除索引: DROP INDEX PK_索引名;

PL/SQL:
结构:
 DECLARE
 声明部分
 BEGIN
 编写主题
 EXCEPTION
 捕获异常
 END;
//结果不显示时 set serveroutput on
SSH模式下:打开输出
SQL> set serveroutput on
SQL语句最后加上斜杠  /
1、 DECLARE
 i number;
 BEGIN
 i:=1/0;
 exception
 when zero_divide THEN
  dbms_output.put_line('error');
 end;
2、Loop 循环(do…while):
 DECLARE
 cou number;
 BEGIN
 cou:=1;
 loop
 dbms_output.put_line(cou);
 exit when cou>10;
 cou:=cou+1;
 end loop;
 end;
3、(while 循环):
 DECLARE
 x number;
 BEGIN
 x:=1;
 while(x<5)loop
 dbms_output.put_line(x);
 x:=x+1;
 end loop;
 end;
4、(for 循环):
 DECLARE
 x number;
 BEGIN
 FOR x IN 1..7LOOP
 DBMS_OUTPUT.put_line(x) ;
 end loop;
 end;
5、(IF…ELSIF…ELSE 语句):
 DECLARE
 x number;
 BEGIN
 x:=1;
 if x>5 THEN
 dbms_output.put_line(x);
 elsif x>3 THEN
 dbms_output.put_line('less');
 else
 dbms_output.put_line('fail');
 end if;
 end;
6、 插入表:
 declare
 no number;
 begin
 no:=1;
 while(no<=5)loop
 insert into emp(id,salary,name) values(no,20,'ss');
 no:=no+1;
 end loop;
 end;

游标操作步骤:
声明游标->打开游标->取出结果,此时的结果取出的是一行数据->关闭游标
使用 for 循环操作游标(比较常用)
DECLARE
--  声明游标
CURSOR mycur IS SELECT * FROM emp where empno=-1;
empInfo emp%ROWTYPE ;
cou NUMBER ; BEGIN
--  游标操作使用循环,但是在操作之前必须先将游标打开
FOR empInfo IN mycur LOOP
cou := mycur%ROWCOUNT ; DBMS_OUTPUT.put_line(cou||'雇员编号:'||empInfo.empno) ; DBMS_OUTPUT.put_line(cou||'雇员姓名:'||empInfo.ename) ; END LOOP ;
END ;

创建函数:
CREATE OR REPLACE FUNCTION 函数名(en emp.ename%type) return number as is_exist number;
begin
SELECT count(*) into is_exitst from emp where ename=upper(en);
return is_exist;
end;/
查询函数:SELECT 函数名(7369) FROM dual ;

创建存储过程:
 Create Proc dbo.csp_AddInfo
 -- 存储过程参数
 @UserName varchar(16),
 @Pwd varchar(50),
 @Age smallint,
 @Sex varchar(6)
 AS
 -- 存储过程语句体
 insert into Uname (UserName,Pwd,Age,Sex)
     values (@UserName,@Pwd,@Age,@Sex)
 RETURN
 -- 执行
 GO      
 -- 执行存储过程
 EXEC csp_AddInfo 'Junn.A','123456',20,'男'
例: CREATE OR REPLACE PROCEDURE SP_存储过程名 AS
 i NUMBER ;
 BEGIN
 i := 100 ;
 DBMS_OUTPUT.put_line('i = '||i) ;
 END ;
执行存储过程: SQL> exec SP_存储过程名;
删除存储过程: DROP PROCEDURE SP_存储过程名;
查看存储过程:SELECT distinct name from user_source;
 
1.带参数:
create or replace procedure sp_t2(n in varchar2,a in number) as
begin
insert into mytest(name,age) values(n,a);
end sp_t2;
/
SQL> exec sp_t2('ou',30);

2.有返回值的存储过程:
CREATE OR REPLACE PROCEDURE SP_EMP(V_ENO IN NUMBER,V_EN OUT VARCHAR2) AS
BEGIN
SELECT ENAME INTO V_EN FROM EMP WHERE EMPNO=V_ENO;
END;
/

3.返回列表:
创建包:
CREATE OR REPLACE PACKAGE PA_EMP AS
TYPE T_CURSOR IS REF CURSOR;
END PA_EMP;
/
创建存储过程:
CREATE OR REPLACE PROCEDURE SP_EMP2(p_CURSOR out PA_EMP.T_CURSOR) IS
BEGIN
 OPEN p_CURSOR FOR SELECT * FROM EMP;
END SP_EMP2;
/




导出数据:EXT 用户名/密码@数据库名 FILE=路径名 OWNER=用户名
导入数据:IMP 用户名/密码@数据库名 FILE=路径名 FULL=Y

查询语句:
1、TOP前5: SELECT * FROM ts where rownum<=5;
2、TOP末5: SELECT * FROM (SELECT * FROM ts order by id desc) where rownum<=5;

删除ID唯一的重复数据
1、delete FROM ts where id not in (SELECT min(id) FROM ts group by name,age);
2、delete FROM ts where id in(SELECT distinct a2.id FROM ts a1,ts a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);
3、delete FROM ts a1 where exists(SELECT * FROM ts a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);

高级查询:
1、随机返回 5 条记录: SELECT *from (SELECT ename,job from emp order by dbms_random.value()) where rownum<=5;
2、得到当前行上一行或者下一行的数据
SELECT ename,sal,lead(sal) over(order by sal) aaa ,lag(sal) over(order by sal) bbb from emp;
lead是根据over的规则取下行记录,lag是根据over的规则取上行记录,两者可以从逻辑上互相取代。
3、确定一年内的天数: SELECT add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y') from dual;





1 sequence用法
create sequence seq_emp
increment by 1  --每次加几个
start with 1    --从1开始计数
maxvalue n        --设置最大值
nomaxvalue        --不设置最大值
nocycle            --不循环累加
cycle            --循环累加
cache 10        --缓存大小10
nocache            --无缓存
创建好后
seq_emp.currval --sequence 当前值
seq_emp.nextval --sequence 增加值