문제

지난 며칠 동안 나는 MySQL에 저장된 절차를 작성하려고 시도했으며 작동하게하는 진정으로 약간의 진정이 있습니다. 여기 누군가가 나에게 약간의 입력을 줄 수 있기를 바랍니다 :)

내가 게시 한 예제는 ASP.NET 멤버십 제공 업체가 새 사용자를 생성하는 것입니다. DB에 이메일과 비밀번호를 보내고 int 리턴을 얻을 수 있도록 userDeatils가 DB에 기록되었는지 확인합니다.

MySQL DB 5.1 (생각합니다)을 사용하고 SQL을 WebInterface에 씁니다.

나는 2 개의 부수적 인 질문을 받았다. 누군가가 그것을 설명 할 수 있습니까? :) : 1) 나는 구분기를 사용하지만 그것이 무엇을하는지 모릅니다. 2) 다른 일을 해야하는지 확실하지 않습니다. 그런 다음 autocommit = 0을 설정하여 거래를 시작하거나 그렇게 해야하는지 확실하지 않습니다.

나는 거래 대신 if / else 문을 사용할 수 있었지만 그것이 어떻게 작동하는지 알아 내기 위해 그것을하고 싶습니다. (나중에 그것을 많이 사용할 것으로 기대합니다)

작동 할 수없는 코드 :

DELIMITER //

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;
    DECLARE return_value INT;

    BEGIN TRY
        START TRANSACTION
                INSERT INTO User 
                (Email
                ,Password
                ,Failed_Password_Count
                ,Creation_Date)
                VALUES
                (_username
                ,_Password
                ,0
                ,Datetime.Now())
            SET return_value = 1;
        COMMIT;
    END TRY

    BEGIN CATCH
        ROLLBACK
        SET return_value = 0;
    END CATCH

    BEGIN FINALLY
    RETURN return_value;
    END FINALLY 
    END//
DELIMITER ;

편집 : 내가 얻는 오류 메시지는 다음과 같습니다.

1064- SQL 구문에 오류가 있습니다. 오른쪽 구문이 'int 시작 세트 autocommit = 0에 사용하려면 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. return_value int를 선언합니다. '4 행에서

올바른 솔루션이 없습니다

다른 팁

트랜잭션을 지원하려면 기본 MyISAM 대신 InnoDB 저장 엔진을 사용하고 있는지 확인하십시오.

그 코드 자체에 관한 한, 나의 첫 번째 질문은 왜 트랜잭션에서 그 단일 쿼리를 래핑 하는가? 또한 어떤 오류 가보고 있습니까?

Delimiter는 SQL 문을 종료하기 위해 사용하는 일련의 문자 순서를 재정의합니다. 전체 생성 절차는 하나의 큰 진술이며 MySQL에 무언가로 끝나는 곳 (일반적으로 ';')으로 끝나는 곳을 알려야합니다. 그러나 당신은 생성 절차 진술서의 "몸"(시작과 끝 사이)에 다른 모든 진술이 있으므로 모든 것이 종료 될 필요가 있다는 구분기를 재정의해야한다는 말을 재정의해야합니다. 첫 번째 ';'.

Delimiter를 재정의하지 않고 MySQL은 Create Procedure 문이 다음과 같이 보였다고 생각한 다음 새로운 진술을 시작합니다.

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;

구분자 사용; 스크립트가 끝나면 구분 기호를 다시 ';'로 변경합니다. 그리고 그렇게하는 것이 좋은 관행이지만 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top