반응형
Laravel 마이그레이션을 통해 mysql/mariaDB 함수를 사용할 수 없습니다.
mysql 저장 함수를 생성하려고 합니다.
DROP FUNCTION IF EXISTS getDistance;
DELIMITER $$
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE distance varchar(255);
SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
if(distance is null) then
return null;
else
return distance;
end if;
END
$$
DELIMITER ;
phpMyAdmin을 통해 함수를 실행하면 잘 작동하고 데이터베이스에 함수가 생성됩니다.
그러나 저장된 기능을 만들기 위해 Laravel(v6.x) 마이그레이션을 실행하려고 하면 오류가 발생합니다.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStoredFunction extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared('
DROP FUNCTION IF EXISTS getDistance;
DELIMITER $$
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE distance varchar(255);
SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
if(distance is null) then
return null;
else
return distance;
end if;
END
$$
DELIMITER ;
');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP FUNCTION IF EXISTS getDistance');
}
}
오류
독트린DBAL\드라이버\PDO\Exception::("SQLSTATE[42000]:구문 오류 또는 액세스 위반: 1064 SQL 구문에 오류가 있습니다. 'DELIMITER $$ CREATE FUNCTION' 근처에서 사용할 올바른 구문은 MariaDB 서버 버전에 해당하는 설명서를 확인하십시오.
getDistance
(lat1
VARCHAR(255), '1행')
DELIMITER
올바른 SQL 문이 아닙니다.MySql 클라이언트 명령어입니다.그러니까 그냥 사용하지 마세요.당신이 받는 오류는 정확히 그것을 말해줍니다.
다음과 같이 Laravel에서 저장 프로시저를 만들 수 있습니다. 그러면 다음과 같이 렌더링됩니다.DELIMITER
시대에 뒤떨어진
사용해 보세요.
class CreateStoredFunction extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared('
DROP FUNCTION IF EXISTS getDistance;
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE distance varchar(255);
SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
if(distance is null) then
return null;
else
return distance;
end if;
END
');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP FUNCTION IF EXISTS getDistance');
}
}
언급URL : https://stackoverflow.com/questions/66780769/unable-to-mysql-mariadb-function-through-laravel-migrations
반응형
'programing' 카테고리의 다른 글
DataGrip: Oracle에 SYSDBA로 연결하는 방법 (0) | 2023.06.08 |
---|---|
R에서 언어 설정을 변경하는 방법 (0) | 2023.06.08 |
JAGS에서 '계수 프로세스' 형태로 파라메트릭 생존 모델 표현 (0) | 2023.06.08 |
종속성 속성.등록() 또는 .첨부() 등록 (0) | 2023.06.03 |
xact_abort가 켜져 있을 때 raise 오류가 발생한 후 SQL Server가 계속 실행되는 이유는 무엇입니까? (0) | 2023.06.03 |