动态sql
如果动态语句是 SELECT 语句,可以把查询的结果保存到 INTO 后面的变量中。如果动态语句中存在参数,USING 为语句中的参数传值。
动态 SQL 中的参数格式是:[:参数名],参数在运行时需要使用 USING 传值。
EXECUTE IMMEDIATE 动态语句字符串
[INTO 变量列表]
[USING 参数列表]
dblink
oracle在进行跨库访问时,可以通过创建dblink实现。
oracle database link可分为下面三类:
(1)private:创建的是用户级别的dblink,只有创建该dblink的用户才可以使用这个dblink来访问远程的数据库,同时也只有该用户可以删除这个dblink。
(2)public:创建的是数据库级别的dblink,本地数据库中所有的用户数据库访问权限的用户或者pl/sql程序都能使用这个dblink。
(3)global:创建的是网络级别的dblink,这是对于oracle network而言的。
select * from user_sys_privs where privilege like upper(‘%DATABASE LINK%‘) AND USERNAME=‘WANGYONG‘;
如果查询有返回行,则表示具备创建database link权限,否则,则需要使用sys登陆orcl为用户赋予创建权限:grant create public database link to 用户名
授权某张表的权限给用户:
grant xxx权限 on 表名 to 用户
第二步:创建dblink
有两种:1)通过pl/sql developer图形化创建、2)通过sqlplus中的sql语句创建
或者
create public database link TESTLINK2 connect to
user_name identified by "密码" USING ‘连接的数据库‘
使用dblink:
-- 最简单的用法
SELECT * FROM table_name@database_link;
-- 不想让别人知道database link名字的时候,可以使用同义词包装一下
CREATE SYNONYM table_name for table_name@database_link;
SELECT * FROM table_name;
-- 也可以建立一个视图来封装
CREATE VIEW table_name_v AS SELECT * FROM table_name@database_link;
删除dblink:
-- 删除public类型的dblink
DROP PUBLIC DATABASE LINK dblink_name;
-- 删除private类型的dblink,只有创建者自己能删
DROP DATABASE LINK dblink_name;
同义词
同义词是数据库当前用户通过给另外一个用户的对象创建一个别名,然后可以通过对别名进行查询和操作,等价于直接操作该数据库对象。也可以为使用频率高的一长串的字符设同义词,查询起来会比较省事
语法:
CREATE [OR REPLACE] synonym 同义词 for (表名......)
查看当前的用户是否有创建同义词的权限:
select * from session_privs
没有的话,先赋权限
--其中USER_B是需要创建同义词的用户
GRANT CREATE SYNONYM TO USER_B;
--这个时候还需要一个权限就是USER_B用户select USER_A用户table的权限,
--这个时候是在USER_A用户下赋值的
grant select on tableA to user_temp;
删除同义词:
DROP [PUBLIC] SYNONYM [用户.]sysnonym_name;
视图
视图就是一个预处理的查询语句,可以从若干表中过滤数据。
view 和with as都是先查询数据,再被其他操作调用。
View和with as 的区别就是View创建之后就是一张虚表,with as 相当于临时数据表,View创建之后不删除一直都还在,with as 执行之后就不存在了
CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
AS
SELECT查询
[WITH READ ONLY CONSTRAINT]
FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表
创建成功后,视图才能正常使用。
NOFORCE:如果基表不存在,无法创建视图,该项是默认选项
drop view 视图名 #删除视图
索引
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。可以提高查询速度
单一索引:create index 索引名 on 表名(列名);
组合索引:create index 索引名 on 表名(列名1,列名2);
删除索引:drop index 索引名;
查看该表的所有索引:
select * from all_indexes where table_name = ‘表名‘;
表空间
表和索引一旦创建,表空间无法修改。
创建表空间:
CREATE TABLESPACE 表空间名
DATAFILE ‘数据文件路径‘ SIZE 大小
[AUTOEXTEND ON] [NEXT 大小]
[MAXSIZE 大小];
说明:
[ ]里面内容可选项,数据文件路径中若包含目录需先创建
SIZE 为初始表空间大小,单位为K或者M
AUTOEXTEND 是否自动扩展,值为ON或OFF
NEXT 为文件满了后扩展大小
MAXSIZE 为文件最大大小,值为数值或UNLIMITED(表示不限大小)
查询表空间:
--管理员角色查看表空间
SELECT file_name, tablespace_name, bytes, autoextensible
FROM dba_data_files
WHERE tablespace_name = ‘表空间名‘;
重命名表空间:
alter tablespace 原表空间名 rename to 新表空间名
扩充表空间:
ALTER TABLESPACE 表空间名
ADD DATAFILE ‘文件路径‘ SIZE 大小
[AUTOEXTEND ON] [NEXT大小]
[MAXSIZE 大小];
统计所有表空间的空闲大小:
select a.tablespace_name,nvl(sum(b.bytes),0) bytes
from dba_data_files a,dba_free_space b where a.tablespace_name=b.tablespace_name(+) and a.file_id=b.file_id(+)
group by a.tablespace_name
统计表空间的使用情况:
select c.tablespace_name "表空间",round(a.bytes/1024/1024,2)"表空间大小",
round((a.bytes-b.bytes)/1048576,2)"已使用空间",
round(b.bytes/1048576,2)"剩余空间",
round(b.bytes/a.bytes * 100,2)||‘%‘"剩余百分比"
from (select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select a.tablespace_name ,nvl(sum(b.bytes),0) bytes from dba_data_files a,dba_free_space b where a.tablespace_name=b.tablespace_name(+)
and a.file_id=b.file_id(+) group by a.tablespace_name) b,
DBA_tablespaces c where a.tablespace_name=b.tablespace_name(+) and a.tablespace_name=c.tablespace_name order by round(b.bytes/1024/1024,2)
删除表空间:
--仅删除表空间
DROP TABLESPACE 表空间名;
--删除表空间及数据文件
DROP TABLESPACE 表空间名 INCLUDING CONTENTS AND DATAFILES;