"저장 프로 시저"와 "저장 함수"의 차이점은 무엇입니까?


36

따라서이 질문에 대한 의견은 PostgreSQL의 "Stored Procedrues"와 "Stored Funtions"에 약간의 차이가 있다고 언급합니다.

주석은 위키피디아 기사로 연결 되지만이 중 일부는 적용되지 않는 것 같습니다 (예 : SELECT문장 에서 사용될 수 있음 ).

구문 자체는 조금 혼란 것 같다 :

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

을 만들지 FUNCTION만이라고합니다 PROCEDURE.

이 둘의 차이점은 무엇입니까?

답변:


43

공식적으로 PostgreSQL에는 "기능"만 있습니다. 트리거 기능을 "트리거 프로 시저"라고도하지만 그 사용법은 별개의 의미가 없습니다. 내부적으로 기능은 시스템 카탈로그와 같은 절차라고도합니다 pg_proc. PostQUEL의 인수입니다. 일부 사람들 (다른 데이터베이스 시스템에서 경험이있을 수 있음)은 SQL 삽입 방지와 관련된 절차 또는 출력 매개 변수 사용과 같은 프로 시저와 연관 될 수있는 기능은 PostgreSQL에있는 기능에도 적용됩니다.

그러나 PostgreSQL 커뮤니티의 사람들이 "저장 프로 시저"또는 "실제 저장 프로 시저"에 대해 이야기 할 때, 종종 본문에서 트랜잭션을 시작하고 중지 할 수있는 함수와 유사한 객체의 가상 기능을 의미합니다. 해야 할 것. 이 문맥에서 "저장 프로 시저"라는 용어는 다른 데이터베이스 제품과 유사하게 사용됩니다. 모호한 아이디어는 이 메일 링 목록 스레드를 참조하십시오 .

그러나 실제로 트랜잭션 제어 기능 측면에서 기능 대 프로 시저의 구별은 보편적으로 받아 들여지지 않으며 데이터베이스 바이어스가없는 많은 프로그래머는 반환 값이없는 함수로 프로 시저를 파스칼과 같은 해석을 수행하게됩니다. (SQL 표준은 기본적으로 프로 시저가 함수와 다른 트랜잭션 동작을 가지고 있다는 점에서 중간 단계를 차지하는 것으로 보이지만, 이는 오브젝트마다 조정할 수 있습니다.) 따라서, 특히, Exchange와 함께 질문을 볼 때 청중이 너무 많으면 너무 많이 가정하지 말고 더 명확한 용어를 사용하거나 예상되는 속성을 정의해야합니다.


14

DDL 측면에서 Postgres에는 프로 시저 객체가 없으며 기능 만 있습니다. Postgres 함수는 다른 RDBMS에서 함수와 프로 시저의 역할을 수행하므로 값을 반환하거나 무효화 할 수 있습니다. '프로 시저'라는 단어 create trigger는 기능을 나타냅니다.

Postgres 문서에서 'procedure'는 함수라고하는 데이터베이스 객체의 동의어입니다. 예 : " 트리거 프로시 저는 CREATE FUNCTION 명령으로 작성됩니다 ."

트리거 '프로 시저'에는 특정 규칙 이 있습니다 . 인수가없고 함수의 반환 유형이있는 함수선언 해야합니다 . 여기에 예가 있습니다 .


8

"저장 프로 시저"와 "저장 함수"라는 용어는 PostgreSQL에서 상호 교환 적으로 사용되며 일반적으로 동일한 것을 의미합니다. 다른 데이터베이스는 프로 시저와 함수를 구별 할 수 있습니다 (VB가 서브 루틴과 함수를 구별하는 방식과 유사).

PostgreSQL의 함수가 테이블과 유사한 것을 반환하는 한 해당 함수의 출력을 표준 테이블 인 것처럼 사용할 수 있습니다. 이 CREATE TRIGGER구문은 약간 혼란 스럽지만 ANSI 표준이 완성되기 전에 구문이 제대로 작동하지 않은 것 같습니다. SQL : 2003의 사본 만 가지고 있으므로 명명법이 왜 이상한지 추측하는 것 이상을 할 수 없습니다.

TL; DR 버전 : PostgreSQL에서 "procedure"는 "function"과 같습니다.


6

MSSQL에서 저장 프로시 저는 미리 컴파일 된 sql 명령 집합입니다.
저장 프로 시저 :

 -많은 입력 및 출력 매개 변수를 가질 수 있습니다
 -데이터베이스 테이블 / 구조 / 데이터를 수정하는 데 사용할 수 있습니다
 -일반적으로 insert / update / delete / select 문에서 사용되지 않습니다
사용자 정의 함수는 여러 가지 형태로 제공됩니다. 작성된 함수의 유형에 따라 함수는 다음과 같습니다.
  -여러 입력 매개 변수를 가질 수 있지만 단일 값만 반환합니다 (예 : 문자열 연결)
  -집합을 입력으로 받아들이고 단일 값을 반환 할 수 있습니다 (예 : dbo.FindLargestPig (ListOfPigs))
  -표를 반환합니다 (예 : dbo.ExplodeString ( "this is a list of words")).
  -select / insert / update / delete 문에서 사용할 수 있습니다
  -데이터베이스 테이블 / 구조 / 데이터를 수정하는 데 사용할 수 없습니다


5

짧은 대답은 함수가 값을 반환하지만 프로시 저는 반환하지 않는다는 것입니다.

이러한 차이점은 SQL 1992에 제안 된 Persistent Stored Modules (SQL / PSM)에 존재했습니다. SQL / PSM이이를 표준으로 만들 었는지 모르겠습니다.


2003 년까지 믿는다
xenoterracide

VB의 구문과 매우 흡사합니다. 함수는 값을 리턴하고 프로시 저는 리턴하지 않습니다 (따라서 함수에 리턴 값이 있으면 컴파일러에서 폭발 할 것입니다)
jcolebrand

@jcolebrand 사실, 그 이름은 파스칼에서 더 분명합니다. 함수 는 결과를 반환 하지만 프로시 저는 결과를 반환하지 않습니다 . 역사적 이유로 VBA는 FORTRAN 언어를 사용합니다.이 언어는 SUBROUTINE & FUNCTION이라고 합니다. 현대의 C 형 언어에는 함수가 있지만 형식화 된 언어에는 다른 이름의 프로 시저 인 void 함수 옵션이 있습니다. 인기있는 트렌드는 모든 것에 일반 함수를 사용하고 원한다면 무시할 수있는 것을 반환하는 것입니다.
Manngo 2013

2

추상적 인 개념 수준에서 받아 들여진 대답을 비교하면서 기능 및 입력 / 출력 관점과의 차이점을 이해합니다. 아래에서는 sp와 f를 사용하여 저장 프로 시저와 함수를 각각 나타 냈습니다.

  1. 표현식에서 사용 : sp는 표현식에서 사용할 수 없지만 함수는 can에서 사용할 수 있습니다. 이는 다른 명령문에서 af의 리턴 값을 사용할 수 있음을 의미합니다.

    select * 
    from table 
    where col_a < (select col_A from f())
  2. 값 반환 : refcursor 반환 유형 을 지정 하고 커서를 열고 반환 하지 않으면 sp는 자동으로 값을 반환하지 않습니다 . f는 select 절 과 같이 'return'절이 포함 된 마지막 명령문의 결과를 리턴합니다 .

  3. 단일 / 복수 결과 ​​집합 반환 : 결과 집합은 단일 정수, 텍스트 배열 및 두 테이블 집합과 같이 형식이 다를 수있는 결과 목록을 나타냅니다. sp는 리 커서 리턴 유형을 지정하고 커서를 열고 리턴하는 한 여러 세트를 리턴 할 수 있습니다. 그러나 f는 한 가지 유형의 집합 만 반환 할 수 있습니다.

일반적으로 저장 프로시 저는 삭제, 업데이트, 삭제 등과 같이 반환 값이 필요하지 않은 데이터베이스 데이터 또는 구조를 수정하는 데 사용됩니다 . 또는 여러 결과 집합이 필요한 상황. 반면에 기능은 대부분 일반 쿼리에 대해 선택됩니다.

내 설명에 대한 자세한 내용 은 PostgreSQL의 저장 프로 시저 및 함수 링크를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.