颠覆软件

关注 : 架构与设计,敏捷,快速开发,项目管理,执行力,SSH,RoR

Archive for August, 2007

[zt]decode使用技巧

August 23, 2007

 key words: decode,分组

使用 decode可以实现将多个不同的行级别的记录转换到列,有时很有用

come from here

表、视图结构转化
现有一个商品销售表sale,表结构为:
month    char(6)      –月份
sell    number(10,2)   –月销售金额

现有数据为:
200001  1000
200002  1100
200003  1200
200004  1300
200005  1400
200006  1500
200007  1600
200101  1100
200202  1200
200301  1300

想要转化为以下结构的数据:
year   char(4)      –年份
month1  number(10,2)   –1月销售金额
month2  number(10,2)   –2月销售金额
month3  number(10,2)   –3月销售金额
month4  number(10,2)   –4月销售金额
month5  number(10,2)   –5月销售金额
month6  number(10,2)   –6月销售金额
month7  number(10,2)   –7月销售金额
month8  number(10,2)   –8月销售金额
month9  number(10,2)   –9月销售金额
month10  number(10,2)   –10月销售金额
month11  number(10,2)   –11月销售金额
month12  number(10,2)   –12月销售金额

结构转化的sql语句为:
create or replace view
v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
as
select
substrb(month,1,4),
sum(decode(substrb(month,5,2),01,sell,0)),
sum(decode(substrb(month,5,2),02,sell,0)),
sum(decode(substrb(month,5,2),03,sell,0)),
sum(decode(substrb(month,5,2),04,sell,0)),
sum(decode(substrb(month,5,2),05,sell,0)),
sum(decode(substrb(month,5,2),06,sell,0)),
sum(decode(substrb(month,5,2),07,sell,0)),
sum(decode(substrb(month,5,2),08,sell,0)),
sum(decode(substrb(month,5,2),09,sell,0)),
sum(decode(substrb(month,5,2),10,sell,0)),
sum(decode(substrb(month,5,2),11,sell,0)),
sum(decode(substrb(month,5,2),12,sell,0))
from sale
group by substrb(month,1,4);

VN:F [1.6.3_896]
Rating: 6.0/10 (1 vote cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

关于吃饭这个项目

August 19, 2007

key words:项目管理

项目,是一个范围很广的概念,三峡大坝是一个项目,IT企业的一次开发任务也是一个项目,个人某个时间段的活动安排仍然可以看作是一个项目.

这次出差到广东来开发项目,公司租了3居室的房子,但是平时吃饭是一个问题,便宜的不卫生,卫生的不便宜,埃,东莞这边的条件真是不咋的,过了N久大家终于觉得应该自己开伙,讨论的结果是大家一致认同。

立马去买了锅碗瓢盆,油盐酱醋米,原以为一帮大老爷们对做饭应该是外行,其实不然,5个人中有4个人都会做饭(这年头都是女人逼得 :) ),而且配合很好,有人做菜,有人焖饭,吃完还有人主动洗碗,天天如此。而且,每顿平均4个菜 :)
如果把吃饭这个事情算是一个项目的话,那么这个项目真的算是很成功

项目需求:解决吃饭的问题,要求是既实惠又好吃

项目实施: 由于是大家共同的需求,每个人都很主动积极,每一个环节都落实的很好

项目效果:大家的需求都得到满足,而且还感慨,早就该自己开伙了

一次大家吃完了闲聊,一人说道,NND,项目做的不咋的,饭吃的还不错。一语把大家都笑翻在地

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

利用其他表的数据update当前表

August 19, 2007

key words: update,ORA-01779

经常用到update语句,不过很少用到其他表的数据来更新当前表,这次用到了,总结一下

UPDATE
( SELECT /*+ BYPASS_UJVC */
a.groupname a1,b.groupname b1 from t_account_temp a,t_certificode_temp b
where a.certificode = b.certificode
)
SET a1=b1;

特别的地方是要加  /*+ BYPASS_UJVC */,让oracle不检查健的约束,否则会报ORA-01779错误,不过前提是你确认确实不会有多个b表的值出现,或者即使有多个值也没有影响。

相关参考如下

一种高效率的update多表关联更新测试

ORA-01779的处理方法

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

从数据库导出大数据量的文件的解决方案

August 18, 2007

key words: plsql,导出数据,大数据量

最近的账务的项目中需要导出Excel报表,数据量比较大,解决方案如下 :

1.通过plsql在服务器端查询出符合要求的纪录,然后直接写到文本文件中

2.在web端通过流的方式读文本文件,通过POI写到Excel,将生成的Excel流写到respoonse实现下载

这样做的好处是不必一次性将满足条件的纪录全部取出来,而是通过流的方式.

这个方式原来在处理Blob类型的字段时有直接的getStream来支持的,这次普通的数据只好通过文件的方式来实现.

贴一段sample的代码


create or replace procedure alex_table_to_txt(filepath varchar2,filename varchar2) is
--var
v1 alex2.name%type;
v2 alex2.address%type;
v3 alex2.groupname%type;

output varchar2(200);

–file var
file_handle UTL_FILE.FILE_TYPE;

cursor readtable is select t.name,t.address,t.groupname from alex2 t;
begin
file_handle:=utl_file.fopen(filepath,filename,’w',6000);
open readtable;

loop
fetch readtable into v1,v2,v3;
exit when readtable%notfound;
output:=v1 || ‘,’ || v2 || ‘,’ || v3 ;
utl_file.put_line(file_handle,output);

end loop;

close readtable;
utl_file.fclose(file_handle);
end alex_table_to_txt;
/

欢迎讨论你的方案

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

遇到棘手的问题怎么办?

August 18, 2007

key words:棘手,分解,效率,GTD

一般来说,我们碰到问题都是无非google,看相关文档,请教专家,问圈子里的朋友,等等。我这里说的主要是个人自己的解决思路。

在项目管理中,有一项项目工具,叫WBS,即工作结构分解,如果我们能够在平时的思维中有意识的用这个方式来做事,会有好处。

我们平时的大多数情况下会在惯性思维模式下,思考的力度一般都比较粗糙,或者说比较笼统,或者说比较抽象,最终的结果就是执行的力度达不到预期要求。

so,just 分解! 把你能够看到的和想到的,全部写下来,粒度越细越好, 当这些全部完了之后你的大脑会比较轻松,至少你暂时已经有一点成就感了,那就是一个大的抽象的东西已经变成一堆具体可以落实的行动步骤了,下一步的任务就是从第一个小任务开始做起就行了。

GTD中的说法叫清空你的大脑,把你所有牵挂的事情,想要做的事情,统统都写下来,这样你就让电脑的压力降低了。

这么说来,工作与生活原来是相通的。

最近的一个比较复杂的业务实现的处理一开始就是走了弯路,好几天没有效果,用了上面的方法后感觉不错,特来分享之。

其实很简单,不是吗?

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

[zt]PL/SQL开发中动态SQL的使用方法

August 14, 2007

key words : 动态SQL

2005-07-06 13:46 作者: DINYA 出处: BLOG 责任编辑:方舟

  内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情 况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL 来实现。本文通过几个实例来详细的讲解动态SQL的使用。

一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。

首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL 指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输 入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。

Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明:

  一、本地动态SQL

本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。

  1、本地动态SQL执行DDL语句:

需求:根据用户输入的表名及字段名等参数动态建表。

create or replace procedure proc_test
(
table_name in varchar2,     --表名
field1 in varchar2,          --字段名
datatype1 in varchar2,      --字段类型
field2 in varchar2,          --字段名
datatype2 in varchar2        --字段类型
) as
str_sql varchar2(500);
begin
str_sql:=’create table ’||table_name||’(’||field1||’ ’||datatype1||’,’||field2||’ ’||datatype2||’)’;
execute immediate str_sql;   --动态执行DDL语句
exception
when others then
null;
end ;

以上是编译通过的存储过程代码。下面执行存储过程动态建表。

SQL> execute proc_test(’dinya_test’,’id’,’number(8) not null’,’name’,’varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test;
Name Type          Nullable Default Comments
---- ------------- -------- ------- --------
ID   NUMBER(8)

NAME VARCHAR2(100) Y

SQL>

到这里,就实现了我们的需求,使用本地动态SQL根据用户输入的表名及字段名、字段类型等参数来实现动态执行DDL语句。

  2、本地动态SQL执行DML语句。

需求:将用户输入的值插入到上例中建好的dinya_test表中。

create or replace procedure proc_insert
(
id in number,                                 --输入序号
name in varchar2                             --输入姓名
) as
str_sql varchar2(500);
begin
str_sql:=’insert into dinya_test values(:1,:2)’;
execute immediate str_sql using id,name; --动态执行插入操作
exception
when others then
null;
end ;

执行存储过程,插入数据到测试表中。

SQL> execute proc_insert(1,’dinya’);
PL/SQL procedure successfully completed
SQL> select * from dinya_test;
ID      NAME
1      dinya

在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:

declare
p_id number:=1;
v_count number;
begin
v_string:=’select count(*) from table_name a where a.id=:id’;
execute immediate v_string into v_count using p_id;
end ;

更多的关于动态SQL中关于返回值及为输出输入绑定变量执行参数模式的问题,请读者自行做测试。

  二、使用DBMS_SQL

使用DBMS_SQL包实现动态SQL的步骤如下:A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。B、使用DBMS_SQL包的 parse过程来分析该字符串。C、使用DBMS_SQL包的bind_variable过程来绑定变量。D、使用DBMS_SQL包的execute函 数来执行语句。

  1、使用DBMS_SQL包执行DDL语句

需求:使用DBMS_SQL包根据用户输入的表名、字段名及字段类型建表。

create or replace procedure proc_dbms_sql
(
table_name in varchar2,       --表名
field_name1 in varchar2,      --字段名
datatype1 in varchar2,        --字段类型
field_name2 in varchar2,      --字段名
datatype2 in varchar2         --字段类型
)as
v_cursor number;              --定义光标
v_string varchar2(200);      --定义字符串变量
v_row number;                  --行数
begin
v_cursor:=dbms_sql.open_cursor;     --为处理打开光标
v_string:=’create table ’||table_name||’(’||field_name1||’ ’||datatype1||’,’||field_name2||’ ’||datatype2||’)’;
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);    --分析语句
v_row:=dbms_sql.execute(v_cursor);   --执行语句
dbms_sql.close_cursor(v_cursor);     --关闭光标
exception
when others then
dbms_sql.close_cursor(v_cursor);  --关闭光标
raise;
end;

以上过程编译通过后,执行过程创建表结构:

SQL> execute proc_dbms_sql(’dinya_test2’,’id’,’number(8) not null’,’name’,’varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test2;
Name Type          Nullable Default Comments
---- ------------- -------- ------- --------
ID   NUMBER(8)
NAME VARCHAR2(100) Y

SQL>

  2、使用DBMS_SQL包执行DML语句

需求:使用DBMS_SQL包根据用户输入的值更新表中相对应的记录。

查看表中已有记录:

SQL> select * from dinya_test2;
ID NAME
1 Oracle
2 CSDN
3 ERP
SQL>

建存储过程,并编译通过:

create or replace procedure proc_dbms_sql_update
(
id number,
name varchar2
)as
v_cursor number;            --定义光标
v_string varchar2(200);   --字符串变量
v_row number;               --行数
begin
v_cursor:=dbms_sql.open_cursor;    --为处理打开光标
v_string:=’update dinya_test2 a set a.name=:p_name where a.id=:p_id’;
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);   --分析语句
dbms_sql.bind_variable(v_cursor,’:p_name’,name);     --绑定变量
dbms_sql.bind_variable(v_cursor,’:p_id’,id);          --绑定变量
v_row:=dbms_sql.execute(v_cursor);           --执行动态SQL
dbms_sql.close_cursor(v_cursor);                        --关闭光标
exception
when others then
dbms_sql.close_cursor(v_cursor);                --关闭光标
raise;
end;

执行过程,根据用户输入的参数更新表中的数据:

SQL> execute proc_dbms_sql_update(2,’csdn_dinya’);

PL/SQL procedure successfully completed

SQL> select * from dinya_test2;
ID NAME
1 Oracle
2 csdn_dinya
3 ERP
SQL>

执行过程后将第二条的name字段的数据更新为新值csdn_dinya。这样就完成了使用dbms_sql包来执行DML语句的功能。

使用DBMS_SQL中,如果要执行的动态语句不是查询语句,使用DBMS_SQL.Execute或 DBMS_SQL.Variable_Value来执行,如果要执行动态语句是查询语句,则要使用DBMS_SQL.define_column定义输出 变量,然后使用DBMS_SQL.Execute, DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及DBMS_SQL.Variable_Value来执行查询并得到结果。

  总结说明:

在Oracle开发过程中,我们可以使用动态SQL来执行DDL语句、DML语句、事务控制语句及系统控制语句。但是需要注意的是,PL/SQL块中使 用动态SQL执行DDL语句的时候与别的不同,在DDL中使用绑定变量是非法的(bind_variable(v_cursor,’:p_name’, name)),分析后不需要执行DBMS_SQL.Bind_Variable,直接将输入的变量加到字符串中即可。另外,DDL是在调用 DBMS_SQL.PARSE时执行的,所以DBMS_SQL.EXECUTE也可以不用,即在上例中的v_row:=dbms_sql.execute (v_cursor)部分可以不要。

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

将GTD进行到底

August 14, 2007

key words: GTD,效率

这是从煎蛋看到的一篇文章,转载

  1. 先确立3个最重要的任务
  2. 简单可行的待办事项。
  3. 随时记录自己的想法。
  4. 选择某种工具并且一直使用它
  5. 同时只做一件事情。
  6. 马上就做。
  7. 学会拒绝。
  8. 给自己搞一个实体的“回收站”
  1. 放好自己的东西,各就各位。
  2. 简化,简化,简化!
  3. 用完东西就马上放回去。
  4. 将你的代办事项同步到手机上
  5. 改变。
  6. 将文件放到不同颜色的夹子里。
  7. Flylady.net(算广告么?)
  8. 无条件的控制好你的时间和财产
  9. 从根源上做好分类。
  10. 一摞纸,一个日历和一个白板。
  11. 用彩色的笔来记录
  12. 使用”@”(不是@某人,而是@某时。)
  13. 在路上的时候写下牢记要做的事情。
  14. 在卧室挂一块记事的小白板
  15. 记事卡。
  16. 永远也不要抓着一次失败不放。
  17. 不要欺骗。
  18. 委派
  19. 你能控制好的你生活。
VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

[zt]刘韧的学习方式

August 14, 2007

key words:学习方式

刚看到刘韧谈自己的学习方式,感觉有启发,特别是前3条

 

1.         读 教课书。比如,我学习经济学,就先买了萨缪尔森、曼昆、斯蒂格利茨各自所著的《经济学原理》。虽然很多经济学的模型和曲线一时读不懂,但我知道,我至少在 读经济学。后来,在北大中国经济研究中心的老师的带领下,精读了斯蒂格利茨的《经济学原理》。现在,我对金融投资感兴趣,我就买了当今最流行的兹维·博迪 等著作的《投资学精要》。读教课书的好处是能准确知道一门学科的框架、定义与概念。有了框架、定义与概念,我就能按照这门学科的逻辑进行分析和思考了。

2.         看记录片。教课书是枯燥的。最近5年来,我发现自己读书的时间,越来越少,而看谍的时间越来越多。我在寻找一切我感兴趣学科的记录片。记录片当然浅显,但它拥有多媒体的优势,多媒体在单位时间内传达的信息比文字多。特别是历史、地理,用记录片表达比文字要好。比如,我喜欢看《凤凰大视野》。隔断时间,就用eMule下载一次,将自己感兴趣的内容一次看完。

3.     听 学者讲座。学者到大学讲演,一般会浓缩、发挥他的最高水平。比如王蒙去北大演讲、郎咸平去清华演讲、易中天到北京理工大学的演讲等。而所谓学者都是在某一 个狭窄领域有建树的人。所以,一个学者真正值得学习的地方并不多。在我关注的学者中,林毅夫算是学惯中西的人,但他的课听多了,也是同义反复。所以,我建 议,一个学者,听他一次讲座也就够了。圣人无常师。

4.     问问题。2005年的农历815。我访问了刚刚出版了《兄弟》的余华。问了他2个小时的关于写作的问题。受益匪浅。将你的问题提炼出来,不停地拿这些问题,去问你认为值得一问的人。比如,我问余华,怎样判断A作家比B作家写得好。余华说:“要看谁写细节的能力强。”

5.     查资料,问老师。遇到问题,先Google一下。我的假设是,我遇到的问题一定不是新问题。别人此前一定遇到过,并有现成的解决办法。我们是能查到一堆资料,但这些资料中,我究竟该精读哪一个?先读哪一个。这个时候,就需要有明师指点。


VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

Launchy快速启动你的应用程序

August 3, 2007

key words: Launchy,快速启动

电脑里的应用程序装的太多,是不是每次都要点半天鼠标感觉很麻烦,有了下面这个工具一切迎刃而解

screenshot_sheep.jpg

screenshot_google.jpg

screenshot_firefox.jpg

看出来了么? 只要在一个浮动窗口里输入应用程序的名字马上就帮你找到,直接回车就OK了,just try it!

官方站点下载

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

ORA-01847错误

August 2, 2007

key words:ORA-01847错误

plsql中对存储过程作 test发现错误

insert into t_callbackupdatedata(id,phone,status,owefee,owemonth,INPUTTIME)
values(hibernate_sequence.nextval,vv_phone,vv_status,decode(vv_oweFee,null,vv_oweFee,to_number(vv_oweFee)),
decode(vv_oweMonth,null,vv_oweMonth,to_date(vv_oweMonth,'yyyyMMdd')),sysdate);

运行时提醒错误为:

ORA-01847:月份中日的值必须介于1和当月最后一日之间

提示的意思是我的数据不合法,实际上完全没那回事,查了一下据说是中文客户端的问题,也就是说如果不用客户端的话正常使用没有影响,that’s OK.

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)