복붙노트

[SQL] 그것은 MySQL의 저장 프로 시저에 대한 기본 매개 변수를 가질 수 있습니까?

SQL

그것은 MySQL의 저장 프로 시저에 대한 기본 매개 변수를 가질 수 있습니까?

나는이를 봤와 "아니, 할 수없는"하지만이 변경된 경우 내가 궁금하네요 그래서 이러한 게시물 2,005에서 2,007 사이 일자하고 함께 올라오고 계속했다. 코드 예제 :

CREATE PROCEDURE `blah`
(
  myDefaultParam int = 0 -- This breaks the code for some reason
)
BEGIN
  -- Do something here
END

된 해결책 중 하나는, 널을 통과하고 널 확인하고, 변수를 설정하고있다. 나는 그렇게하고 싶지 않아 내가 할 필요가 없습니다. 이것이 사실이라면 다음 MySQL의 DEVS는 훨씬 더 내가 MSSQL과 함께 할 수 있기 때문에 깨어해야합니다.

해결법

  1. ==============================

    1.아직 수 없습니다.

    아직 수 없습니다.

  2. ==============================

    2.우리는 저장 프로 시저에 문 IF 간단한을 추가하여이 제한을 회피. 우리는 DB의 기본 값을 저장할 때마다 실제적으로 우리는 빈 문자열을 전달합니다.

    우리는 저장 프로 시저에 문 IF 간단한을 추가하여이 제한을 회피. 우리는 DB의 기본 값을 저장할 때마다 실제적으로 우리는 빈 문자열을 전달합니다.

    CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40))
    BEGIN
      IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF;
    
      ...your code here...
    END
    
  3. ==============================

    3.

    SET myParam = IFNULL(myParam, 0);
    

    설명 : ISNULL (식 1, 식 2)

    expression_1 null가 아닌 경우, IFNULL 함수 반환 expression_1; 그렇지 않으면 expression_2를 반환합니다. IFNULL 함수는 문자열이나가 사용되는 상황에 따라 숫자를 반환합니다.

  4. ==============================

    4.당신이 들여다 경우 해당 프로 시저 매개 변수는 IN / OUT / INOUT 지정자, 매개 변수 이름과 유형을 포함 할 수 있습니다 볼 수 있습니다 최신 MySQL 버전에 대한 절차 구문을 만들 수 있습니다.

    당신이 들여다 경우 해당 프로 시저 매개 변수는 IN / OUT / INOUT 지정자, 매개 변수 이름과 유형을 포함 할 수 있습니다 볼 수 있습니다 최신 MySQL 버전에 대한 절차 구문을 만들 수 있습니다.

    따라서, 기본 값은 여전히 ​​최신 MySQL 버전에서 사용할 수 없습니다.

  5. ==============================

    5.불행하게도, MySQL은 그래서, 기본 매개 변수 값을 지원하지 않습니다

    불행하게도, MySQL은 그래서, 기본 매개 변수 값을 지원하지 않습니다

    CREATE PROCEDURE `blah`
    (
      myDefaultParam int DEFAULT 0
    )
    BEGIN
      -- Do something here
    END
    

    오류가 반환 :

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
    that corresponds to your MySQL server version for the right syntax to use 
    near 'DEFAULT 0) BEGIN END' at line 3
    

    이 문제를 해결하려면 단순히 추가 절차를 만드는 것이 원래 절차에 할당 기본값 :

    DELIMITER //
    
    DROP PROCEDURE IF EXISTS blah//
    DROP PROCEDURE IF EXISTS blah2//
    DROP PROCEDURE IF EXISTS blah1//
    DROP PROCEDURE IF EXISTS blah0//
    
    CREATE PROCEDURE blah(param1 INT UNSIGNED, param2 INT UNSIGNED)
    BEGIN
        SELECT param1, param2;
    END;
    //
    
    CREATE PROCEDURE blah2(param1 INT UNSIGNED, param2 INT UNSIGNED)
    BEGIN
        CALL blah(param1, param2);
    END;
    //
    
    CREATE PROCEDURE blah1(param1 INT UNSIGNED)
    BEGIN
        CALL blah2(param1, 3);
    END;
    //
    
    CREATE PROCEDURE blah0()
    BEGIN
        CALL blah1(4);
    END;
    //
    

    그런 다음이 실행 :

    CALL blah(1, 1);
    CALL blah2(2, 2);
    CALL blah1(3);
    CALL blah0();
    

    반환합니다 :

    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      1 |      1 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      2 |      2 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      3 |      3 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      4 |      3 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    

    당신이 ㅋ () 프로 시저에 세 번째 매개 변수를 추가 할 때 당신이해야합니다 경우에만 () 절차 blah2 (), blah1 ()와 blah0를 사용하여 코드를 즉시 업데이트 할 필요가 없습니다.

  6. ==============================

    6.아니,이 MySQL을 저장 루틴 구문에서 지원되지 않습니다.

    아니,이 MySQL을 저장 루틴 구문에서 지원되지 않습니다.

    bugs.mysql.com에 기능 요청을 제출하여 주시기 바랍니다.

  7. from https://stackoverflow.com/questions/982798/is-it-possible-to-have-a-default-parameter-for-a-mysql-stored-procedure by cc-by-sa and MIT license