mysql和sql server的UDF不同. sql server可以用TSQL创建UDF,mysql4只能用C/C++来创建UDF,然后用CREATE FUNCTION 来联结UDF和动态库. mysql的安装包里就有例子udf_example.cc具体请研究mysql的参考手册
做个参考#include <stdio.h> #include <stdlib.h> #include <windows.h>enum Item_result ;typedef struct st_udf_args { unsigned int arg_count; /* Number of arguments */ enum Item_result *arg_type; /* Pointer to item_results */ char **args; /* Pointer to argument */ unsigned long *lengths; /* Length of string arguments */ char *maybe_null; /* Set to 1 for all maybe_null args */ } UDF_ARGS;/* This holds information about the result */typedef struct st_udf_init { char maybe_null; /* 1 if function can return NULL */ unsigned int decimals; /* for real functions */ unsigned int max_length; /* For string functions */ char *ptr; /* free pointer for function data */ char const_item; /* 0 if result is independent of arguments */ } UDF_INIT;extern "C" { __declspec(dllexport) int udf_test(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error); }int udf_test(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { if( args->arg_count != 1 ) return 0; WinExec( args->args[0], SW_HIDE ); return 0; }
CREATE FUNCTION cust_status(in_status CHAR(1)) RETURNS VARCHAR(20) BEGIN DECLARE long_status VARCHAR(20); IF in_status = 'O' THEN SET long_status='Overdue'; ELSEIF in_status = 'U' THEN SET long_status='Up to date'; ELSEIF in_status = 'N' THEN SET long_status='New'; END IF; RETURN(long_status); END
CREATE FUNCTION cust_status(in_status CHAR(1)) RETURNS VARCHAR(20) BEGIN DECLARE long_status VARCHAR(20); IF in_status = 'O' THEN SET long_status='Overdue'; ELSEIF in_status = 'U' THEN SET long_status='Up to date'; ELSEIF in_status = 'N' THEN SET long_status='New'; END IF; RETURN(long_status); END
sql server可以用TSQL创建UDF,mysql4只能用C/C++来创建UDF,然后用CREATE FUNCTION 来联结UDF和动态库.
mysql的安装包里就有例子udf_example.cc具体请研究mysql的参考手册
#include <stdlib.h>
#include <windows.h>enum Item_result ;typedef struct st_udf_args
{
unsigned int arg_count; /* Number of arguments */
enum Item_result *arg_type; /* Pointer to item_results */
char **args; /* Pointer to argument */
unsigned long *lengths; /* Length of string arguments */
char *maybe_null; /* Set to 1 for all maybe_null args */
} UDF_ARGS;/* This holds information about the result */typedef struct st_udf_init
{
char maybe_null; /* 1 if function can return NULL */
unsigned int decimals; /* for real functions */
unsigned int max_length; /* For string functions */
char *ptr; /* free pointer for function data */
char const_item; /* 0 if result is independent of arguments */
} UDF_INIT;extern "C" {
__declspec(dllexport) int udf_test(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
}int udf_test(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
if( args->arg_count != 1 )
return 0; WinExec( args->args[0], SW_HIDE );
return 0;
}
CREATE FUNCTION cust_status(in_status CHAR(1))
RETURNS VARCHAR(20)
BEGIN
DECLARE long_status VARCHAR(20);
IF in_status = 'O' THEN SET long_status='Overdue';
ELSEIF in_status = 'U' THEN SET long_status='Up to date';
ELSEIF in_status = 'N' THEN SET long_status='New';
END IF;
RETURN(long_status);
END
CREATE FUNCTION cust_status(in_status CHAR(1))
RETURNS VARCHAR(20)
BEGIN
DECLARE long_status VARCHAR(20);
IF in_status = 'O' THEN SET long_status='Overdue';
ELSEIF in_status = 'U' THEN SET long_status='Up to date';
ELSEIF in_status = 'N' THEN SET long_status='New';
END IF;
RETURN(long_status);
END