ORACLE学习笔记(不断追加)

SqlPlus

Tab数据表视图词典,Col表列词典

修改日期显示格式

Alter session set nls_date_format='yyyy-mon-dd hh:mi:ss';

测试:select sysdate from table;

相关:Current_datenext_day

select next_day(sysdate,'星期五') from hr.students; //表示sysdate所在周的星期五是几号

[@more@]

SqlPlus

Tab数据表视图词典,Col表列词典

修改日期显示格式

Alter session set nls_date_format='yyyy-mon-dd hh:mi:ss';

测试:select sysdate from table;

相关:Current_datenext_day

select next_day(sysdate,'星期五') from hr.students; //表示sysdate所在周的星期五是几号

转换函数

select to_char(sysdate,'yyyy-mm-dd') from hr.students;

select to_date('07-2007-10','mm-yyyy-dd') from hr.students;

select to_number('1.11') from hr.students;

Select user from dual; //查询当前登录用户

alter table hr.jobs modify job_title varchar2(100); //更改数据列类型长度

Set linesize 200 //设置sqlplus的显示行宽,默认为100

DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。

例:select sum(decode(salary,10000,1,0)) aa from employees; //表示salary字段值为10000的个数,当salary等于10000时返回1,否则返回0Sum处理后等于是记录符合条件的条数

Nvl判断Null值函数select name,nvl(addr,'未输入') from students;

表间连接查询:

内连接:join

例:Select a.id,a.name,b.department from a join b on a.id=b.id

等价:Select a.id,a.name,b.department from a,b where a.id=b.id

外连接:左连接、右连接

例:左连接Select a.id,a.name,b.department from a,b where a.id(+)=b.id

右连接Select a.id,a.name,b.department from a,b where a.id=b.id(+)

子查询:分类为无关子查询相关子查询

无关子查询例子:Select * from a where a.id in (select id from b)

相关子查询例子:Select * from a where a.id in (select id from b where a.id=b.id)

无关子查询指子查询与外层查询无直接关系,而相关子查询中的子查询与外层查询有条件关联关系

UnionIntersect

Select id from a Union select id from b //合并显示a表与b表的id字段数据(非物理合并,且过滤重复数据)

Select id from a Intersect select id from b //显示a表与b表中id值都相同的字段数据(非物理合并,且只显示重复数据)

Union All //支持

批量写入表数据:

Insert into a(id,name) select id,name from b //对已有表写入批量数据

Create table a As select id,name from b //对新建数据表写入批量数据

PL/SQL

DBMS_OutPut //包输出

例:DBMS_OutPut.Put_line 输出数据行到屏幕

默认输出选项为OFF,要通过Set设为ON

Set Serveroutput On

Oracle中字段连接用||号,不同MSSQL用+号,如Select ‘abcd’||’efgh’等效于MSSQLSelect ‘abcd’+’efgh’

Set ServerOuput On //设置打开系统输出

例:Set ServerOuput On Size 10000 //Size项表示输出大小,这里指定为最多输出10000个字节

语句注释与MSSQL相同,用--/* */

变量付值:

A=’abcdefg’;

SQL中:

Select 100,’AAA’ 可以返回结果,但Oracle中一定要有From表段,所以要加入伪表Dual,改为:

Select 100,’AAA’ From Dual

循环语句的三种方式:

declare
i number;
begin
i:=0;
Loop
i:=i+1;
exit when i>10; //
退出可用IF Expression Then EXIT等实现,这是简洁写法
dbms_output.put_line(i);
end loop;
end;


declare
i number;
begin
i:=0;
while i<10 loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end;

declare
begin
for i in reverse 1 .. 5 Loop
//范围用两点..表示,reverse表示循环的顺序为从大到小,

//这时输出结果将为54321,没有reverse的话则为12345

dbms_output.put_line(i);
end loop;
end;

FOR循环中,无论是从小到大还是从大到小循环,计数器都是以加1或减1计数,不能由我们来控制

通过跳转标记GOTO的用法实现循环:

Declare
i number;
begin
i:=0;
<> //
设定标签
dbms_output.put_line(i);
i:=i+1;
if i<10 then
goto repeat_loop; //
跳转至标签
end if;
end;

异常处理:

1.系统异常

declare
id varchar2(100);
begin
select job_id into id from hr.jobs;
dbms_output.put_line(id);
Exception
When no_data_found then
Dbms_output.put_line(‘
错误:没有找到任何数据!’);
When Too_many_Rows then

Dbms_output.put_line('错误:返回了多行数据!');

When Others Then

Dbms_output.put_line(‘错误:发生其它未知错误!’);
End;

系统预定义异常:

No_Data_Found //Select into语句中无返回值

Too_Many_Rows //Select Into语句中返回了多行值

Dup_Val_On_Index //向有唯一约束的表中插入了重复值

Value_Error //一个算法、转换、类型或大小发生错误

Zero_Divide //遇到被零除错误

Others //遇到其它错误

2.自定义异常

Declare
x number;
error exception; //
定义异常类型类量error
begin
x:=0;
<> //
设置标签
dbms_output.put_line(x);
x:=x+1;
If x=5 then
raise error; //
提出异常error
end if;
if x<10 then
goto a;
end if;
Exception
when error then
dbms_output.put_line('5
不是需要的值');
end;

复合变量(记录):

由几个相关值组成的记录,通常用于支持SELECT语句的返回值,而不用对每一列进行变量存储处理。

1.定义N个变量与表字段相同,并使用它们

declare
Type myrecord is record( //
定义一个含字符类型两个变量的记录
jobid varchar2(100),
title varchar2(100));
real_record myrecord; //
申明变量(实例化变量)
begin
select job_id,job_title into real_record from hr.jobs where job_id='ST_MAN'; //Into
申明变量,而不是定义时的记录名dbms_output.put_line('ID='|| real_record.jobid ||' Title='||real_record.title); //用申明变量名.子变量名的方式调用
end;

2.定义与表字段相同数目及类型的变量,并使用它们

declare
myrec hr.jobs%Rowtype; //
定义记录myrec,使其包含hr.jobs表中的每个字段相同类型及大小的变量
begin
select * into myrec from hr.jobs where job_id='ST_MAN'; //
这种试必须将Select * 写入记录Myprc
dbms_output.put_line('ID='||myrec.job_id||' Title='||myrec.job_title ||' MinSalary='||myrec.min_salary); //
调用时与表字段名相同
end;

定义类型配置的变量:

使定义的变量与表中某个字段的类型及长度完全一致

declare
Type myrecord is record(
jobid hr.jobs.job_id%type, //
表示定义Myrecord记录,其中jobid变量的类型与长度与表hr.jobs中的job_id字段完全一致title varchar2(100));
real_record myrecord;
begin
select job_id,job_title into real_record from hr.jobs where job_id='ST_MAN';
dbms_output.put_line('ID='||real_record.jobid||' Title='||real_record.title);
end;

表变量(数组)

1.语法:

TYPE Type-name IS TABLE OF %TYPE

INDEX BY BINARY_INTERGER;

例:

DECLARE
TYPE JOBTITLE IS TABLE OF HR.JOBS.JOB_TITLE%TYPE
INDEX BY BINARY_INTEGER;
TITLE JOBTITLE;
I NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE;
I:=0;
FOR A IN (SELECT * FROM HR.JOBS) LOOP
I:=I+1;
TITLE(I):=A.JOB_TITLE;
END LOOP;

FOR B IN 1..I LOOP
DBMS_OUTPUT.PUT_LINE(TITLE(B));
END LOOP;
END;

游标:

Declare Cursor mycus Is Select * from Books; //定义游标mycus,定义完后自动关闭

Myrecord Books%RowType; //定义复合变量(记录),用于保存Select * from Books返回的每一个结果字段

Begin

Open mycur; //打游标结果集

Fetch mycur Into myrecord; //读取游标结果集中的第一条数据到Myrecord记录中

While mycur%Found Loop //判断是否还有数据可取,前提为至少已经Fetch取了了一条数据,对能知道是否还有数据可取

DBMS_OutPut.Put_Line(myrecord.books_id|| ’,’ || myrecord.books_name);

Fetch mycur Into Myrecord;

End Loop;

Close mycur;

End; /

游标的属性:

%Found:布尔型判断,判断游标是否还有数据可提取(是否最后一行),有数据返回True,无返回False

%IsOPen:布尔型判断,判断游标是否已打开

%NotFound:布尔型判断,判断游标是否还有数据可提取(是否最后一行),无数据返回True,有返回False

%RowCount:返回游标处理行的当前计数器

Oracle游标支持参数:

Declare Cursor Cur (Id varchar) Is //作为参数时时需要给出参数类型,不需给长度(存储过程及函数也是如此)

Select Book_Name From Books Where Book_IdId;

t_name Books.Books_name%Type; //定义一个与Book表的book_name字段同样类型的变量

Begin

Open Cur(‘0001’); //打开游标,传一个参数进去

Loop

Fetch cur Into t_name;

Exit when cur%Notfound; //判断当游标没有数据可取的时候退出

DBMS_OutPut.Put_Line(t_name);

End Loop;

Close Cur

End;

For循环在游标中的应用:

declare
cursor mycur is select * from hr.jobs;
begin
For cur in mycur Loop //For
循环中,Cur计数器变量不用定义,使用游标时不用OpenFetch
dbms_output.put_line(cur.job_title);
End loop;
End;

这样,会将游标mycur中的每条记录取数入到For循环计数器中,并执行循环体中的动作。

要通过游标更改数据时,必须在定义游标时指定为Update选项:

declare
cursor updatejobs is select job_title from hr.jobs for update;
title varchar(100);
begin
open updatejobs;
fetch updatejobs into title;
while updatejobs%found Loop
Update hr.jobs set job_title=title||'_1' where Current Of updatejobs; //Current of cur
表示判断当前行,只更新本条记录行数据
End loop;
End ;
存储过程:

一、创建语法:

Create [Or Replace] ProceDure procedurename //括号不是是必须的,当没有参数时一定不能加括号,否则是错误

[Param1 [{IN | OUT | IN OUT}] param1_Type], //Oracel默认参数类型为输入参数IN

[Param1 [{IN | OUT | IN OUT}] param1_Type] //参数必须指定数据类型,而且不能指定长度

Is | As

Begin

Proc_Body;

End;

说明:

Create ProceDure ProcName //创建新的存储过程ProcName(当已有名为ProcName的存储过程时将报错)

Create or Replace ProceDure ProcName //创建或复盖存储过程ProcName(推荐使用)

查看存储过程编绎错误具体信息:Show Errors //只这样表示显示最近一次编绎的存储过程的信息

查看指定存储过程编绎错误具体信息:Show Errors Procedure ProcName

存储过程体中没有DECLARE段,写了DECLARE段的话是错误的 (自动失效)

执行存储过程的方法:

1. 语句块方式: //用于存储过程有参数,而参数是变量付值而不是常数时

Declare

Title varchar(10);

Begin

Title := ‘Anson’

Myproc(Title);

End;

2.Execute 方式: //用于参数是常数或不带参数的存储过程

Execute myproc(‘Anson’)

但如果通过语句块执行存储过程时用了Execute是不支持的:

Begin

Execute myproc(‘Anson’)

End;

上面的写法是错误的

函数:

Create [or Replace] Function function-name

Return datatype;

[declaretion] //declare段,但不能有declare关键字

Section //函数主体语句段

Return var;

End function-name;

例:

create or replace function a(salary number)
return varchar2
is
id varchar2(4000);
begin
id:='';
for i in (select job_id from hr.jobs where max_salary=salary) loop
if id is null then
id:=id||i.job_id;
else
id:=id||'****'||i.job_id;
end if;
end loop;
return id;
end a;

包:

包是存储在Oracle数据库中相关的过程或函数的集合体,包必须包括 包说明 包体 两部分组成;

一、包说明创建语法:

CREATE [Or replace] PACKAGE package-name IS

Section //指包含函数或存储过程的说明

End package-name

例:

Create or replace Package aboutmystudents Is

Procedure UpdateStudents(id In number);

Function maxnumber(id In number) return number;

End aboutmystudents;

说明包aboutmystudents中包含一个存储过程UpdateStudents及一个函数maxnumber

二、包体创建语法:

CREATE PACKAGE BODY package-name IS

Section

Procedure-Body;

Function-Body;

End package-name;

例:

数据库备份与恢复:

1. 逻辑备份恢复(EXPIMP

2. 物理备份

a. 冷备份(关闭数据库后复制相关数据及日志文件)

b. 热备份

逻辑备份恢复:

1. Exp “sys/pass as sysdba”

2. 设置缓冲区大小

3. 设置存放路径及文件名 //D:myoraclebak.DMP (Exp备份文件类型为DMP)

4. 选择备份模式:E(完整数据库备份)U(用户模式备份)T(表模式备份)

5. 按提示完成相关选项即可。

1. Imp “sys/pass as sysdba”

2. 设置待回复的备份文件路径及文件名 //d:myoraclebak.DMP

3. 设置缓冲区大小

4. 是否包含重要文件? //不清楚具体作用,默认即可

5. 是否忽略创建的语句? //如只是数据丢失不需要建表,即表在数据不在时可忽略,但建议在不清楚的情况下选NO

6. 其它按提示完成相关选项即可

物理备份-冷备份:(略)

物理备份-热备份(联机备份):

1. 必须将日志模设置为归档模式:

A). archive log list //查看归档模式信息

可能得到结果:

数据库日志模式 非存档模式

自动存档 禁用

存档终点 C:oracleora90RDBMS //指归档日志存放路径

最早的概要日志序列 0

当前日志序列 1

B). 启用归档模式:

alter system set log_archive_start=true scope=spfile;

c). Shutdown immediate //停止数据库

d). Startup mount //mount模式启动数据库(Mount模式指只打开控制文件,不打开数据文件)

e). alter database archivelog; //将数据库切换到归档方式

f.). alter database open; //打开数据文件

函数使用说明及其它经验知识积累:

一、函数使用

1. Row_number() over(order by col)

为结果集生成一个序号,根据col列的排列顺序生成该序号(也可用DESC降序处理COL列),句例1

select Job_id,salary,row_number() over(order by salary desc) rowno from hr.employees;

也可根据某字段的值分组生成序号,句例2

select Job_id,salary,row_number() over(partition by job_id order by salary desc) rowno from hr.employees;

句例2表示根据job_id分组、并按salaryDESC排序生成序号

实例:

要求得到每个JOB_ID项目中员工销售数量最多的员工IDJobID及其在所有员工中的销售排名次,则可以写为

select * from (
select employee_id,job_id,row_number() over(order by salary desc) AllSalNo ,row_number() over(partition by job_id order by salary desc) JobSalNo from hr.employees
) a where a.jobsalno=1;

如果只需要根据某个字段生成序号,不需分组生成,Oracle提供了Rowno隐式字段,则句例1可直接写为:

select Job_id,salary,rownum from (Select job_id,salary from hr.employees order by salary desc )a

三、经验知识积累

1spool常用的设置
set colsep' ';
    //域输出分隔符
set echo off;
    //显示start启动的脚本中的每个sql命令,缺省为on
set feedback off;
  //回显本次sql命令处理的记录条数,缺省为on
set heading off;
   //输出域标题,缺省为on
set pagesize 0;
   //输出每页行数,缺省为24,为了避免分页,可设定为0
set termout off;
   //显示脚本中的命令的执行结果,缺省为on
set trimout on;
   //去除标准输出每行的拖尾空格,缺省为off
set trimspool on;
  //去除重定向(spool)输出每行的拖尾空格,缺省为off

2.系统选项

Set Serveroutput On/Off //设置输出项,在语句块中使用dbms_output.enable;

Set linesize 1000 //设置行宽

Set auto On/Off //设置自动Commit

2. 相关表/视图/函数

User_objects //用户对象目录表,列举了用户的table,index,view,proc,fun等所有对象

User_source //用户对象代码表,存储用户某对象的代码,如某Proc的代码信息

dba_objects //数据库对象信息,与MSSQL中的sysobjects类似

四、学习过程中遇到的错误及解决方法:

1. 登录时提示ORA-12560: TNS: 协议适配器错误。

原因:默认数据库实例有问题

解决方法:set orac

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/224511/viewspace-920882/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/224511/viewspace-920882/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值