一、数据字典(视图)
静态:USER_*? ??存储了当前用户所拥有的对象的信息。 ? ? ? ?????ALL_*? ? ? ? 存储了当前用户可以访问的所有的对象信息,不一定是自己的 。 ? ? ? ? ? ?DBA_*? ? ? ?存储了数据库所有的对象信息,具有管理员(DBA)权限才可以访问 。
动态:V$? ? ?当前.....? ?需要DBA权限
USER_TABLES 所有的表
_VIEWS 所有的视图
_SEQUENCES 所有的序列
_INDEX 所有的索引
_CONSTRAINTS 所有的约束
_RECYCLEBIN 回收站
SELECT * FROM USER_TABLES;
V$SESSION 当前有谁连接数据库
会话:一个用户从登录到退出
terminal 主机名
SELECT DISTINCT TERMINAL FROM v$SESSION;
二、动态SQL语句--一般用于DDL语句的批量执行语句
1、语法:EXECUTE IMMEDIATE '执行的语句'[USING|INTO]?
????????using ?给动态语句传值? ????????into ? 从动态语句中取值
? ? ? ? 注:没加 AUTHID CURRENT_USER 表示定义者权限 以定义者身份执行? ????????????????加上 AUTHID CURRENT_USER 表示调用者权限 以调用者身份执行
--创建一个存过 批量建表
CREATE OR REPLACE PROCEDURE PRO_C(V_E VARCHAR2,V1 NUMBER,V2 NUMBER)
AUTHID CURRENT_USER IS
BEGIN
FOR I IN V1..V2
LOOP
EXECUTE IMMEDIATE 'CREATE TABLE '||V_E||'_'||I||' AS SELECT * FROM EMP';
--注意留空格
END LOOP;
END;
CALL PRO_C('EMP',50,100); --存过加了 AUTHID CURRENT_USER 才能在这里调用
--批量创建emp_1~100
--像emp_1~100中插入一条数据 打印第一条数据
--如果同时使用into和using 那么要先into 再using
CALL PRO_C('EMP',1,100); 调用上面的存过建表
CREATE OR REPLACE PROCEDURE PRO_10(V1 NUMBER,V2 NUMBER,V3 NUMBER)
AUTHID CURRENT_USER IS
V_E EMP%ROWTYPE;
BEGIN
FOR I IN 1..100
LOOP
EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP_'||I;
EXECUTE IMMEDIATE 'INSERT INTO EMP_'||I||'(EMPNO,SAL,DEPTNO)
VALUES(:1,:2,:3)' USING V1,V2,V3;
--给动态语句传值
EXECUTE IMMEDIATE 'SELECT * FROM EMP_'||I||' WHERE ROWNUM=1'
INTO V_E; --从动态语句取值
DBMS_OUTPUT.put_line('EMP_'||I||'中的第一条数据是'||V_E.EMPNO
||' '||V_E.SAL||' '||V_E.DEPTNO);
END LOOP;
END;
CALL PRO_10(1234,6000,50);
--如何使用数据字典删除emp_开头的表
SELECT 'DROP TABLE '||TABLE_NAME||' PURGE' FROM USER_TABLES
WHERE TABLE_NAME LIKE'EMP\_%' ESCAPE'\';
CREATE OR REPLACE PROCEDURE PRO_DD AUTHID CURRENT_USER IS
CUR_1 SYS_REFCURSOR;
V_E VARCHAR2(200);
BEGIN
OPEN CUR_1 FOR SELECT 'DROP TABLE '||TABLE_NAME||' PURGE' FROM USER_TABLES
WHERE TABLE_NAME LIKE'EMP\_%' ESCAPE'\';
LOOP
FETCH CUR_1 INTO V_E;
EXIT WHEN CUR_1%NOTFOUND;
EXECUTE IMMEDIATE V_E;
END LOOP;
CLOSE CUR_1;
END;
CALL PRO_DD();
三、添加注释
COMMENT ON TABLE 表名 IS 表注释
COMMENT ON COLUMN 表.列 IS 列注释
COMMENT ON TABLE EMP IS '这是一个员工信息表';
COMMENT ON COLUMN EMP.ENAME IS '这是员工的姓名';
四、闪回
1、闪回表? ?
FLASHBACK TABLE 表名 TO BEFORE DROP [RENAME TO 新表名]
2、闪回到DML之前的状态?
? ? ? 需要前提是表必须开启了行移动?
开启:ALTER TABLE 表名 ENABLE ROW MOVEMENT;
关闭:ALTER TABLE 表名 DISENABLEROW MOVEMENT;
?闪回详解:Oracle 闪回技术详解(flashback)_越努力越幸运再努力的博客-CSDN博客_oracle 闪回
|