求助修改一下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的回答

我照着1#的朋友改了,如下
 
create procedure to_binary (in in_num bigint, out out_num varchar(100))
dynamic result sets 1
language sql
begin
declare global temporary table session.gbl_temp (idx smallint,val varchar(2)) on commit delete rows not logged;
declare mycur cursor for select val from session.gbl_temp order by idx;
declare n smallint default 0;
declare tmp1 smallint default 0;
declare tmp2 bigint default 0;
declare r_value varchar(100) default '';
declare tmp3 varchar(1) default '';
declare tmp4 bigint default 0;
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;
select count(*) into tmp4 from gbl_temp;
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;
*/
        open mycur;
        while tmp4 > 0 do
                fetch mycur into tmp3;
                set r_value = tmp3||value(r_value,'');
                set tmp4 = tmp4 - 1;
        end while;
        close mycur;
        set out_num = r_value;
end if;
end@
 
 
咳,编译还是报错
SQL0104N  An unexpected token "" was found following "".  
Expected tokens may include:  "".  LINE NUMBER=6.  
SQLSTATE=42601
我觉得应该是定义临时表的时候出错,但不知道哪里错。。。大家再看看哈
 
还有一个问题就是DB2里的function编写,我是不是PROCEDURE逻辑通过后直接把BEGIN...END里的代码放到FUNCTION的BEGIN...END中,加个RETURN就可以了?
2009-03-31
浏览670

回答者

kenshinsee 最近回答过的问题

回答状态

  • 发布时间:2009-03-31
  • 关注会员:0 人
  • 回答浏览:670
  • X社区推广