728x90

푸른솔님 | 개발 | 2013-05-31 14:54:16




푸른솔 2013-05-31 14:54:57
본문 내용을 어떻게 붙이는지요? 아무리 해도 본문을 쓸수가 없습니다.

푸른솔 2013-05-31 14:55:51
안녕하세요.. 외부 함수 등록(External function)에 대해 문의를 드립니다.

C로 된 소스이며, 이를 컴파일해서 외부 함수로 등록을 하려고 합니다.

컴파일 옵션
xlc_r -q64 -qarch=auto -qmkshrobj Test.c -o Test.so

이상없이 컴파일되었으며 지정한 디렉토리(db2/v9.7/function)에 등록되었습니다.

그리고 다음과 같이 외부함수를 등록, 실행하였습니다.
CREATE FUNCTION test.TEST_UDF1()
RETURNS INTEGER
SPECIFIC test.TEST_UDF1
EXTERNAL NAME 'test!TestInt'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
NOT FENCED
RETURNS NULL on NULL INPUT
NO SQL
NO EXTERNAL ACTION
ALLOW PARALLEL


위에 등록된 함수를 실행해 보면
select test.test_udf1
from sysibm.sysdummy1

Integer값(100)을 리턴해야 하는데 0 또는 1078373값이 리턴됩니다.
오라클만 하다가 DB2를 처음 해 보는데 왜 값이 제대로 리턴 안되는지
도저히 모르겠습니다.

혹시 경험있은분의 도움을 부탁드립니다.


해당부분의 C소스입니다. 그냥 숫자 100을 리턴만 합니다..

int TestInt(void)
{
return 100;
}

DB2 버전은 9.7이며 os는 AIX 6.1입니다....

푸른솔 2013-05-31 14:56:39
본문 작성이 안돼서 댓글로 붙였습니다....

pajama 2013-06-01 16:03:41
DB2에서 C/C++로 함수를 작성할때는 매개변수에 포인터를 사용해야 합니다.
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0023758.html

아래와 같이 작성하면 원하시는 결과가 나옵니다.

void TestInt (int *out){
*out=100;
return;

자세한 함수 작성법은 인포센터를 참조하십시오.
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0020578.html

푸른솔 2013-06-03 10:41:24
대단히 감사합니다. 덕분에 해결이 됐습니다. 감사합니다.
그런데 char형은 int와 또 다른 모양입니다. 
아래와 같은 char형이 있는데 int와 같이 해 줬는데 안되네요... 물론 링크의 내용도
보고 있습니다.

-- 외부함수호출..
CREATE FUNCTION edge.TEST_UDF2()
RETURNS varchar(100)
SPECIFIC edge.TEST_UDF2
EXTERNAL NAME 'testlib!TestString'
LANGUAGE C
PARAMETER STYLE DB2SQL
DETERMINISTIC
....

-- 외부 함수 C 소스
void TestString(char out[20]) /* *out 도 해 보았습니다 */
{
/* *out = "Character returned."; 이 부분은 에러가 발생합니다 */
/* 그래서 아래와 같이 했는데 값이 안 올라 옵니다 */
out = "Character returned.";
return;
}

한 번만 더 살펴 주시면 감사하겠습니다.
감사합니다.

pajama 2013-06-03 12:26:13
참고하시기 바랍니다.

void TestString(char *out)
{
strcpy(out, "Character returned.");
return;
}

푸른솔 2013-06-03 12:53:43
pajama님...대단히 감사합니다. 드디어 해결이 됐습니다.
오라클하고는 많이 다르네요...
무지 감사드립니다....



728x90

+ Recent posts