복붙노트

[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. ==============================

    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. ==============================

    2.당신이 보길 원하는 것 몇 가지가 있습니다 :

    당신이 보길 원하는 것 몇 가지가 있습니다 :

  3. from https://stackoverflow.com/questions/16782199/functions-with-variable-number-of-input-parameters by cc-by-sa and MIT license