ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 请帮忙分析这个函数错在哪里?

标题: [PL/SQL] 请帮忙分析这个函数错在哪里?
离线 hotiice
版主


精华贴数 10
个人空间 0
技术积分 16884 (62)
社区积分 1803 (662)
注册日期 2004-9-9
论坛徽章:21
现任管理团队成员会员2007贡献徽章铁扇公主生肖徽章2007版:牛2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳
设计板块每日发贴之星设计板块每日发贴之星生肖徽章2007版:蛇2008年新春纪念徽章生肖徽章2007版:兔生肖徽章2007版:猴

发表于 2008-9-17 15:28 
请帮忙分析这个函数错在哪里?

--分步插入
create or replace procedure inserttab1(rowc NUMBER,colc NUMBER)
is
buf varchar(24000):='insert into tcol'||to_char(colc)||' select level,';
begin
if rowc<=1000 then
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc);
execute immediate buf;
commit;
else
for j in 1..rowc/1000+1
loop
buf :='insert into tcol'||to_char(colc)||' select level+'||(j-1)*1000||',';
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
if j<rowc/1000 then
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(1000);
else
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc-j*1000);
end if;
execute immediate buf;
commit;
end loop;
end if;
end;
想用来代替
-- inserttab插入一个含有指定数值型列的表,插入的行数可以指定,数值是随机的
create or replace procedure inserttab(rowc NUMBER,colc NUMBER)
is
buf varchar(24000):='insert into tcol'||to_char(colc)||' select level,';
begin
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc);
execute immediate buf;
end;

但是插入的行数不对
SQL> exec inserttab1(20000,50);

PL/SQL procedure successfully completed.

Elapsed: 00:00:13.07
SQL> select count(*) from tcol50;

  COUNT(*)
----------
     19002

Elapsed: 00:00:00.03

create or replace procedure createtab(colc IN NUMBER,PP IN NUMBER:=15,SS IN NUMBER:=2)
is
buf varchar(24000):='create table tcol'||to_char(colc)||'(x1 varchar(10),';
begin
for i in 1..colc-1
  loop
   buf:=buf||'v'||to_char(i)||' number('||to_char(PP)||','||to_char(SS)||'),';
  end loop;
buf:=buf||'v'||to_char(colc)||' number('||to_char(PP)||','||to_char(SS)||'))';
execute immediate buf;
end;
建立表


__________________
①②⑧

只看该作者    顶部
离线 hotiice
版主


精华贴数 10
个人空间 0
技术积分 16884 (62)
社区积分 1803 (662)
注册日期 2004-9-9
论坛徽章:21
现任管理团队成员会员2007贡献徽章铁扇公主生肖徽章2007版:牛2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳
设计板块每日发贴之星设计板块每日发贴之星生肖徽章2007版:蛇2008年新春纪念徽章生肖徽章2007版:兔生肖徽章2007版:猴

发表于 2008-9-17 16:05 
自己改好了

create or replace procedure inserttab1(rowc NUMBER,colc NUMBER)
is
buf varchar(24000):='insert into tcol'||to_char(colc)||' select level,';
b number:=floor(rowc/1000);
begin
if rowc<=1000 then
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc);
execute immediate buf;
commit;
else
for j in 1..b
loop
buf :='insert into tcol'||to_char(colc)||' select level+'||(j-1)*1000||',';
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(1000);
execute immediate buf;
commit;
end loop;
if rowc-b*1000>0 then
buf :='insert into tcol'||to_char(colc)||' select level+'||(b)*1000||',';
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc-b*1000);
execute immediate buf;
commit;
end if;
end if;
end;


__________________
①②⑧

只看该作者    顶部
离线 hotiice
版主


精华贴数 10
个人空间 0
技术积分 16884 (62)
社区积分 1803 (662)
注册日期 2004-9-9
论坛徽章:21
现任管理团队成员会员2007贡献徽章铁扇公主生肖徽章2007版:牛2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳
设计板块每日发贴之星设计板块每日发贴之星生肖徽章2007版:蛇2008年新春纪念徽章生肖徽章2007版:兔生肖徽章2007版:猴

发表于 2008-9-17 16:16 
改得短了一点

create or replace procedure inserttab1(rowc NUMBER,colc NUMBER)
is
bufl varchar(24000):='insert into tcol'||to_char(colc)||' select level,';
buf varchar(24000):='';
bufr varchar(24000):='';
b number:=floor(rowc/1000);
begin
for i in 1..colc-1
  loop
   buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
  end loop;
if rowc<=1000 then
bufr:='mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc);
execute immediate bufl||buf||bufr;
commit;
else
for j in 1..b
loop
bufl:='insert into tcol'||to_char(colc)||' select level+'||(j-1)*1000||',';
bufr:='mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(1000);
execute immediate bufl||buf||bufr;
commit;
end loop;
if rowc-b*1000>0 then
bufl :='insert into tcol'||to_char(colc)||' select level+'||(b)*1000||',';
bufr:='mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc-b*1000);
execute immediate bufl||buf||bufr;
commit;
end if;
end if;
end;


__________________
①②⑧

只看该作者    顶部
在线/呼叫 jack198409
中级会员


来自 湖北武汉
精华贴数 0
个人空间 484
技术积分 3219 (476)
社区积分 3467 (416)
注册日期 2007-8-10
论坛徽章:35
NBA2008季后赛纪念徽章NBA季后赛之星2008北京奥运纪念徽章:沙滩排球2008北京奥运纪念徽章:沙滩排球2008北京奥运纪念徽章:射箭2008北京奥运纪念徽章:柔道
2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:排球2008北京奥运纪念徽章:垒球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:足球

发表于 2008-9-17 16:27 
报什么错?


__________________
金麟岂是池中物,一遇风云便化龙!


我的SPACE空间欢迎您!
   


只看该作者    顶部
离线 阿日
2M-Never give up


精华贴数 0
个人空间 501
技术积分 1787 (945)
社区积分 1155 (896)
注册日期 2004-1-4
论坛徽章:22
ITPUB元老铁扇公主红孩儿授权会员2008北京奥运纪念徽章:游泳2008北京奥运纪念徽章:曲棍球
2008北京奥运纪念徽章:马术2008北京奥运纪念徽章:棒球2008北京奥运纪念徽章:排球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:垒球

发表于 2008-9-17 16:39 
呵,版主已经改好了呀


__________________
我欲将心向明月,奈何明月照沟渠.
过去的都过去了,大不了从头再来,别回头,向前看!
http://blog.csdn.net/zxf_feng
只看该作者    顶部
离线 hotiice
版主


精华贴数 10
个人空间 0
技术积分 16884 (62)
社区积分 1803 (662)
注册日期 2004-9-9
论坛徽章:21
现任管理团队成员会员2007贡献徽章铁扇公主生肖徽章2007版:牛2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳
设计板块每日发贴之星设计板块每日发贴之星生肖徽章2007版:蛇2008年新春纪念徽章生肖徽章2007版:兔生肖徽章2007版:猴

发表于 2008-9-17 16:41 
教训
insert into a select level from dual connect vy level<=-1也会插入


__________________
①②⑧

只看该作者    顶部
离线 nyfor
Oracle Fan


来自 苏州
精华贴数 7
个人空间 0
技术积分 8319 (155)
社区积分 475 (1610)
注册日期 2002-1-6
论坛徽章:17
现任管理团队成员     
      

发表于 2008-9-17 16:43 


QUOTE:
原帖由 jack198409 于 2008-9-17 16:27 发表
报什么错?

2# 说已经改好了, 俺就不看了


__________________
 
帮助别人,也在帮助自己!
Oracle Version 9.2.0
Oracle Version 10.2.0

看别人不顺眼是自己修养不够!
只看该作者    顶部
离线 nyfor
Oracle Fan


来自 苏州
精华贴数 7
个人空间 0
技术积分 8319 (155)
社区积分 475 (1610)
注册日期 2002-1-6
论坛徽章:17
现任管理团队成员     
      

发表于 2008-9-17 16:45 
select level from dual connect vy level<=-1
其实这样的查询我不太喜欢用, 只是最近看大家用得多了, 我偶尔也会用用
不过这样的insert 也能插入记录, 是比较奇怪, 该死的 Oracle


__________________
 
帮助别人,也在帮助自己!
Oracle Version 9.2.0
Oracle Version 10.2.0

看别人不顺眼是自己修养不够!
只看该作者    顶部
离线 smallnavy
平常心


精华贴数 1
个人空间 3
技术积分 2407 (664)
社区积分 3478 (409)
注册日期 2003-9-2
论坛徽章:55
生肖徽章2007版:龙2008北京奥运纪念徽章:摔跤生肖徽章:龙   
      

发表于 2008-9-17 17:01 


QUOTE:
原帖由 hotiice 于 2008-9-17 16:41 发表
教训
insert into a select level from dual connect vy level

这个不容易注意。


__________________
竹仗芒鞋轻胜马,一蓑烟雨任平生
只看该作者    顶部
在线/呼叫 newkid
资深新手
老程序员


来自 银河系
精华贴数 2
个人空间 0
技术积分 2756 (579)
社区积分 0 (121048)
注册日期 2004-6-26
论坛徽章:5
生肖徽章2007版:马生肖徽章2007版:鸡2008北京奥运纪念徽章:垒球2008北京奥运纪念徽章:羽毛球  
      

发表于 2008-9-17 22:57 


QUOTE:
原帖由 nyfor 于 2008-9-17 16:45 发表
select level from dual connect vy level

不奇怪也不该死

start with 限制第一层;
connect by 从第二层开始起作用;
where 对整个结果集过滤。


__________________
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问