- 论坛徽章:
- 0
|
我查了一下网上的资料,发现人家是这样写的:- #include <pcre.h>
- #include <sqludf.h>
-
- void regexpSimple(
- // input parameters
- SQLUDF_VARCHAR *pattern, SQLUDF_CLOB *str,
- // output
- SQLUDF_INTEGER *match,
- // null indicators
- SQLUDF_NULLIND *pattern_ind, SQLUDF_NULLIND *str_ind,
- SQLUDF_NULLIND *match_ind,
- SQLUDF_TRAIL_ARGS)
- {
- pcre *re = NULL;
- const char *error = NULL;
- int errOffset = 0;
- int rc = 0;
-
- // we assume successful return
- *match_ind = 0;
-
- // compile the pattern to its internal representation
- re = pcre_compile(pattern, 0 /* default options */, &error,
- &errOffset, NULL);
- if (re == NULL) {
- snprintf(SQLUDF_MSGTX, 70, "Regexp compilation failed at "
- "offset %d: %s\n", errOffset, error);
- strcpy(SQLUDF_STATE, "38900");
- (*pcre_free)(re);
- return;
- }
-
- // match the string againts the pattern
- rc = pcre_exec(re, NULL, str->data, str->length, 0,
- 0 /* default options */, NULL, 0);
- switch (rc) {
- case PCRE_ERROR_NOMATCH:
- *match = 0;
- break;
- case PCRE_ERROR_BADOPTION:
- snprintf(SQLUDF_MSGTX, 70, "An unrecognized bit was set in the "
- "options argument");
- strcpy(SQLUDF_STATE, "38901");
- break;
- case PCRE_ERROR_NOMEMORY:
- snprintf(SQLUDF_MSGTX, 70, "Not enough memory available.");
- strcpy(SQLUDF_STATE, "38902");
- break;
- default:
- if (rc < 0) {
- snprintf(SQLUDF_MSGTX, 70, "A regexp match error "
- "occured: %d", rc);
- strcpy(SQLUDF_STATE, "38903");
- }
- else {
- *match = 1;
- }
- break;
- }
-
- // cleanup
- (*pcre_free)(re);
- return;
- }
复制代码 输入与输出都是放在参数里,返回用VOID.调用如下:- SELECT str
- FROM strTable
- WHERE regex1('\w* = (\d|0x00);', str) = 1
复制代码 创建DB2函数的DDL如下:- CREATE FUNCTION regex1(pattern VARCHAR(2048), string CLOB(10M))
- RETURNS INTEGER
- SPECIFIC regexSimple
- EXTERNAL NAME 'regexUdf!regexpSimple'
- LANGUAGE C
- PARAMETER STYLE DB2SQL
- DETERMINISTIC
- NOT FENCED
- RETURNS NULL ON NULL INPUT
- NO SQL
- NO EXTERNAL ACTION
- ALLOW PARALLEL;
复制代码 |
|