<p>데이터베이스 및 테이블 생성과 저장 프로시저 생성이 포함된 SQL 스크립트를 실행하고 싶습니다.
하지만 <strong>execute sql script</strong> 키워드를 사용하여 <strong>데이터베이스 라이브러리</strong>에서 sql 스크립트를 실행하려고 하면 다음 오류가 발생합니다. </p>
<pre class="brush:php;toolbar:false;">ProgrammingError: (1064, "SQL 구문에 오류가 있습니다. 근처에서 사용할 올바른 구문은 MariaDB 서버 버전에 해당하는 설명서를 확인하세요. 'DELIMITER $$n 만들기 또는
절차 교체 `proc_GetCustomerDetails`(n I...' at line 2")</pre>
<p>저장 프로시저 앞에 다음과 같은 <strong>구분 기호</strong>가 있습니다. </p>
<pre class="brush:php;toolbar:false;">DELIMITER $$
절차 `proc_GetCustomerDetails`(
IN CustomerNbr LONGTEXT,
IN LANG VARCHAR(5)
)
결정적
시작하다
IF Lang IS NULL THEN SET lang = "fin";;
종료하면;
SELECT * dbname.customer에서;
종료;$$
DELIMITER ;</pre>
<p>저장 프로시저 부분을 주석 처리하면 SQL 파일은 나머지 테이블 생성 문과 함께 오류 없이 실행됩니다. </p>
<p>Google에서 검색했는데 관련 질문을 찾지 못했습니다. 저장 프로시저를 호출하는 키워드가 있는 것을 확인했습니다. 하지만 테이블 생성과 저장 프로시저를 동일한 SQL 파일에 넣고 실행하고 싶습니다. 이 작업에는 MariaDB를 사용하고 있습니다. </p>
<p><strong>사용된 라이브러리</strong>: </p>
<li>pymysql</li>
- 로봇 프레임워크 데이터베이스 라이브러리
</ul>
<p>HeidiSQL을 사용하여 SQL 파일을 실행하면 저장 프로시저와 구분 기호 내에서 오류 없이 실행됩니다. 이는 SQL 오류가 없음을 의미합니다. </p>
<p><strong>이 문제를 해결하는 방법을 알려줄 수 있는 사람이 있나요? </strong></p>
DELIMITER는 클라이언트 전용 문이며 서버가 이를 지원하지 않으므로 오류가 발생합니다. 해결 방법 - 삭제하세요.
여기 DELIMITER가 무엇이고 왜 필요한지 설명하는 매우 좋은 답변이 있는 질문이 있습니다.
간단히 말하면, 클라이언트와 작업할 때 "이것은 즉시 실행될 명령문이 아니며 서버에 보낼 저장 프로시저의 한 줄일 뿐입니다"라고 표시하는 방법이 필요합니다. 따라서 (클라이언트) "문 사이의 DELIMITER는 일시적으로 $$입니다"라고 말합니다. 서버는 이에 대해 필요/관심하지 않습니다. 서버는
CREATE PROCEDURE, BEGIN, END
사이의 모든 것이 연결된 문, 즉 블록이라는 것을 알고 있습니다.API(pymysql)를 통해 데이터베이스에 연결하는 경우 대화형 클라이언트(shell, heidisql 등)와 비교할 때 SP를 청크로 전송하며 해당 명령문을 하나씩 실행할 방법이 없으므로 DELIMITER는 사용할 수 없습니다. 필요합니다. 서버는 이 명령을 지원하지 않으며 오류를 생성합니다. 삭제하세요.