CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  DB2 >  数据库开发

如何将下列算法转换成DB2的用户自定义方法(create fuction)?(600里加急)

楼主whoami1618(火冰)2006-07-18 16:37:31 在 DB2 / 数据库开发 提问

以下是一个DELPHI自定义方法,如何转换成DB2的用户自定义方法(用create   fuction)  
  function   idcardchang(ID:   string):string;  
  const  
  W:array   [1..18]   of   integer   =   (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);  
  A:array   [0..10]   of   char   =   ('1','0','x','9','8','7','6','5','4','3','2');  
  var  
  i,   j,   S:   integer;  
  NewID:   string;  
  begin  
      if   Length(trim(ID))=15   then  
          begin  
              NewID:=   ID;  
              Insert('19',   NewID,   7);  
              S:=   0;  
              try  
                  for   i:=1   to   17   do  
                  begin  
                          j:=   StrToInt(NewID[i])   *   W[i];  
                          S:=   S   +   j;  
                      end;  
              except  
                  result:=   '';  
                  exit;  
              end;  
              S:=   S   mod   11;  
              Result:=   NewID   +   A[S];  
          end  
      else  
          result:=   '';  
  end; 问题点数:50、回复次数:8Top

1 楼whoami1618(火冰)回复于 2006-07-19 09:09:10 得分 0

帮帮忙呀……Top

2 楼ciwdba()回复于 2006-07-19 14:18:06 得分 0

--------------------------------------------------------------  
  您好,我们是“2006中国杰出数据库工程师评选”活动组委会。  
  您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。  
  http://www.bestdba.cn/match_discussion.aspx  
   
  在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。  
  一方面,他们会为您的问题提供满意的答案,  
  另一方面,也邀请您为他们投上宝贵的选票。  
   
  2006-7-8   ~   2006-7-25日,每天我们将从当天参与"有奖投票"的网友  
  中抽取3名幸运者,赠送由IBM提供的精美礼品一份!  
   
  此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。  
   
  您的帖子位于:  
  http://www.bestdba.cn/match_discussion3.aspx?pointid=279&pointid2=1&pointid3=5&pcount=stc  
   
  非常感谢您对本次活动的支持!  
  --------------------------------------------------------------  
  Top

3 楼whoami1618(火冰)回复于 2006-07-19 15:12:25 得分 0

不知DB2里面如何写for循环,以及其他的一些控制语句的写法?  
   
  这是我试着写的一个(case处总提示错误,帮忙看看):  
  CREATE   FUNCTION   db2inst1.change(ID   VARCHAR(15))  
          RETURNS   VARCHAR(18)  
  ------------------------------------------------------------------------  
  --   SQL   UDF   (Scalar)  
  -----------------------------------------------------------------------  
  F1:   BEGIN   ATOMIC  
          DECLARE   s   Integer;  
          DECLARE   w   Integer;  
          DECLARE   a   Char(1);  
          DECLARE   ID_OLD   Char(18);  
          DECLARE   ID_NEW   Char(18);  
          set   ID_OLD=replace(ID,'   ','');  
          if   length(ID_OLD)=15   then  
                  set   ID_NEW=ID_OLD;  
  set   ID_NEW=insert(ID_NEW,7,0,'19');  
  set   s=0;  
   
  set   s=s+cast(substr(ID_NEW,1,1)   as   integer)*7;  
  set   s=s+cast(substr(ID_NEW,2,1)   as   integer)*9;  
  set   s=s+cast(substr(ID_NEW,3,1)   as   integer)*10;  
  set   s=s+cast(substr(ID_NEW,4,1)   as   integer)*5;  
  set   s=s+cast(substr(ID_NEW,5,1)   as   integer)*8;  
  set   s=s+cast(substr(ID_NEW,6,1)   as   integer)*4;  
  set   s=s+cast(substr(ID_NEW,7,1)   as   integer)*2;  
  set   s=s+cast(substr(ID_NEW,8,1)   as   integer)*1;  
  set   s=s+cast(substr(ID_NEW,9,1)   as   integer)*6;  
  set   s=s+cast(substr(ID_NEW,10,1)   as   integer)*3;  
  set   s=s+cast(substr(ID_NEW,11,1)   as   integer)*7;  
  set   s=s+cast(substr(ID_NEW,12,1)   as   integer)*9;  
  set   s=s+cast(substr(ID_NEW,13,1)   as   integer)*10;  
  set   s=s+cast(substr(ID_NEW,14,1)   as   integer)*5;  
  set   s=s+cast(substr(ID_NEW,15,1)   as   integer)*8;  
  set   s=s+cast(substr(ID_NEW,16,1)   as   integer)*4;  
  set   s=s+cast(substr(ID_NEW,17,1)   as   integer)*2;  
  set   s=s+cast(substr(ID_NEW,18,1)   as   integer)*1;  
   
  set   s=mod(s,11);  
   
  case   s  
  when   0   then   set   ID_NEW=ID_NEW+'1';  
  when   1   then   set   ID_NEW=ID_NEW+'0';  
  when   2   then   set   ID_NEW=ID_NEW+'x';  
  when   3   then   set   ID_NEW=ID_NEW+'9';  
  when   4   then   set   ID_NEW=ID_NEW+'8';  
  when   5   then   set   ID_NEW=ID_NEW+'7';  
  when   6   then   set   ID_NEW=ID_NEW+'6';  
  when   7   then   set   ID_NEW=ID_NEW+'5';  
  when   8   then   set   ID_NEW=ID_NEW+'4';  
  when   9   then   set   ID_NEW=ID_NEW+'3';  
  when   10   then   set   ID_NEW=ID_NEW+'2';  
  end   case  
   
          else  
                  set   ID_NEW=ID_OLD;  
          end   if;  
          RETURN   ID_NEW;  
  ENDTop

4 楼luoxiao(小锣)回复于 2006-08-01 12:35:54 得分 50

在评选的那里写的  
  函数翻译成DB2的JAVA格式就是:    
  import   COM.ibm.db2.app.*;    
   
  public   class   IDCard   extends   UDF   {    
  public   IDCard()   {    
  }    
   
  public   static   String   idcardchang(String   ID)   {    
  int   i,j,s=0,w[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};    
  String   a[]={"1","0","x","9","8","7","6","5","4","3","2"};    
  String   NewID;    
  if   (ID.length()==15)   {    
  NewID=ID;    
  NewID=NewID.substring(0,6).concat("19").concat(NewID.substring(6,15));    
  try   {    
  for(i=0;i<17;i++)   {    
  j=Integer.parseInt(NewID.substring(i,i+1))*w[i];    
  s=s+j;    
  }    
  s=s   %   11;    
  return   NewID.concat(a[s]);    
  }    
  catch(ArithmeticException   e)   {    
  return   "";    
  }    
  }    
  else   {    
  return   "";    
  }    
  }    
  }    
   
  保存为IDCard.java,注意大小写。在DB2自带的JDK里编译:    
  javac   IDCard.java    
  把生成的IDCard.class复制到FUNCTION目录,打开命令编辑器:    
  create   function   idcardchang(VALUE   VARCHAR(50))    
  returns   VARCHAR(50)    
  fenced    
  variant    
  no   sql    
  language   java    
  parameter   style   java    
  external   name   'IDCard!idcardchang';    
  执行之。注意VARCHAR(50)可按需调整  
  Top

5 楼whoami1618(火冰)回复于 2006-08-01 14:13:11 得分 0

感谢luoxiao(小锣),晚上试一试。  
  另:有没有与此相关的学习资料,或者网站介绍一下。不知道用纯SQL语句怎么写?哪个效率更高?  
  再次感谢。Top

6 楼jj456789(天使yeah)回复于 2006-08-05 17:43:10 得分 0

字符串连接用||   或concat函数,怎么用+Top

7 楼Simore(simore)回复于 2006-08-07 18:14:39 得分 0

--------------------------------------------------------------  
  您好,我们是“2006中国杰出数据库工程师评选”活动组委会。  
  您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。  
  http://www.bestdba.cn/match_discussion.aspx  
   
  在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,  
   
  此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。  
   
  您的帖子位于:  
  http://www.bestdba.cn/match_discussion3.aspx?pointid=447&pointid2=1&pointid3=5&pcount=stc  
  非常感谢您对本次活动的支持!  
  --------------------------------------------------------------  
  Top

8 楼zhuxincheng()回复于 2006-10-15 17:40:06 得分 0

字符串的连接需要用‘||’,另外DB2中有FOR   LOOP的语法结构,这中情况用CASE太浪费了。Top

相关问题

关键词

得分解答快速导航

  • 帖主:whoami1618
  • luoxiao

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo