mysql udf 예제

함수가 자체 용도로 사용할 수 있는 포인터입니다. 예를 들어 함수는 initid->ptr을 사용하여 할당된 메모리를 자체적으로 통신할 수 있습니다. xxx_init()는 메모리를 할당하고 이 포인터에 할당해야 합니다: UdF를 포함하는 공유 개체를 컴파일한 후 이를 설치하고 MySQL에 알려야 합니다. gcc를 사용하여 udf_example.cc에서 공유 개체를 컴파일하는 것은 udf_example.so라는 파일을 직접 생성합니다. 공유 개체를 서버의 플러그인 디렉토리에 복사하고 udf_example.so의 이름을 지정합니다. 이 디렉터리 플러그인_dir 시스템 변수의 값에 의해 주어진다. UDF 메커니즘이 작동하려면 함수를 C 또는 C++로 작성해야 하며 운영 체제는 동적 로드를 지원해야 합니다. MySQL 소스 배포에는 5개의 UDF 함수를 정의하는 파일 sql/udf_example.cc가 포함됩니다. UDF 호출 규칙의 작동 방식을 보려면 이 파일을 참조하십시오. 포함 /mysql_com.h 헤더 파일은 UDF 관련 기호 및 데이터 구조를 정의하지만 이 헤더 파일을 직접 포함할 필요는 없습니다. 그것은 mysql.h에 의해 포함되어 있습니다. 루틴이 작성되면 소스 코드를 공유 라이브러리로 컴파일하기 위해 일반적으로 따르는 모든 절차를 사용합니다.

예를 들어, 유닉스 기반 시스템에서 GNU C 컴파일러를 사용하여 C 또는 C++ 파일에서 공유 라이브러리를 컴파일하는 작업은 다음과 같은 명령으로 수행할 수 있습니다. 원격 코드(예: sqlmap)를 참조하십시오. 이 예제에서 왜 볼 수 있습니다: 그것은 당신의 요구에 맞게 새로운 함수를 작성 하는 것은 거의 사소한. 가장 큰 장점은 코드가 신뢰할 수 있는 실행 환경(MySQL) 내에 로드되므로 운영 체제에서 검색되지 않는다는 것입니다. 반면에 a) 배포 및 b) 백도어에 액세스할 수 있는 일정 수준의 권한이 필요합니다. 일부 시스템에서는 동적 링커를 구성하는 ldconfig 프로그램이 lib로 시작되지 않는 한 공유 개체를 인식하지 못합니다. 이 경우 udf_example.so와 같은 파일의 이름을 libudf_example.so로 바꿈해야 합니다. 소수점 31의 소수점 값은 명시적 소수점 수 없이 선언된 FLOAT 또는 DOUBLE 열(예: FLOAT(FLOAT(10,3)이 아닌 FLOAT)와 1345E-3와 같은 부동 소수점 상수와 같은 인수에 사용됩니다. 함수 내에서 숫자 형식으로 변환될 수 있는 문자열 및 기타 비번호 인수에도 사용됩니다. 모든 플랫폼에서 공유 라이브러리 파일이 plugin_dir 디렉터리로 복사된 후 다음 명령문이 있는 새 함수에 대해 mysqld에 알립니다. 라이브러리 파일에 시스템의 .so와 다른 접미사가 있는 경우 전체(예: Windows의 .dll)에서 올바른 접미사로 대체합니다. CREATE FUNCTION 및 DROP FUNCTION 문은 UDF 레지스트리 역할을 하는 mysql 시스템 데이터베이스의 func 테이블을 업데이트합니다.

함수의 이름, 유형 및 공유 라이브러리 이름은 mysql.func 테이블에 저장됩니다. 함수를 만들려면 mysql 데이터베이스에 대한 INSERT 권한이 있어야 합니다. 함수를 삭제하려면 mysql 데이터베이스에 대한 DELETE 권한이 있어야 합니다. SQL 문에서 사용할 각 함수에 대해 해당 C(또는 C++) 함수를 정의해야 합니다. 다음 설명에서는 예제 함수 이름에 “xxx”라는 이름이 사용됩니다. SQL과 C/C++ 사용량을 구분하기 위해 XXX(대문자)는 SQL 함수 호출을 나타내고 xxx(소문자)는 C/C++ 함수 호출을 나타냅니다. 고정 소수점 수가 없는 인수의 경우 소수점 값은 31로 설정되며, 이는 소수점, FLOAT 및 DOUBLE 데이터 형식에 허용되는 최대 소수점 수보다 1 더 많은 값입니다. 이 값은 mysql_com.h 헤더 파일에서 상수 NOT_FIXED_DEC로 사용할 수 있습니다. 활성 함수는 CREATE 함수로 로드되고 DROP 함수로 제거되지 않은 함수입니다. –skip-grant-table 옵션을 사용하여 mysqld를 시작하지 않는 한 서버가 시작될 때마다 모든 활성 함수가 다시 로드됩니다. 이 경우 서버는 시작 중에 UdF를 로드하지 않으며 UdF를 사용할 수 없습니다.