Oracle 开发
文章平均质量分 73
Shark曾_小凡仙
一线普通DBA,架构DBA,祖仙教.独家创始人.熟悉MYSQL REDIS数据库 C/C++语言
展开
-
distinct性能问题一
select distinct username from largetable;如果username 可选择性比较低 只有建立位图索引来提高原创 2007-09-30 16:48:00 · 2768 阅读 · 0 评论 -
ORACLE update for
1 select * from TTable1 for update 锁定表的所有行,只能读不能写 2 select * from TTable1 where pkid = 1 for update 只锁定pkid=1的行 3 select * from Table1 a join Table2 b on a.pkid=b.pkid for update 锁定两个表的所有记录 4 select原创 2009-03-06 16:34:00 · 1413 阅读 · 1 评论 -
关于insert的语句从查询获得数据,并且从序列获得ID,该如何写?
关于insert的语句从查询获得数据,并且从序列获得ID,该如何写?INSERT INTO ZENGFK.MSG_CONTENT (MSGCONTET_ID, USER_ID, CREATE_DATE, MSG_CONTENT) SELECT ZENGFK.CONTENTID_B.NEXTVAL, A.* FROM (SELECT DISTINCT T.原创 2008-12-25 23:01:00 · 1663 阅读 · 0 评论 -
ORACLE高效分页存储过程代码
ORACLE高效分页存储过程代码 create or replace procedure P_Pagination ( Pindex in number, --页号 从1开始 Psql in varchar2, --查询语句 Psize in number, --每页分多少行 Pcount out number, --共有多少页 v_转载 2009-04-03 21:44:00 · 1604 阅读 · 0 评论 -
oracle 删除重复的记录
对此,总结了一下删除重复记录的方法,以及每种方法的优缺点。为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,col2上加了索引。1、通过创建临时表可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:creat table tbl_tmp (select distinct* f转载 2009-04-03 20:51:00 · 1225 阅读 · 0 评论 -
Oracle 随机取数据
select * from(select * from hr.employees order by dbms_random.value)where rownum = 1; 注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sqldbms_random.value(100,200)可以产生100到200范围的随机数另转载 2009-04-03 21:06:00 · 1371 阅读 · 0 评论 -
oracle join on 数据过滤问题
因为在FOR .. IN () LOOP 游标中使用 所以不能采用下面的查询语句做游标select a.f_usernamefrom ( SELECT /*+parallel(gu,4)*/distinct gu.f_username FROM t_base_succprouser gu wh原创 2009-07-13 17:13:00 · 1825 阅读 · 0 评论 -
得到某个时间的前周最后一天
0. 上周最后天SQL>select trunc(to_date(2009-05-14 15:19:12,YYYY-MM-DD HH24:MI:SS),D)-1 from dual; 1.上月末天:select to_char(add_months(last_day(sysdate),-1),yyyy-MM-dd) LastDay from dual;2.上月今原创 2009-05-14 15:24:00 · 1662 阅读 · 0 评论 -
oracle case
select wnameb,sum(F_CopeUserA),sum(F_CopeUserB),sum(F_CopeUserC),sum(F_CopeUserD) from ( select (case when wtype in(44,123,43,49) then 任选九场 when wtype in(14,11,13) then 胜负十四场 whe原创 2009-05-18 10:46:00 · 1079 阅读 · 0 评论 -
这样的语句如何优化Temp空间 现在它要用30G哦
select /*+PARALLET(T_BASE_USER_BUY_INFO,4)*/ a.f_yearweek,a.f_lotbigclass,b.ExpeNum,a.salay,b.countrysalay,a.bonus,b.countrybonus from ( select TO_CHAR(b.f_DATE,YYYYMMWW) as f_yearwe原创 2009-06-02 17:39:00 · 1204 阅读 · 0 评论 -
获得日期的年周次并且反算回日期
获得日期的周次SELECT TO_CHAR(TO_DATE(2007-05-21,YYYY-MM-DD),YYYYWW) FROM DUAL;SELECT TO_CHAR(TO_DATE(2007-05-27,YYYY-MM-DD),YYYYWW) FROM DUAL;结果:200721反转计算:select to_date(substr(2007原创 2009-06-04 17:34:00 · 1958 阅读 · 0 评论 -
sql%rowcount 为零??
begin starttime:=sysdate; v_maxtime := to_date(9999-12-31 00:00:00,yyyy-mm-dd hh24:mi:ss); select max(f_logintime) into v_maxtime from t_gather_userloginlog; if v_maxtime != to_date(9999-1原创 2009-06-05 10:24:00 · 3014 阅读 · 0 评论 -
使用 ROW_NUMBER() OVER ()分析函数 高性能地获得第一条数据
我有个任务 获得用户的首次发生短信的记录。用户数量有200万,短信发生记录有8千万条。开始采用的方法是 取用户发送最小时间的记录 select username min(sendtime) mintimefrom sms_sendgroup by usrename 获得最小时间后 再去获得该记录的所有信息出来。采用inner join sms_send on sendti原创 2009-08-14 20:03:00 · 3361 阅读 · 0 评论 -
ORA-12838: cannot read/modify an object after modifying it in parallel
如果用了insert /*+ append */ into table as select .. from table 这样的操作来insert,必须在操作后commit,或是rollback,不然就不能再insert /*+ append */ into table as select .. from table 。ORACLE报出错误如下:ORA-12838: cannot read/原创 2009-06-15 16:12:00 · 3348 阅读 · 1 评论 -
ORACLE like 下划线 没作用
select ×from userwhere user_name like esun_% 会出现 esun111 1231 等 下划线没有把这些排除掉原来它也是通配符,所以要用 ORACLE中ESCAPE转意函数where user_name like esun/_% escape/ 那就OK了先用/号告诉后面的是要处理的符合原创 2009-08-24 17:35:00 · 3530 阅读 · 0 评论 -
Like 单字符
在Where子句中,还可以对datetime、char、varchar字段类型的列用Like子句配合通配符选取那些“很像...”的数据记录,以下是可使用的通配符:% 零或者多个字符_ 单一任何字符(下划线)/ 特殊字符[] 在某一范围内的字符,如[0-9]或者[aeth][^] 不在某范围内的字符,如[^0-9]或者[^aeth] 举例说明:AB% “AB”后接任何字符的字串,如AB、AB89原创 2009-08-27 11:40:00 · 1466 阅读 · 0 评论 -
username,Min(time),MIn(age),min(money) 带不出最早时间那条记录
select username ,min(time),MIn(age),min(money)from usergroup by username Oracle 根据 用户名排序 取最小时间,再取出最小年龄,再取出最少钱的 小李 8:00 12岁 100元小李 9:00 11岁 90元小 李 10:00 10岁 110元 结果是: 小李 8:原创 2009-06-25 11:43:00 · 1851 阅读 · 1 评论 -
Oracle 并行查询 parallel Query
81 53,5297 P_Base_Day_I_NewTaredUser 2009-06-25 17:28:56 2009-06-25 18:24:21 55 insert 成功 base82 53,5300 P_BASE_DAY_I_NEWTAREDUSER_test 2009-06-25 17:29:31 2009-06-25 17:54:21 24 insert 成功 base原创 2009-06-26 09:30:00 · 13310 阅读 · 0 评论 -
ORACLE TRUNC()函数
oracle trunc()函数的用法 1.TRUNC(for dates)TRUNC函数为指定元素而截去的日期值。其具体的语法格式如下:TRUNC(date[,fmt])其中:date 一个日期值fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去2.TRUNC(for number)TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数原创 2009-07-02 11:41:00 · 2463 阅读 · 1 评论 -
ORA-20000:
SQL>set serveroutput on size 1000000 设置成更大就OK了。 exec dbms_output.enable(999999999999999999999); spool c:/test.sql; select * from tarticle; spool off;原创 2009-09-04 12:14:00 · 2353 阅读 · 0 评论 -
oracle sql函数
ORACLE常用SQL函数2007-06-14 15:561.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual;2.CHR 给出整数,返回对应的字符;SQL> select chr(54740) zhao,chr(65) chr65转载 2009-09-04 12:27:00 · 2767 阅读 · 1 评论 -
ORA-14406: 更新的分区关键字在最高合法分区关键字之外--压缩的标志
这个问题官方解释是 更新的时间段超过了最后个分区。处理方法是增加新分区。 可我这个不是 Update T_base_ProUser_fail xSet x.f_Expectenddate = (Select e.f_Endtime From t_Gather_Expect e Where x.f_Lotid=e.f_Lotteryid And x.f_Expect=e.f_E原创 2009-09-07 16:00:00 · 6178 阅读 · 0 评论 -
ORACLE批量更新四种方法比较
ORACLE批量更新四种方法比较软件环境 Windows 2000 + ORACLE9i 硬件环境 CPU 1.8G + RAM 512M 现在我们有2张表 如下:T1--大表 10000笔 T1_FK_IDT2--小表 5000笔 T2_PK_IDT1通过表中字段ID与T2的主键ID关联 模拟数据如下:--T2有5000笔数据create tabl转载 2009-09-08 18:33:00 · 2163 阅读 · 0 评论 -
ORACLE 两表更新 update
oralce 的两个表关联更新 写法和另类 与MS SQL很不一样有时候更新大表速度特慢 5-10个小时都没结束 UPDATE T_BASE_SUCC_PROUSER X SET X.F_EXPECTENDDATE = ( SELECTE.F_ENDTIME FROM T_GATHER_EXPECT E WHERE X.F_LOTID=E.F_LOTTERYID ANDX.F_原创 2009-09-08 18:35:00 · 3162 阅读 · 0 评论 -
oracle有continue的用法
oracle没有continue的用法,那么如何退出本次循环,而不退出整个循环呢? goto是一种方法吗, create or replace procedure dd is i pls_integer; begin i:=0; loop >原创 2009-07-10 14:07:00 · 3218 阅读 · 0 评论 -
rownum=1000 与 rown<=1000 速度不一样哦!
按常理来讲 rownum=1000 取第1000行的数据 一条 rown第一个数据量远小于第二条 ,然而比它还慢! select F_ADDTIME,F_PAYCODE,t.f_note, (CASE WHEN l.F_INOUT=0 THEN F_PAYMONEY END) AS MEONYOUT, (CASE WHEN l.F_INOUT=1 THEN F_PAYMON原创 2009-07-15 16:58:00 · 2017 阅读 · 1 评论 -
oracle update 和 临时表的 弱处!
曾经面试的时候有公司问ORACLE 开发不足之处有哪些? 当时不懂。最近才感受到,我想那就是UPDATE和临时表的使用上。 原本我要对一个表生成统计数据 该表的结构如下 周次,星期,商店,参观人数,购买人数,参观人次,购买人次。200928,星期一,女装店,30,5,45,6. 虽然看起来很简单,实际上每个人数和人次都是个子查询而得来的数字。还有个问题就是有些店铺原创 2009-09-21 11:31:00 · 3272 阅读 · 1 评论 -
生成自然时间的connect by
有个表的统计不好做,请问大家遇到这样的做法有个这样的表 有个时间字段 另外有关这个时间期内的 其他方面的信息 该表的结构如下周次, 星期, 商店, 参观人数,购买人数,参观人次,购买人次。200928,星期一,女装店, 30, 5, 45, 6.比如说 我目前有6家店。 周次和星期是自然时间。 其他几个数字字段分原创 2009-09-22 17:12:00 · 1265 阅读 · 0 评论 -
Select Left join 很慢!
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class原创 2009-09-25 11:24:00 · 6490 阅读 · 0 评论 -
oracle inner join 隐藏的多次连接
Select bu.f_Comechannel,Count(Distinct x.f_username) x ,Sum(bs.f_Paymoney) pmoneyFrom T_BASE_USER_FIRST_TRADE_LOTTY xInner Join t_Base_Userinfo bu On bu.f_Username = x.f_usernameInner Join t_B原创 2009-09-27 16:16:00 · 2637 阅读 · 0 评论 -
oracle同个事务中更新两次,后一次依赖前一次会有什么后果呢
本来是想第二条更新根据前面更新的数据为依据,可这样前面的更新没提交,后面的会怎么样呢? 所以做个实验SQL> create table t_tmp_name (name varchar2(5),age number);Table createdSQL> insert into t_tmp_name values(x,25);1 row insertedSQL> com原创 2009-11-05 11:57:00 · 2430 阅读 · 0 评论 -
Oracle的 简单行转列
应个报表要求做个时间 双色球, 胜负彩。。。。。200905 销量 销量200906 销量 销量200907 销量 销量200908 销量 销量 一个SQL 语句得到结果是:f_yearmonth, lot_name,money200905 双色球原创 2009-10-27 16:57:00 · 1133 阅读 · 0 评论 -
如何两表关联来删除其中一个表的记录?
如何两表关联来删除其中一个表的记录?delete a inner join b on b.id=a.id and b.xx=1 DELETE FROM a where exists (select 1 from b where b.id=a.id and b.xx=1 )原创 2010-01-19 17:20:00 · 2282 阅读 · 2 评论 -
索引的特性与优化
索引的概念在使用oracle的过程中,我们就不能不考虑性能和SQL优化, 而正确的使用索引在优化过程中是很关键的.索引是建立在表的一列或多列上的辅助对象, 它有助于快速访问该表中的数据. 索引由于其内在的结构, 具有某些内在的开销,转载 2010-01-22 15:15:00 · 1608 阅读 · 1 评论 -
ORACLE 增量插入法
select a.* from ( ) a LEFT JOIN ( SELECT f_id FROM T_BASE ) B ON A.PROUSERID=B.F_ID WHERE B.F_ID IS NULL; A表的数据与B表的数据相比 如果A表的数据不存在于B表 用原创 2009-12-04 12:19:00 · 2335 阅读 · 0 评论 -
Oracle中如何用一条SQL快速生成10万条测试数据
做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法。产生测试数据的SQL如下:SQL> select rownum as id, 2 to_char(sysdate + rownum / 24 / 3600, yyyy-转载 2009-12-10 10:40:00 · 1173 阅读 · 1 评论 -
oracle 统计每月累积购买人数
oracle 可有什么方法 统计每月累积购买人数 比如说有个门店 2008年购买商品的人数 表:t_buy_log 字段 f_username 用户名称;购买时间f_buytime 1 如果是统计每月购买人数 select to_char(f_buytime,yyymm),count(distinct f_username) fr原创 2009-12-24 10:07:00 · 1742 阅读 · 0 评论 -
表连接方式及使用场合
表连接方式及使用场合NESTED LOOP对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nested loop。如果驱动转载 2009-12-29 10:10:00 · 1182 阅读 · 0 评论 -
oracle 自然周跨年度 一周分成两部分
CREATE OR REPLACE FUNCTION UDF_WEEKOFYEAR ( V_DATE IN date ,formate IN VARCHAR2 ) RETURN charASv_ret char(6);v_ret1 char(2);v_ret3 NUMBER;BEGIN v_ret3 := TO_CHAR (v_date, i原创 2010-01-04 17:46:00 · 2659 阅读 · 0 评论 -
第一章 PL/SQL一览
第一章 PL/SQL一览一、理解PL/SQL的主要特性了解PL/SQL最好的方法就是从简单的实例入手。下面的程序是用于处理一个网球拍订单的。首先声明一个NUMBER类型的变量来存放现有的球拍数量。然后从数据表inventory中把球拍的数量检索出来。如果数量大于零,程序就会更新inventory表,并向purchase_record表插入一条购买记录,如果数量不大于零,程序转载 2010-03-30 12:15:00 · 1866 阅读 · 1 评论