--数据字典(视图)
┌静态┌dba_* 存储了整个数据库所有的对象的信息--必须拥有管理员权限
│ ├all_* 存储了当前用户能访问的所有对象的信息--不一定属于当前用户
│ └user_* 存储了当前用户所拥有的对象的信息
└动态 v$*
user_tables --所有的表
user_views --所有的视图
user_constraints --所有的约束
user_sequences --所有的序列
user_indexes --所有的索引
user_procedures --存过/函数的名字和属性
user_source --所有的有名块
user_recyclebin --回收站
user_tab_cols --用户所有表的所有列的属性
user_tab_columns --用户所有表的所有列的属性
user_tab_comments --表注释
user_col_comments --列注释
v$session --terminal查看连接数据库的终端信息(电脑)
select *
from user_tab_cols
--查询scott用户下所有emp开头的表
select *
from user_tables
where table_name like 'EMP%'
--表注释
添加注释
comment on table 表名 is 注释
comment on table emp is '员工表'
comment on column 表名.列名 is 注释
comment on column emp.empno is '员工编号'
--批量删除emp开头的表,除了emp
drop table 表名;
select 'drop table '||table_name||';'
from user_tables
where table_name like 'EMP_%'
--给所有emp开头的表(除了emp),增加一个列 remark varchar2(2)
--并且默认值为'A'且非空
alter table 表名 add 列名 类型长度 约束;
alter table test9 add remark varchar2(2) default 'A' not null;
select 'alter table '||table_name||' add remark varchar2(2) default ''A'' not null;'
from user_tables
where table_name like 'EMP_%'
--动态sql
批量执行DML或DDL的sql语句
┌authid current_user --识别用户的角色权限
└execute immediate --立即执行
--向emp1,emp2,emp3插入一条数据
create table emp1 as select * from emp where 1=2;
declare
v_sql varchar2(2000);
begin
for i in 1..3 loop
v_sql:='insert into emp'||i||' select * from emp where deptno=10';
execute immediate v_sql;
end loop;
end;
select *
from emp1
--创建一个存过pro_create
--批量创建emp1-emp20和emp表结构一致
create or replace procedure pro_create
authid current_user
is
v_sql varchar2(2000);
begin
for i in 1..20 loop
v_sql:='create table emp'||i||' as select * from emp where 1=2';
execute immediate v_sql;
end loop;
end;
call pro_create();
--创建一个存过pro_drop
--批量删除emp1-emp20
create or replace procedure pro_drop
authid current_user
is
v_sql varchar2(2000);
begin
for i in 1..20 loop
v_sql:='drop table emp'||i;
execute immediate v_sql;
end loop;
end;
call pro_drop();
--写一个存过pro_insert
--向emp1-emp20插入同一条数据 (emp表的第一条数据)
create or replace procedure pro_insert
authid current_user
is
v_sql varchar2(2000);
begin
for i in 1..20 loop
v_sql:='insert into emp'||i||' select * from emp where rownum=1';
execute immediate v_sql;
end loop;
end;
call pro_insert();
select *
from emp1
--创建一个存储过程
--批量创建emp1-emp20表数据同emp,
--偶数表的SCOTT的工资+10000,
--打印emp1-emp20,每张表SCOTT的工资
create or replace procedure pro_11
authid current_user
is
v_sql varchar2(2000);
v_sql2 varchar2(2000);
v_sql3 varchar2(2000);
v_sal number;
begin
for i in 1..20 loop
v_sql:='create table emp'||i||' as select * from emp';
execute immediate v_sql;
if mod(i,2)=0 then
v_sql2:='update emp'||i||' set sal=sal+10000 where ename=''SCOTT''';
execute immediate v_sql2;
end if;
v_sql3:='select sal from emp'||i||' where ename=''SCOTT''';
execute immediate v_sql3 into v_sal;
dbms_output.put_line(v_sal);
end loop;
end;
call pro_11()
--子句
┌into 子句 从动态sql中取值
└using 子句 向动态sql中传值
--using子句和into子句一起使用时,先写into在写using
--传入一个员工编号和员工姓名,用using子句向emp1-emp20插入这条数据
create or replace procedure pro_12(v1 varchar2,v2 number)
is
v_sql varchar2(2000);
v_sql2 varchar2(2000);
v_ename varchar2(20);
v_sal number;
begin
for i in 1..20 loop
v_sql:='insert into emp'||i||'(ename,sal) values (:1,:2)';
execute immediate v_sql using v1,v2;
v_sql2:='select ename,sal from emp'||i||' where ename=:1';
execute immediate v_sql2 into v_ename,v_sal using v1;
dbms_output.put_line(v_ename||' '||v_sal);
end loop;
end;
call pro_12('小红','20000');
--随机函数
┌dbms_random.values(数1,数2) --生成数1-数2之间的随机数 ,包含小数
└dbms_random.string('格式',数) --生成随机字符串
格式┌u 大写字母
├l 小写字母
├a 字母
├x 大写字母和数字
└p 可打印的字符
select dbms_random.value(100,0) a,
dbms_random.string('u',5) b,
dbms_random.string('l',5) c,
dbms_random.string('a',5) d,
dbms_random.string('x',5) e,
dbms_random.string('p',5) f
from dual
--编写一个函数,生成一个1-100的随机数
--如果这个数大于95,返回1等奖
--如果这个数大于85,返回2等奖
--如果这个数大于70,返回3等奖
--否则返回谢谢惠顾
create or replace function fun_ran return varchar2 is
v1 number;
begin
v1:=dbms_random.value(1,100);
if v1 >95 then
return '1等奖';
elsif v1>85 then
return '2等奖';
elsif v1>70 then
return '3等奖';
else
return '谢谢惠顾';
end if;
end;
select fun_ran
from dual
--闪回技术
┌闪回回收站中的表
├闪回到修改前的状态
└闪回查询
--闪回回收站中的表
1.查看回收站
select *
from user_recyclebin
2.闪回表
flashback table 表名 to before drop [rename to 新表名]
flashback table tt to before drop rename to yy;
--闪回到修改前的状态 (一定不能改表结构)
--删除dept表的数据
delete from dept;
--前提是开启了行移动功能
alter table 表名 enable/disable row movement;
alter table dept enable row movement;--开启
alter table dept disable row movement;--关闭
--闪回到一个时间点 (时间戳)
flashback table 表名 to timestamp 时间戳;
flashback table emp to timestamp timestamp'2021-7-23 11:00:00'
select *
from dept
--闪回查询
select 列
from 表 as of timestamp 时间戳
where 条件
select *
from emp as of timestamp timestamp '2021-7-23 11:25:00'