oracle基本操作


DDL(数据定义语言):
create创建
创建表:
create table <table_name(
column datatype [not null] [primary key],
column2 datatype [not null],
……
)
复制表:
create table <table_name> as <select 语句>
创建索引:
create [unique] index <index_name> on <table_name>(字段[asc|desc]);
create index i_1 on emp(empno asc);
创建同义词:
create synonym <synonym_name> for <tableename/viewname>
create synonym mm for emp;
alter修改
alter table:
添加字段:
alter table <table_name> add (字段 类型 [not null]);
修改字段:
alter table <table_name> modify (字段 类型);
删除字段:
alter table <table_name> drop 字段;
修改表名:
alter table <table_name> to <new_table_name>;
添加约束:
alter table <table_name> add constraint <constraint_name> 约束类型 (针对的字段名);
alter table emp add constraint pk primary key (empno);
约束禁用:
alter table <table_name> disable constraint <constraint_name>;
约束重启:
alter table <table_name> enable constraint <constraint_name>;
删除约束:
alter table <table_name> drop constraint <constraint_name>;
drop删除:
drop table 删除表:
drop table <table_name>;
drop table emp;
drop index 删除索引:
drop index <index_name>;
drop synonym 删除同义词:
drop [public/private] synonym <synonym_name>;

DML(数据操纵语言)
insert into (插入记录)
insert into table_name(column1,column2,……) values (column1,column2,……);
insert into table_name (select 语句);
create table a as select * from emp where 1=2;
insert into a select * from emp where sal>2000;
select 查询记录
select [distinct] <column1 as[new name],column2……>
from <table_name>
where <条件>
[group by <column_list]
[having <条件>]
[order by <column_list <asc|desc];
DISTINCT --表示隐藏重复的行
WHERE --按照一定的条件查找记录
GROUP BY --分组查找(需要汇总时使用)
HAVING --分组的条件
ORDER BY --对查询结果排序
AVG --求平均值
MAX --求最大值
MIN --求最小值
COUNT --求个数
update (更新数据)
update table_name set column1 =new value,column2=new value,…… where <条件>;
update emp set sal=1000,empno=8888 where ename='SCOTT';
delete (删除数据)
delete table_name where <条件>;
delete from emp where empno='7788';

DCL(数据控制语言)
授权
grant <权限列表> to <user_name>;
收回权限
revoke <权限列表> from <user_name>;
connect 连接
resource 资源
unlimited tablespace 无限表空间
dba 管理员
session 会话

TCL(事务控制语言)
commit;
rollback to savepoint 回滚;
savepoint <savepoint> 保存位置;

oracle其他对象
视图:
create or replace view <view_name> as <select 语句>;
drop view <view_name>

序列:
create sequence <sequence_name>
increment by n
start with n
[maxvalue n][minvalue n]
[cycle|nocycle]
[cache n|nocache]
INCREMENT BY n --表示序列每次增长的幅度;默认值为1.
START WITH n --表示序列开始时的序列号。默认值为1.
MAXVALUE n --表示序列可以生成的最大值(升序).
MINVALUE n --表示序列可以生成的最小值(降序).
CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。
CACHE --允许更快的生成序列.
create sequence se_1
increment by 1
start with 100
maxvalue 999999
cycle;

alter sequence <sequence_name>
increment by n
start with n
maxvalue n minvalue n
cycle|nocycle
cache n|nocache

drop sequence <sequence_name>

select <sequence_name>.netxval from dual;
select <sequence_name>.currval from dual;

用户:
create user <user_name> [profile "DEFAULT"]
identified by "<password>" [default tablespace "USERS"]
DROP user <user_name> cascade;

角色:
create role <role_name>
identified by "<password>"

drop role <role_name>;

PL/SQL
基本结构:
declare
声明语句
begin
执行语句
exception
执行语句
end;
条件控制语句:
IF《条件1》THEN
语句
elsif <条件2> THEN
语句
……
elsif <条件n> THEN
语句
else
语句
end if;

循环控制语句
1. LOOP
语句
exit when<条件>
end loop;
2.while loop
while <条件>
loop
语句
end loop;
3.FOR
for <循环变量> in 下限 .. 上限
LOOP
语句
END LOOP;
NULL语句
null;
表示没有操作;
注释使用
单行注释:--
多行注释:/*.........
..................*/
异常处理
EXCEPTION
when <异常类型> THEN
语句
WHEN OTHERS THEN
语句;
END;

游标:
显示游标
定义:CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
[FOR UPDATE | FOR UPDATE OF 字段] --给游标加锁,既是在程序中有"UPDATE","INSERT","DELETE"语句对数据库操作时。
游标自动给指定的表或者字段加锁,防止同时有别的程序对指定的表或字段进行"UPDATE","INSERT","DELETE"操作.
在使用"DELETE","UPDATE"后还可以在程序中使用CURRENT OF <游标名> 子句引用当前行.
操作:OPEN<游标名>
FETCH<游标名> INTO 变量1,变量2,……变量n;
或者
fetch <游标名> INTO 行对象;
CLOSE <游标名>
属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
%FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
%ROWCOUNT --返回游标当前行的行数;
%ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
使用:
LOOP循环
DECLARE
cursor c_1 select * from emp;
r c_1%rowtype;
begin
if c_1%isopen then
close c_1;
end if;
open c_1;
dbms_output.put_line('行号 姓名 薪水');
LOOP
FETCH c_1 into r;
exit when c_1%notfound;
dbms_output.put_line(c_1%rowcount||' '||r.ename||' '||r.sal);
end loop;
end;
for循环使用游标是在循环开始前自动打开游标,并且自动取值到循环结束后,自动关闭游标.
游标加锁实例
declare
cursor c_1 is select ename,sal from emp for update of sal;
begin
dbms_output.put_line(行号 姓名 薪水);
for i in c_1
loop
update emp set sal=sal + 1000 where curent of c_1;
end loop;
for i in c_1
loop
dbms_output.put_line(c_1%rowcount||' '||i.ename||' '||i.sal):
end loop;
end;
代参数的游标
定义:CURSOR <游标名>(参数列表) IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
示例:
DECLARE
cursor c_1(name emp.ename%type) is select ename,sal from emp where ename=name; --定义游标
BEGIN
dbms_output.put_line('行号 姓名 薪水');
FOR i IN c_1('&name') --for循环中的循环变量i为c_1%rowtype类型;
LOOP
dbms_output.put_line(c_1%rowcount||' '||i.ename||' '||i.sal); --输出结果,需要 set serverout on 才能显示.
END LOOP;
END;

PL/SQL表

PL/SQL记录类型:

REF游标:

过程:
定义:create or replace procedure《过程名》[(参数列表)] is
局部变量声明
begin
可执行语句
exception
异常处理语句
end 过程名;
变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
操作以有的过程:在PL/SQL块中直接使用过程名;在程序外使用execute <过程名>[(参数列表)]
create or replece procedure p_1(n in out number) is
r emp%rowtype;
begin
dbms_output.put_line('姓名 薪水');
select * into r from emp where empno =n;
dbms_output.put_line(r.ename||' '||r.sal);
n:=r.sal;
end;
declare
n number;
begin
n:=&请输入员工号:
p_1(n);
dbms_output.put_line('n的值为 ’||n);
end;
删除过程:
drop procedure <过程名>;
函数:
create or replace function <过程名>[参数列表] return 数据类型 is
局部变量声明
begin
可执行语句
exception
异常处理语句
end <过程名>;
变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
create or replace function f_1 (n number) return number is
r emp%rowtype;
begin
dbms_output.put_line('姓名 薪水');
select * into r from emp where empno =n;
dbms_output.put_line(r.ename||' '||r.sal);
return r.sal;
end;
declare
n number;
m number;
begin
n:=&请输入员工号:
m:=f_1(n);
dbms_output.put_line('m的值为'||m);
end;

drop function <函数名>;

数据包:
create or replace package <数据包名> AS
----公共类型和对象声明
----子进程说明
end;
定义包的主体
create or replace package body <数据包名> as
----公共类型和对象声明
----子进程说明
begin
--初始化语句
end;
创建数据包规范:
create or replace package p_1 as
n number;
procedure p_1;
function f_1 return number;
end;
创建数据包主体:
create or replace package body pack_1 as
procedure p_1 is
r emp%rowtype;
begin
select * into r from emp where empno =7788;
dbms_output.put_line(r.empno||' '||r.ename||' '||r.sal);
end;
function f_1 return number is
r emp%rowtype;
begin
select * into r from where empno=7788;
return r.sal;
end;
end;
使用包:
declare
n number;
begin
n:=&请输入员工号:
pack_1.n:= n;
pack_1.p_1;
n:=pack_1.f_1;
dbms_output.put_line('薪水为'||n);
end;

create or replace package body pack_2 as
type c_type is ref cursor;
procedure p_1(c_1 in out c_type);
end;

create or replace package body pack_2 as
procedure p_1(c_1 in out c_type) is
begin
open c1 for select * from emp;
end;
end;
var c_1 refcursor;
set autoprint on;
execute pack_2.p_1(:c_1);
drop package <包名>;

触发器:
创建触发器:
create or replace trigger <触发器名>
before|after|insert|delete|update of [列名] on 《表名》
for each row;
where <条件>
<PL/SQL块>
alter trigger <触发器名> disable;
alter trigger <触发器名> enable;
alter trigger <触发器名> disable add triggers;
alter trigger <触发器名> enable all triggers;
删除触发器
drop trigger <触发器名>;

自定义对象:
create or replace type <对象名> as object(
属性1 类型
属性2 类型


)
其他:
1.在PL/SQL中使用DDL
将sql语句赋给一个varchar2变量,在用execute immediate 这个varchar2变量即可;
declare
str varchar2(200);
begin
str:='create table test(id number,name,varchar2(20))';
execute immediate str;
str:='insert into test values(3,"c")';
execute immediate str;
end;

2.判断表是否存在;
declare
n tab.tname%type;
begin
select tname into n from tab where tname='&请输入表名';
dbms_output.put_line('此表已存在');
exception
when no_data_found then
dbms_output.put_line('还没有此表');
end;
2.查看以有的过程;
select object_name,object_type status from user_objects where object_name="PROCEDURE";

附录:
oracle 的数据类型:
数据类型 描述
VARCHAR2(size) 可变长度的字符串,其最大长度为size个字节;size的最大值是4000,而最小值是1;你必须指定一个VARCHAR2的size;
NVARCHAR2(size) 可变长度的字符串,依据所选的国家字符集,其最大长度为size个字符或字节;size的最大值取决于储存每个字符所需的字节数,其上限为4000;你必须指定一个NVARCHAR2的size;
NUMBER(p,s) 精度为p并且数值范围为s的数值;精度p的范围从1到38;数值范围s的范围是从-84到127;
例如:NUMBER(5,2) 表示整数部分最大3位,小数部分为2位;
NUMBER(5,-2) 表示数的整数部分最大为7其中对整数的倒数2位为0,前面的取整。
NUMBER 表示使用默认值,即等同于NUMBER(5);
LONG 可变长度的字符数据,其长度可达2G个字节;
DATE 有效日期范围从公元前4712年1月1日到公元后4712年12月31日
RAW(size) 长度为size字节的原始二进制数据,size的最大值为2000字节;你必须为RAW指定一个size;
LONG RAW 可变长度的原始二进制数据,其最长可达2G字节;
CHAR(size) 固定长度的字符数据,其长度为size个字节;size的最大值是2000字节,而最小值和默认值是1;
NCHAR(size) 也是固定长度。根据Unicode标准定义
CLOB 一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节
NCLOB 一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节;储存国家字符集
BLOB 一个二进制大型对象;最大4G字节
BFILE 包含一个大型二进制文件的定位器,其储存在数据库的外面;使得可以以字符流I/O访问存在数据库服务器上的外部LOB;最大大小为4G字节.

函数:
字符函数:
concat(字符串1,字符串2)
select concat(job,ename) from emp;
lpad(字段,总的大小,填充字符);
rpad(字段,总的大小,填充字符);
lower();
upper();
initcap();首字母大写,其余小写
length();
substr(字符串,开始位置,长度);
instr(字符串,字符);
trim(字符 from 字符串);
to_char();
replace(字符串,字符串1,字符串2);
translate();
ascii(char);

数学函数:
nlssort(字符串);
abs(数字);
cell(数字);
floor(数字);
mod(被除数,除数);
round(数字,从第几位开始取);
sign(数字);
sqrt(数字);
power(m,n);
trunc(数字,从第几位开始);
greatest(数字列表);
sin(n);
cos(n);
tan(n);
acos(n);
atan(n);
exp(n):
ln(n);
log(m,n);

日期函数:
add_months(日期,数字);
last_day(日期);
months_between(日期1,日期2);
new_time(时间,时区,'gmt');
next_day(d,char);

其它函数:
vsize(类型);
nvl(字符串,替换字符);

常用命令:
desc 表名;
set serverout on|off
set pagesize 大小
set linesize 大小
set autoprint on|off
select sysdate from dual;
alter session set nls_date_format='格式';
select * from tab;
show user;
help topic;
save file_name
run file_name
get file_name
list
ed
del 行数
del 开始行 结束行
input 字符串
append 字符串1
C/以前的字符串/替换的字符串
connect
disconnect
quit
exp
imp


异常类型:
CURSOR_ALREADY_OPEN 试图"OPEN"一个已经打开的游标
DUP_VAL_ON_INDEX 试图向有"UNIQUE"中插入重复的值
INVALID_CURSOR 试图对以关闭的游标进行操作
INVALID_NUMBER 在SQL语句中将字符转换成数字失败
LOGIN_DENIED 使用无效用户登陆
NO_DATA_FOUND 没有找到数据时
NOT_LOGIN_ON 没有登陆Oracle就发出命令时
PROGRAM_ERROR PL/SQL存在诸如某个函数没有"RETURN"语句等内部问题
STORAGE_ERROR PL/SQL耗尽内存或内存严重不足
TIMEOUT_ON_RESOURCE Oracle等待资源期间发生超时
TOO_MANY_ROWS "SELECT INTO"返回多行时
VALUE_ERROR 当出现赋值错误
ZERO_DIVIDE 除数为零

原文地址:https://www.cnblogs.com/zszitman/p/6640076.html