[SQL] 입력 매개 변수의 개수 함수
SQL입력 매개 변수의 개수 함수
나는 그것의 입력에 따라 테이블을 업데이트하는 PostgreSQL의 DB에 저장 프로 시저 (함수)를 만드는거야. 매개 변수 기능의 변수 번호를 만들려면, 나는 내가 업데이트 쿼리에서 사용하는 매개 변수를 제어하는 데 사용할 모드라는 별도의 입력 매개 변수를 만드는거야.
CREATE OR REPLACE FUNCTION update_site(
mode integer,
name character varying,
city character varying,
telephone integer,
)
RETURNS integer AS
$$
BEGIN
IF mode = 0 THEN
BEGIN
UPDATE "Sites" SET
("City","Telephone") = (city,telephone)
WHERE "SiteName" = name;
RETURN 1;
EXCEPTION WHEN others THEN
RAISE NOTICE 'Error on site update: %, %',SQLERRM,SQLSTATE;
RETURN 0;
END;
ELSIF mode = 1 THEN
BEGIN
UPDATE "Sites" SET "City" = city
WHERE "SiteName" = name;
RETURN 1;
EXCEPTION WHEN others THEN
RAISE NOTICE 'Error on site update: %, %',SQLERRM,SQLSTATE;
RETURN 0;
END;
ELSIF mode = 2 THEN
BEGIN
UPDATE "Sites" SET "Telephone" = telephone
WHERE "SiteName" = name;
RETURN 1;
EXCEPTION WHEN others THEN
RAISE NOTICE 'Error on site update: %, %',SQLERRM,SQLSTATE;
RETURN 0;
END;
ELSE
RAISE NOTICE 'Error on site update: %, %',SQLERRM,SQLSTATE;
RETURN 0;
END IF;
END;
$$ LANGUAGE plpgsql;
가장 좋은 어떤 것입니까? 함수 update_site (<모든 테이블의 열>) 및 개별 기능 update_site (ID 정수 <업데이트에 VARCHAR 컬럼>)을 작성 또는 차이를 정의하는 하나 개의 기능의 모드를 사용합니까? 어떤 옵션이 더 효율적입니다? 하나 개의 고유 한 기능 또는 각각의 목적을 위해 다른 사람?
해결법
-
==============================
1.VARIADIC 또는 다형성 입력 유형 및 동적 SQL과 같은 고급 기능은 매우 강력하다. 이 답변의 마지막 장에서는 고급 예제를 제공합니다 :
VARIADIC 또는 다형성 입력 유형 및 동적 SQL과 같은 고급 기능은 매우 강력하다. 이 답변의 마지막 장에서는 고급 예제를 제공합니다 :
하지만 당신 같은 간단한 경우에, 당신은 단지 함수 매개 변수에 대한 기본 값을 사용할 수 있습니다. 모든 것이 정확한 요구 사항에 따라 달라집니다. 문제의 열이 모두 NOT NULL을 정의하는 경우, 이것은 아마도 간단하고 빠른 것입니다 :
CREATE OR REPLACE FUNCTION update_site(_name text -- always required , _city text DEFAULT NULL , _telephone integer DEFAULT NULL) RETURNS integer AS $func$ BEGIN IF _city IS NULL AND _telephone IS NULL THEN RAISE WARNING 'At least one value to update required!'; RETURN; -- nothing to update END IF; UPDATE "Sites" SET "City" = COALESCE(_city, "City") , "Telephone" = COALESCE(_telephone, "Telephone") WHERE "SiteName" = _name; END $func$ LANGUAGE plpgsql;
설명서의 기본값에 대해 읽어!
내가 _와 접두사 입력 매개 변수에 대한 습관을 만드는 매개 변수와 열 이름 사이에 이름 충돌을 방지하기 위해. 그 맛과 스타일의 문제입니다.
포스트 그레스 9.5 이후 :
간단한 방법은 매개 변수의 위치 표기법입니다. 이것은 단지 가장 오른쪽에있는 매개 변수 (들)을 생략 할 수 있습니다 :
SELECT update_site('foo', 'New York'); -- no telephone
명명 된 표기법은 기본값이있는 매개 변수를 생략 할 수 있습니다 :
SELECT update_site(name => 'foo', _telephone => 123); -- no city
모두 혼합 표기법으로 결합 될 수있다 :
SELECT update_site('foo', _telephone => 123); -- still no city
포스트 그레스 9.4 이상에서 : = 호출에 할당을 위해 사용되었다 :
SELECT update_site(name := 'foo', _telephone := 123); SELECT update_site('foo', _telephone := 123);
이전 버전과의 호환성을 위해 포스트 그레스 (12)에서 여전히 유효하지만, 오히려 현대 표기법을 사용합니다.
-
==============================
2.당신이 보길 원하는 것 몇 가지가 있습니다 :
당신이 보길 원하는 것 몇 가지가 있습니다 :
from https://stackoverflow.com/questions/16782199/functions-with-variable-number-of-input-parameters by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 포스트 그레스 테이블 컬럼의 디폴트 값을 얻을? (0) | 2020.05.27 |
---|---|
[SQL] SQL 서버 - 쿼리 단락? (0) | 2020.05.27 |
[SQL] 어떻게 엑셀 VBA에서 두 개의 서로 다른 데이터 소스에서 생성 된 두 개의 레코드를 가입 (0) | 2020.05.27 |
[SQL] 매개 변수를 사용하여 ASP.NET ODBC 쿼리 (0) | 2020.05.27 |
[SQL] SQL에서 지능 목록에 문자열 목록을 변환 (0) | 2020.05.27 |