往数据类型为clob的表列直接insert或update长度大于4000会报字符串太长错误
SQL> drop table t; Table dropped SQL> create table t(para2 clob); Table created直接更新:SQL> update t set para2 ='***...***';--8000个* update t set para2 ='***...***';--8000个* ORA-01704: string literal too long SQL>直接插入:SQL> insert into t(para2) values('***...***');--8000个* insert into t(para2) values('***...***');--8000个* ORA-01704: string literal too long可以通过PL/SQL用变量实现:SQL> declare 2 v_sql clob; 3 begin 4 v_sql := rpad('*', 4000, '*') || rpad('*'
rpad和lpad
rpad rpad函数从右边对字符串使用指定的字符进行填充 rpad(string,padded_length,[pad_string]) string 表示:被填充的字符串 padded_length 表示:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,rpad函数将会把字符串截取成从左到右的n个字符; pad_string 是个可选参数,这个字符串是要粘贴到string的右边,如果这个参数未写,lpad函数将会在string的右边粘贴空格。示例:SQL> select rpad('tech', 7), length(rpad('tech', 7)) from dual; RPAD('TECH',7) LENGTH(RPAD('TECH',7))-----------
内连接、外连接总结
create table t1(id number,name varchar2(20));create table t2(id number,name varchar2(20));create table t3(id number,name varchar2(20));insert into t1 values(1,'aa');insert into t1 values(2,'bb');insert into t1 values(3,'cc');insert into t2 values(1,'aa');insert into t2 values(4,'dd');insert into t2 values(5,'ee');insert into t3 values(6,'ff');--左连接SQL> select t1.id,t1.name,t2.id,t2.name 2 from t1 left join t2 on t1.id = t2.id; ID NAME ID NAME---------- ---
group_id和distinct
distinct剔除重复行,而不是按重复分组级别剔除;而group_id是按重复分组级别剔除。在扩展分组中,使用distinct有时结果可能不对,而group_id是oracle专门用来剔除重复分组结果的。SQL> with t as 2 (select 1 s, 'a' name 3 from dual 4 union all 5 select 1 s, null name 6 from dual 7 union all 8 select 2 s, null name 9 from dual 10 union all 11 select 1 s, 'a' name from dual) 12 select s, name, count(1), grouping(name), group_id() 13 from t 14 group by rollup(
sequence中的cache
sequence会产生一系列连续的不重复数字,但是这个序列很容易断号,尤其在有cache时,如果应用要求一定不能断号,那就不能使用sequence了。建一序列zhaoss_test_seq:SQL> create sequence zhaoss_test_seq 2 minvalue 1 3 maxvalue 100 4 start with 1 5 increment by 1 6 cache 20 7 order; Sequence created注意:刚刚创建的序列需要先用nextval来获取第一个初始值,否则会报如下错误:SQL> select zhaoss_test_seq.currval from dual; select zhaoss_test_seq.currval from dual ORA-08002: 序列 ZHAOSS_TEST_SEQ.CU
定义者权限存储过程role无效,必须要有显式授权
对于定义者权限存储过程来说,role权限不可见。比如,用户ljb是dba角色,完全具备更新其他用户任何表的权限。但事实上,ljb用户在sql中可以轻易完成的更新动作,在存储过程中会报以权限不足的错误而无法完成。只有在zhaoss用户显式的将t表授权给ljb用户后,ljb用户在创建存储过程的时候才能更新t表。SQL> create user ljb identified by ljb ;用户已创建。SQL> grant dba to ljb;授权成功。SQL> conn ljb/ljb已连接。SQL> delete zhaoss.t;已删除100000行。SQL> rollback;回退已完成。SQL> create or replace procedure
oracle分析函数(一)
Oracle内置分析函数: 序号 函数类型 函数名称 函数简介 1 常规统计函数 MAX 查找组中表达式的最大值 2 MIN 查找组中表达式的最小值 3 AVG 计算组中表达式的平均值 4 SUM 计算组中表达式的累积和 5 COUNT 对一组内发生事情进行累计计数 6
11g解决imp导入数据时报错:插入数据找不到相应分区
create table t(id number,name varchar2(10),stamptime date)partition by range(stamptime)( partition part_t_20110505 values less than (to_date('20110505','yyyymmdd')), partition part_t_20110506 values less than (to_date('20110506','yyyymmdd')));insert into t values(1,'aa',trunc(sysdate)-1);insert into t values(2,'bb',trunc(sysdate)-1);insert into t values(3,'cc',trunc(sysdate)-1);insert into t values(4,'dd',trunc(sysdate)-1);commit;用exp将数据导出后,改变表结构create table t(id number,name varchar
windows下 statspack安装开始创建包体的时候一直报:SP2-0640: 未连接
出现这种情况一般是因为数据库装了几个实例造成的。请检查E:oracleproduct10.2.0db_1RDBMSADMINspcreate.sql中connect perfstat/&&perfstat_password,改为connect perfstat/&&perfstat_password@orcl。即添加连接到哪个实例下。[@more@]
表空间传输步骤
表空间传输:1、把要传输表空间设置为只读状态;2、以传输表空间模式(transport_tablespace=y)将表空间的元数据导出到转储文件;3、判断源数据库所在平台与目标数据库所在平台的endian是否相同: select a.platform_name,b.endian_format from v$database a,v$transportable_platform b where a.platform_name=b.platform_name;4、转换数据文件格式,既可以在源数据库转换也可以在目标数据库转换: 在源数据库执行转换: RMAN> CONVERT TABLESPACE USERS TO PLATFORM 'Microsoft Windows IA (32-bit)' FORMAT 'E:ZHAOSS'; 在
日志 ** 序列号 ** 无法归档
SQL> startupORACLE 例程已经启动。Total System Global Area 612368384 bytesFixed Size 1250428 bytesVariable Size 230689668 bytesDatabase Buffers 373293056 bytesRedo Buffers 7135232 bytes数据库装载完毕。ORA-16038: 日志 3 序列号 42 无法归档ORA-19809: 超出了恢复文件数的限制ORA-00312: 联机日志 3 线程 1:'E:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG'这种情况可以用三种方法解决:1、暂停数据库归档模式。SQL> shutdown immediate数据库已经关闭。已经卸载
比较符号两边类型保持一致
今天测试的时候搞了半天才弄明白,记录一下。create or replace procedure proc_test(startdate VARCHAR2) as v_date date; --清理时间点 v_GTH_AGT_IN_count number; --需清理的个数 v_query_create varchar2(3000); --存放建立临时表的语句begin v_date := to_date(startdate, 'yyyy-mm-dd'); v_GTH_AGT_IN_count := 0; select count(*) into v_GTH_AGT_IN_count from GTH_AGT_IN t where logdate <= v_date; if v_GTH_AGT_IN_count > 0 then --insert v_query_create := 'inse
表上建立唯一性索引,SQL*Loader用或不用dirdect的区别
表test_table1中原有数据:SQL> select id,name from test_table1; ID NAME 1 AA 2 BB 3 CC 4 DD 5 EE创建表上字段id的唯一性索引:SQL> create unique index idx_test_table1_id on test_table1(id);1、不带direct导入和表中原来数据一样的数据:E:>sqlldr zhaoss/zhaoss@orcl control=result.ctlSQL*Loader: Release 10.2.0.1.0 - Production on 星期四 2月 10 18:30:22 2011Copyright (c) 1982, 2005, Oracle. All rights reserved.达到提交点 - 逻辑记录计数 5查看索引状态,仍然有效:SQL>
UNDO SEGMENT的扩展和收缩
当发生一个DML操作时,服务器进程会选择一个undo segment。AUM采用的是事务绑定undo segment的算法:1、首先尝试将每个undo段绑定一个事务,也就是每个undo segment上只被一个事务使用。2、如果不能发现完全空闲的(也就是没有与任何事务绑定)undo segment,则系统会尝试将其他脱机的undo segment脱机。3、如果没有可用的undo segment进行联机,则会尝试创建一个新的undo segment。4、如果上面步骤都不可行,也就是创建新的undo segment也没有可用空间了,则事务绑定算法才会尝试去找最早被使用的那个undo segment。这种情况下,才可能出
UNDO三大最用
UNDO三大最用:一致性读(consistent read)、回滚事务(rollback transaction)、实例恢复(instance recovery)一致性读是相对于脏读而言的,假如:某个表T有10000条记录,获取所有记录需要15分钟。当前时间为9点整,某用户A发出select * from T,该语句在9点15分时执行完毕。当用户A执行到9点10分时,另一个用户B发出一条delete命令,将表T最后一条记录删除并提交。那么到9点15分时,会返回给A用户多少条数据? 如果返回9999条记录,则说明发生了脏读,如果返回10000条记录,则说明发生了一致性读。很明显,在9点钟那个时间点发出
UPDATE操作和UNDO
UPDATE T SET COL='A' WHERE COL='B'; 1、在SHARED POOL里解析,从而生成执行计划。 2、假如根据执行计划,得出COL='B'的记录放在10号数据文件的54号数据块里。 3、服务器进程在BUFFER CACHE里找到一个可用UNDO数据块,如果没有发 现,则到UNDO表空间找一个可用的UNDO数据块,并调入BUFFER CACHE。假如获得的UNDO数据块在10号表空间块号为24号。 4、将改变前的值B放入24号数据块里。 5、由于UNDO块发生了变化,需要产生重做记录,假设重做记录号位120: 行号 事务ID FILE# BLOCK# VALUE 120
查看oracle表空间使用情况
查看表空间使用情况:方法一:SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100, 2), '990.99') "使用比", F.TOTAL_BYTES "空闲空间(M)", F.MAX_BYTES "最大块(M)" FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (102
dba和sysdba的区别(转自“三十而立专栏”博客)
dba是实实在在存在在Oracle里的一个角色(屋里对象),而sysdba则指的是一种逻辑概念上的操作对象,在Oracle数据里并不存在。所以说这两个概念是完全不同的。dba是一种role对应的是对Oracle实例里对象的操作权限的集合,而sysdba是概念上的role是一种登录认证时的身份标识而已。下面我们通过详细的实例来看看他们的区别1. 物理上的role dba 是可以在数据字典里查到的SQL> select * from dba_roles where upper(role) ='DBA';ROLE PASSWORD------------------------------ --------DBA NO而sysdba是逻辑概念上的role,在数据字典里是查不
normal 、sysdba、 sysoper的区别
1、normal:normal是普通数据库用户权限。2、SYSOPER:sysoper即数据库操作员权限,权限包括: 打开数据库服务器 关闭数据库服务器 备份数据库 恢复数据库 日志归档 会话限制3、SYSDBA:sysdba即数据库管理员权限,权限包括: 打开数据库服务器 关闭数据库服务器 备份数据库 恢复数据库 日志归档 会话限制 管理功能 创建数据库显然sysdba比sysoper的权限多了创建数据库和管理数据库功能,sysdba具有最高的数据库权限。以sysdba和sysoper登陆数据库show user查得的用户分别为sys和
修改数据库的归档模式
修改数据库的归档模式:1、以dba身份登录数据库。SQL> conn / as sysdba已连接。2、用 shutdown immediate 或 shutdown normal 关闭数据库。SQL> shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE 例程已经关闭。3、将数据库启动到 mount 状态。SQL> startup mountORACLE 例程已经启动。Total System Global Area 612368384 bytesFixed Size 1250428 bytesVariable Size 171969412 bytesDatabase Buffers 432013312 bytesRedo Buffers 7135232 bytes数据库装载