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.
'programing tip' 카테고리의 다른 글
Django REST Framework에서 CORS를 활성화하려면 어떻게해야합니까? (0) | 2020.11.20 |
---|---|
인수에 대한 android () 메소드를 찾을 수 없습니다. (0) | 2020.11.20 |
SSH를 통해 파일을 어떻게 편집합니까? (0) | 2020.11.20 |
Rails의 열 이름 별칭 (0) | 2020.11.20 |
알파벳의 모든 문자 배열을 생성하는 더 나은 방법 (0) | 2020.11.19 |