programing tip

mysql 저장 프로 시저에 대한 기본 매개 변수를 가질 수 있습니까?

itbloger 2020. 11. 20. 08:41
반응형

mysql 저장 프로 시저에 대한 기본 매개 변수를 가질 수 있습니까?


나는 이것을 구글 검색하고 "아니오 그것은 불가능하다"라고 계속해서 나오지만이 게시물은 2005-2007 년 날짜이므로 이것이 변경되었는지 궁금합니다. 코드 예 :

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

해결책 중 하나는 null을 전달한 다음 null을 확인하고 변수를 설정하는 것입니다. 나는 그렇게하고 싶지 않으며 그렇게 할 필요도 없습니다. 이것이 사실이라면 MySql 개발자는 MSSQL로 할 수있는 일이 훨씬 더 많기 때문에 깨어나야합니다.


여전히 불가능합니다.


저장 프로 시저에 간단한 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

SET myParam = IFNULL(myParam, 0);

설명: IFNULL(expression_1, expression_2)

IFNULL기능을 반환 expression_1하는 경우 expression_1되지 않습니다 NULL; 그렇지 않으면을 반환합니다 expression_2. IFNULL함수는 사용되는 컨텍스트에 따라 문자열 또는 숫자를 반환합니다.


최신 MySQL 버전에 대한 CREATE PROCEDURE 구문살펴보면 프로 시저 매개 변수가 IN / OUT / INOUT 지정자, 매개 변수 이름 및 유형 만 포함 할 수 있음을 알 수 있습니다.

따라서 최신 MySQL 버전에서는 기본값을 사용할 수 없습니다.


안타깝게도 MySQL은 DEFAULT매개 변수 값을 지원하지 않으므로 다음과 같습니다.

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)

Then, if you make sure to only use the blah2(), blah1() and blah0() procedures, your code will not need to be immediately updated, when you add a third parameter to the blah() procedure.


No, this is not supported in MySQL stored routine syntax.

Feel free to submit a feature request at bugs.mysql.com.

참고URL : https://stackoverflow.com/questions/982798/is-it-possible-to-have-a-default-parameter-for-a-mysql-stored-procedure

반응형