>  기사  >  데이터 베이스  >  Mysql에서 커스텀 함수 생성 및 실행 방법은 무엇입니까?

Mysql에서 커스텀 함수 생성 및 실행 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-04-17 16:07:031477검색

    Mysql 사용자 정의 함수 생성 및 실행

    학생 테이블에 id와 name이라는 두 개의 필드가 있다고 가정하고 함수의 기능은 id를 기반으로 이름을 찾는 것입니다

    1. 테이블 및 데이터 삽입

    create table students(id int,name varchar(100));
    insert into students(id,name) values(1,'annie'),(2,'bell'),(3,'danny');

    2. 함수 생성 시 주의 사항

    DELIMITER //
    create function find_student(id int) returns varchar(100)
    READS SQL DATA
    begin
        declare sname varchar(100) default '';
        select students.name into sname from students where students.id=id;
        return sname;
    end //
    DELIMITER ;

    :

    1) 구분 기호를 수정하려면 DELIMITER//를 사용하세요.

    MySQL의 기본 명령문 끝 기호는 세미콜론입니다. , 현재 명령문을 자동으로 실행합니다. 함수 정의에는 여러 개의 SQL 문이 포함되어 있으므로 먼저 DELIMITER //를 사용하여 구분 기호를 //로 설정한 다음, 함수 생성 문이 완료된 후 구분 기호를 다시 세미콜론으로 변경하세요.

    2) READS SQL DATA

    이 문장을 이전에 작성하지 않았지만 mysql이 문장을 생성할 때 오류를 보고하여 오류 코드: 1418이 표시되었습니다. 이 함수에는 DETERMINISTIC, NO SQL 또는 READS SQL DATA가 없습니다. (덜 안전한 log_bin_trust_function_creators 변수를 사용하고 싶을 수도 있습니다)

    온라인으로 확인했는데, 이는 mysql 함수 유형이 선언되지 않았음을 의미합니다.

    mysql에 bin-log가 활성화되어 있으므로 반드시 함수 유형이 무엇인지 지정합니다.

    • 1 DETERMINISTIC Uncertain

    • 2 NO SQL SQL 문은 없으며 물론 데이터를 수정하지 않습니다.

    • 3 READS SQL DATA 물론 데이터는 수정되지 않습니다.

    • 4 MODIFIES SQL DATA 데이터를 수정하려면

    • 5 CONTAINS SQL에 SQL 문이 포함되어 있습니다

    • 그래서 READS SQL DATA를 추가했습니다

    3) 지역 변수 사용

    변수 정의: 선언 sname varchar(100) 기본값 ‘’;을 사용하여 지역 변수 sname을 정의합니다.

    변수 사용법:

    학생의 sname에 select Students.name을 사용할 수 있습니다. 여기서 Students.id=id; 변수에 값을 할당합니다.

    set sname=‘test’

    3과 같이 set 문을 직접 사용하여 함수를 실행할 수도 있습니다. );

    select find_student(3);

    Mysql 커스텀 함수 생성 실패 문제

    사례

    현재 프로젝트에서 mysql을 생성한 함수 실행 시 오류가 발생했습니다. mysql 생성 함수에 대한 오류 메시지는 다음과 같습니다.

    원인: java.sql.SQLException: 이 함수의 선언에는 DETERMINISTIC, NO SQL 또는 READS SQL DATA가 없으며 바이너리 로깅이 활성화되어 있습니다(com.mysql.jdbc에서 덜 안전한 log_bin_trust_function_creators 변수를 *사용하고 싶을 수도 있습니다)
    . SQLError.createSQLException(SQLError.java:965)

    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
    at com. mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2373)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2739)
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440)
    com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl. java:845)
    com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
    .. 35 more

    이는 log_bin_trust_function_creators의 기본값이 0이기 때문입니다. 이는 기능 동기화를 허용하지 않습니다. 이 매개변수가 켜져 있으면 생성이 성공합니다.

    활성화 여부 확인:

    show variables like '%func%';
    +---------------------------------+-------+ 
    | Variable_name     | Value | 
    +---------------------------------+-------+ 
    | log_bin_trust_function_creators | ON | 
    +---------------------------------+-------+ 
    1 row in set (0.00 sec)

    활성화되어 있으면 활성화된 것입니다.

    set global log_bin_trust_function_creators = 1;

    는 이 명령을 통해 설정할 수 있지만 MySQL을 다시 시작한 후에는 유효하지 않게 됩니다.

    마지막 단계는 MySQL 데이터베이스 구성 파일을 수정하는 것입니다.

    구성 파일 /etc/my.cnf

    Mysql에서 커스텀 함수 생성 및 실행 방법은 무엇입니까?수정 후 MySQL을 다시 시작하려면 [mysqld]에서 log_bin_trust_function_creators=1을 구성하세요.

    위 내용은 Mysql에서 커스텀 함수 생성 및 실행 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제