PLSQL 添加注释,表删除闪回,数据字典使用方法,立即执行(存过)

--数据字典(视图)
┌静态┌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'


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值