如何将下列算法转换成DB2的用户自定义方法(create fuction)?(600里加急)
以下是一个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




