银行

将一个C程序函数转换生成一个DB2数据库的系统函数

各位大师好, 因项目上有关数据库开发类的需要,要实现将一个C程序函数(该函数可能嵌套调用其它函数)通过使用DB2 DBMS有关C语言的运行转换机制生成一个DB2数据库的系统函数,按照网上下的相关帮助文档执行以下流程第d步红色字体标注时出现问题,恳请各位看看提出解决方案,急切,谢谢 ...显示全部
各位大师好,
因项目上有关数据库开发类的需要,要实现将一个C程序函数(该函数可能嵌套调用其它函数)通过使用DB2 DBMS有关C语言的运行转换机制生成一个DB2数据库的系统函数,按照网上下的相关帮助文档执行以下流程第d步红色字体标注时出现问题,恳请各位看看提出解决方案,急切,谢谢
OS平台:AIX,DBMS:DB2,涉及到的应用开发语言:C语言
a.将c源程序使用DB2自己的cc编辑器转换为同名*.o的目标文件,而后引用该文件生成同名的bin文件
c源程序:
#include "stdio.h"
#include "string.h"
#include "sqludf.h"
/*char* unhex(char in_rp[50]);
int main()
{
char in_val[50];
char *gval;*/
/*clrscr();*/
/*printf("请输入16进制数: ");
scanf("%s",&in_val);
gval=unhex(in_val);
printf("gval: %s",gval);
return 0;
}*/
char* unhex(char in_rp[50])
{
int i=0;
int asc=0,bsc=0,absc=0;
int len=strlen(in_rp);
char arr[2],*result="";
if(in_rp=="")
{return "";}
else{
while(i{
switch(strupr(in_rp[i]))
{
case '0' : asc=0;break;
case '1' : asc=1;break;
case '2' : asc=2;break;
case '3' : asc=3;break;
case '4' : asc=4;break;
case '5' : asc=5;break;
case '6' : asc=6;break;
case '7' : asc=7;break;
case '8' : asc=8;break;
case '9' : asc=9;break;
case 'A' : asc=10;break;
case 'B' : asc=11;break;
case 'C' : asc=12;break;
case 'D' : asc=13;break;
case 'E' : asc=14;break;
default : asc=15;break;
}
switch(strupr(in_rp[i+1]))
{
case '0' : bsc=0;break;
case '1' : bsc=1;break;
case '2' : bsc=2;break;
case '3' : bsc=3;break;
case '4' : bsc=4;break;
case '5' : bsc=5;break;
case '6' : bsc=6;break;
case '7' : bsc=7;break;
case '8' : bsc=8;break;
case '9' : bsc=9;break;
case 'A' : bsc=10;break;
case 'B' : bsc=11;break;
case 'C' : bsc=12;break;
case 'D' : bsc=13;break;
case 'E' : bsc=14;break;
default : bsc=15;break;
}
absc=asc*16+bsc;
arr[0]=(char)absc;
arr[1]='';
result=strcat(result,arr);
i+=2;
}
return result;
}
}
以DB2实例用户的身份在unhex.c程序所处目录下执行如下步骤:
1. cc -c -o unhex.o -I ~/sqllib/include unhex.c -D_REENTRANT
2. cc -o unhex -shared -fpic unhex.o

b.将可执行bin文件unhex放到~/sqllib/function目录下

cp -r unhex ~/sqllib/function/

c.以DB2实例用户身份在数据库环境下运行

db2>CREATE FUNCTION unhex (VARCHAR(50))
db2>RETURNS VARCHAR(50)
db2>EXTERNAL NAME '/home/db2inst1/sqllib/function/unhex!unhex'
db2>LANGUAGE C
db2>NULL CALL
db2>PARAMETER STYLE DB2SQL
db2>NO SQL
db2>DETERMINISTIC
db2>NO EXTERNAL ACTION
db2>NOT FENCED;
//运行成功未报错
而后授予public对该函数的可执行对象权限:

db2>grant execute on function unhex(varchar(50)) to public;
//运行成功未报错

d.调用测试,以任意数据模式调用该函数,报错

db2>select unhex('D3E4') from sysibm.dual;

[IBM][CLI Driver][DB2/LINUX] SQL0444N Routine "UNHEX" (specific name "SQL080529112348600") is implemented with code in library or path ".../sqllib/function/UNHEX", function "UNHEX" which cannot be accessed. Reason code: "5". SQLSTATE=42724收起
参与3

查看其它 1 个回答forsoftdev的回答

forsoftdevforsoftdev系统分析师上海全成通信
哪位高手帮忙解决以下,我也遇到了同样的问题
互联网服务 · 2013-03-21
浏览627

回答者

forsoftdev
系统分析师上海全成通信

forsoftdev 最近回答过的问题

回答状态

  • 发布时间:2013-03-21
  • 关注会员:1 人
  • 回答浏览:627
  • X社区推广