求助修改一下FUNCTION

需要DB2中十进制转二进制,匆忙写了个ORACLE的FUNCTION照着SQL REFERENCE改成DB2的,可编译通过不了。。。找了几个例子发现DB2的FUNCTION和PROCEDURE相差还蛮大的,DB2 FUNCTION中看了些都没有用到BEGIN...END我不知道应该怎么修改,大家帮忙看看啊 create function toBinary ( ...显示全部
需要DB2中十进制转二进制,匆忙写了个ORACLE的FUNCTION照着SQL REFERENCE改成DB2的,可编译通过不了。。。
找了几个例子发现DB2的FUNCTION和PROCEDURE相差还蛮大的,DB2 FUNCTION中看了些都没有用到BEGIN...END
我不知道应该怎么修改,大家帮忙看看啊
 
create function toBinary ( in_num bigint )
returns varchar(100)
language sql
begin
declare global temporary table gbl_temp (idx smallint,val varchar(2)) on commit delete rows not logged;  -- 创建临时表
declare n smallint default 0;  -- 插入临时表字段,用于游标排序
declare tmp1 smallint;  -- 余数
declare tmp2 integer default 0;  -- 商
declare r_value varchar(100);  -- 返回值
declare mycur cursor for select val from gbl_temp order by idx; -- 游标拼接返回值
set tmp2 = in_num;
 
while tmp2 >= 2 do
set tmp1 = mod(tmp2,2);
set tmp2 = floor(tmp2/2);
insert into gbl_temp values(n,tmp1);
set n = n+1;
if tmp2 < 2 then
insert into gbl_temp values(n,tmp2);
end if;
end while;
 
if in_num < 2 then
   return char(in_num);
end if;
 
for mycur do
set r_value = mycur.val||value(r_value,'');
end for;
return r_value;
end;
上面是改了的FUNCTION,结果是完全不知道错哪里,大脑一团雾水。。。

然后继续照着SQL REFERENCE改成PROCEDURE
 

create procedure to_binary (in in_num bigint, out out_num varchar(100))
dynamic result sets 1
language sql
begin
declare global temporary table gbl_temp (idx smallint,val varchar(2)) on commit delete rows not logged;
declare n smallint default 0;
declare tmp1 smallint default 0;
declare tmp2 bigint default 0;
declare r_value varchar(100) default '';
declare mycur cursor for select val from gbl_temp order by idx;
set tmp2 = in_num;
while tmp2 >= 2 do
        set tmp1 = mod(tmp2,2);
        set tmp2 = floor(tmp2/2);
        insert into gbl_temp values(n,tmp1);
        set n = n+1;
        if tmp2 < 2 then
                insert into gbl_temp values(n,tmp2);
        end if;
end while;
if in_num < 2 then
        set out_num = char(in_num);
else  
        for mycur do
                set r_value = mycur.val||value(r_value,'');
        end for;
        set out_num = r_value;
end if;
end;
照样无法通过。。。
SQL0104N  An unexpected token "for mycur do" was found following "har(in_num);
else   ".  Expected tokens may include:  "".  LINE NUMBER=27.  
麻烦大家看看收起
参与15

查看其它 14 个回答kenshinsee的回答

DB2中没有数组真不方便,用临时表我不是很熟。。。
我按LS朋友说的修改了还是没用
create procedure to_binary (in in_num bigint, out out_num varchar(100))
dynamic result sets 1
language sql
begin
begin
declare global temporary table session.gbl_temp (idx smallint,val varchar(2)) on commit delete rows not logged;
end;
begin
declare mycur cursor for select val from session.gbl_temp order by idx;
end;
declare n smallint default 0;
declare tmp1 smallint default 0;
declare tmp2 bigint default 0;
......
end;

报错信息
SQL0104N  An unexpected token "" was found following "".
Expected tokens may include:  "".  LINE NUMBER=11.  
SQLSTATE=42601

还有我游标用的很乱吗?
我就是把十进制每次取余的数放在了一个临时表里,然后后面用一个指向该临时表的游标一个个取出来拼成一个字符串,得到该十进制数的二进制表示。
大家有什么更好的解决方法吗?

还有begin ... end 块在ORACLE里体现原子性,如果要用下面得捕捉EXCEPTION啊,难道DB2中不需要吗?
begin
begin
raise_application_error(-20001,'myerror');
end;
dbms_output.put_line('yes');
exception
when others then
raise_application_error(-20002,'sqlcode:'||SQLCODE||';error message:'||SQLERRM);
end;

如果忽略错误直接在嵌套内的代码块中用exception when others then null; 来忽略错误,
我想知道DB2中单单用了个begin...end 是怎么用,难道begin...end里报错外部程序块会忽视吗,如果不忽略如何处理?
2009-04-02
浏览1102

回答者

kenshinsee 最近回答过的问题

回答状态

  • 发布时间:2009-04-02
  • 关注会员:0 人
  • 回答浏览:1102
  • X社区推广