CREATE OR REPLACE PROCEDURE PRO_ADD_DATAFILEISV_TABLESPACE_NAME VARCHAR2(20);V_TABLESPACE_USE NUMBER;V_DATA_FILE_NUM NUMBER;V_ADD_DATA_FILE_SQL VARCHAR2(400);BEGIN V_TABLESPACE_NAME :='TS_320'; --获取表空间使用率 SELECT round((TOTAL_M-FREE_M)/TOTAL_M,3) INTO V_TABLESPACE_USE FROM(SELECT A.TABLESPACE_NAME,B.TOTAL/1024/1024 TOTAL_M,(B.TOTAL-A.USE)/1024/1024 FREE_M FROM(select c.tablespace_name,(c.p_use-d.p_free) as use from(select tablespace_name,sum(bytes) as p_use from dba_data_fileswhere tablespace_name NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')group by tablespace_name) C,(select tablespace_name,sum(bytes) as p_free from dba_free_spacewhere tablespace_name NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')group by tablespace_name) Dwhere C.tablespace_name=D.tablespace_name) A ,(WITH TABLESPACE_TOTAL AS(SELECT tablespace_name,sum(MAXBYTES) TOTAL FROM DBA_DATA_FILES TWHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')AND T.AUTOEXTENSIBLE='YES' group by tablespace_nameUNION ALLSELECT tablespace_name,sum(bytes) TOTAL FROM DBA_DATA_FILES TWHERE T.TABLESPACE_NAME NOT IN ('USERS','SYSAUX','UNDOTBS1','SYSTEM','UNDOTBS2')AND T.AUTOEXTENSIBLE='NO' group by tablespace_name)SELECT TABLESPACE_NAME,SUM(TOTAL) TOTAL FROM TABLESPACE_TOTAL GROUP BY TABLESPACE_NAME) BWHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME) S WHERE S.TABLESPACE_NAME=V_TABLESPACE_NAME;--获取最大数据文件号SELECT MAX(TO_NUMBER(SUBSTR(FILE_NAME,28,2))) INTO V_DATA_FILE_NUM FROM DBA_DATA_FILESWHERE TABLESPACE_NAME=V_TABLESPACE_NAME and file_name like '%zxx%'; if V_TABLESPACE_USE > 0.75 then V_DATA_FILE_NUM :=V_DATA_FILE_NUM+1; if V_DATA_FILE_NUM >= 10 then V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_0'||V_DATA_FILE_NUM||'.dbf '||''''||'size 30G'; else V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_00'||V_DATA_FILE_NUM||'.dbf '||''''||'size 30G '; end if; execute immediate V_ADD_DATA_FILE_SQL; end if;END;如果需要使用该脚本在你库中需要修改的地方(用粗体标记):1.V_TABLESPACE_NAME的初始化值2.获取最大数据文件号3.更改使用率的阈值4.修改拼接字符串如果需要对多个表空间大小自动扩展需要编写cursor循环判断!
单引号转义拼接字符串中出现单引号需要转义select'''' from dual;结果为:'select ''''||'name'||'''' from dual;结果为:'name'
拼接字符串引起的ORA-00911: invalid character正确拼接 V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_0'||V_DATA_FILE_NUM||'.dbf '||''''||'size 30G';错误拼接:最后多了一个分号 “;” V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_0'||V_DATA_FILE_NUM||'.dbf '||''''||'size 30G;';
执行存储过程引起的ORA-01031: insufficient privileges尽管该用户已经有dba权限,但是还需要针对赋予对应权限grant select on dba_data_files to zxx;grant select on dba_free_space to zxx;grant alter tablespace to zxx;zxx是只用用户
添加表空间引起的ORA-15124:ASM file name包含无效字符正确脚本:V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_00'||V_DATA_FILE_NUM||'.dbf'||''''||'size 30G ';错误脚本:dbf和单引号之间存在空格V_ADD_DATA_FILE_SQL := 'alter tablespace '||V_TABLESPACE_NAME||' add datafile '||''''||'+DATADG/orcl/datafile/zxx_00'||V_DATA_FILE_NUM||'.dbf '||''''||'size 30G ';