[또는 교체] 함수 만들기이름([[argmode] [argname]Argtype[기본값 | =default_expr] [, ...]])) [반환rettype| 반환 테이블 (column_name column_type[, ...])] 언어lang_name| 창문 | 불변 | 안정 | 휘발성 물질 | 널 입력 | NULL 입력에서 NULL을 반환합니다 | 엄격한 | [외부] 보안 개요 | [외부] 보안 정의기 | 비용execution_cost| 줄result_rows| 세트configuration_parametertovalue| =value| 현재 | 처럼 '정의' | 처럼 'OBJ_FILE','link_symbol' ... [ 와 함께 (속성[, ...])
함수 만들기새를 정의합니다 기능.함수 생성 또는 교체새 함수를 만들거나 기존을 교체합니다. 정의. 함수를 정의하려면 사용자는 그만큼usage언어에 대한 특권.
스키마 이름이 포함되면 함수가 지정된 스키마. 그렇지 않으면 전류에서 생성됩니다 개요. 새 함수의 이름은 기존과 일치하지 않아야합니다. 동일한 스키마에서 동일한 입력 인수 유형으로 기능합니다. 그러나 다른 인수 유형의 기능은 이름을 공유 할 수 있습니다. (이것은라고합니다.과부하).
기존 함수의 현재 정의를 대체하려면 사용함수 생성 또는 교체. 그렇지 않습니다 기능의 이름 또는 인수 유형을 변경할 수 있습니다. 방법 (시도했다면 실제로 새롭고 뚜렷한 것을 만들 것입니다. 기능). 또한,생성 또는 교체 배트맨 토토반환 유형을 변경할 수 없습니다. 기존 배트맨 토토. 그렇게하려면, 당신은 그것을 떨어 뜨리고 재현해야합니다 배트맨 토토. (사용시out매개 변수, 그것은 당신이 어떤 유형의 유형을 변경할 수 없다는 것을 의미합니다out삭제를 제외한 매개 변수 배트맨 토토.)
언제함수 생성 또는 교체IS 기존 기능, 소유권을 대체하는 데 사용됩니다 함수의 권한은 변경되지 않습니다. 다른 모든 기능 속성은 명령. 교체 할 기능을 소유해야합니다 (여기에는 포함됩니다. 소유 역할의 구성원이되기).
삭제 한 다음 함수를 재현하면 새로운 배트맨 토토은 다음과 같습니다. 오래된 것과 같은 실체가 아닙니다. 기존을 떨어 뜨려야합니다 기존 함수를 나타내는 규칙,보기, 트리거 등. 사용함수 생성 또는 교체변경하려면 a 기능 정의는 기능. 또한,Alter Function할 수 있습니다 기존의 보조 속성의 대부분을 변경하는 데 사용됩니다. 기능.
함수를 생성하는 사용자는 배트맨 토토.
함수의 이름 (선택적으로 스키마 자격) 만들려면.
인수의 모드 :in, out, inout또는variadic. 생략하면 기본값은입니다.in. 오직out인수는 A를 따를 수 있습니다variadic하나. 또한,outandinout인수는와 함께 사용할 수 없습니다.테이블 리턴표기법.
인수의 이름. 일부 언어 (포함 PL/PGSQL이지만 현재 SQL이 아님) 기능 본문. 다른 언어의 경우 입력 이름입니다 인수는 단지 여분의 문서 일뿐입니다 기능 자체에 관한 것입니다. 그러나 입력을 사용할 수 있습니다 기능을 호출 할 때 인수 이름 가독성 (참조섹션 4.3). 어느 쪽이든 사례, 출력 인수의 이름은 중요합니다. 결과 행 유형에서 열 이름을 정의하기 때문입니다. (출력 인수의 이름을 생략하면 시스템 기본 열 이름을 선택합니다.)
함수 인수의 데이터 유형 (선택적으로 스키마 자격). 인수 유형은 기본이 될 수 있으며 복합 또는 도메인 유형 또는 유형을 참조 할 수 있습니다. 테이블 열.
구현 언어에 따라도 지정할 수 있도록 허용"pseudotypes"와 같은cstring. 유사 형은 실제임을 나타냅니다 인수 유형은 불완전하게 지정되거나 외부입니다 일반 SQL 데이터 유형 세트.
열의 유형은 서면으로 참조됩니다table_name.column_name%유형. 이것을 사용합니다 기능은 때때로 기능을 독립적으로 만드는 데 도움이 될 수 있습니다 표의 정의 변경.
매개 변수는 지정되지 않았습니다. 표현은해야합니다 매개 변수의 인수 유형에 강요됩니다. 입력 만 (포함inout) 매개 변수는 할 수 있습니다 기본값이 있습니다. 다음의 모든 입력 매개 변수 기본값을 가진 매개 변수는 다음과 같은 기본값을 가져야합니다. 잘.
반환 데이터 유형 (선택적으로 스키마 자격). 그만큼 반환 유형은 기본, 복합재 또는 도메인 유형 일 수 있습니다. 테이블 열의 유형을 참조 할 수 있습니다. 에 따라 구현 언어는 지정할 수 있습니다"pseudotypes"와 같은cstring. 배트맨 토토이 예정되어 있지 않은 경우 값을 반환하고 지정void반환 유형.
있을 때out또는inout매개 변수,반환절을 생략 할 수 있습니다. 존재하는 경우 출력이 암시하는 결과 유형에 동의해야합니다. 매개 변수 :레코드다중 출력 매개 변수 또는 단일과 동일한 유형 출력 매개 변수.
thesetof수정자가 나타납니다 함수가 단일 항목.
열의 유형은 서면으로 참조됩니다table_name.column_name%유형.
의 출력 열의 이름테이블 리턴구문. 이것은 효과적입니다 이름을 선언하는 또 다른 방법out매개 변수를 제외하고반환 테이블또한 암시setof return.
의 출력 열의 데이터 유형테이블 리턴구문.
함수의 언어 이름 구현.SQL, C, 내부또는 사용자 정의의 이름 절차 언어. 뒤로 호환성을 위해 이름입니다 단일 따옴표로 동봉 할 수 있습니다.
창함수는창 함수평범한 배트맨 토토이 아닌. 이것은 현재 유용합니다 C에서 작성된 배트맨 토토의 경우창속성을 변경할 수 없습니다 기존 기능 정의 교체.
이 속성은 쿼리 최적화에 대해 알립니다 기능의 동작. 최대 하나의 선택이 될 수 있습니다 지정되었습니다. 이 중 어느 것도 나타나지 않으면휘발성기본 가정입니다.
불변함수는 데이터베이스를 수정할 수 없으며 항상 반환합니다 동일한 인수 값이 주어지면 동일한 결과; 즉, 데이터베이스 조회 또는 사용하지 않습니다 정보는 인수 목록에 직접 표시되지 않습니다. 만약에 이 옵션은 다음과 같은 기능을 호출합니다. 모든 논쟁의 인수는 즉시 대체 될 수 있습니다 함수 값.
안정적인함수는 데이터베이스를 수정할 수 없으며 a
단일 테이블 스캔은 지속적으로 동일하게 반환합니다
동일한 인수 값에 대한 결과이지만 그 결과
SQL 문에서 변경 될 수 있습니다. 이것은 적절합니다
결과가 데이터베이스에 의존하는 함수 선택
조회, 매개 변수 (예 : 현재 시간)
Zone) 등 (그것은 부적절합니다이후행을 쿼리하려는 트리거
현재 명령에 의해 수정되었습니다.) 또한 또한current_timestamp
가족
배트맨 토토은 값이 그렇지 않기 때문에 안정적으로 자격이 있습니다
거래 내에서 변경.
휘발성단일 테이블 스캔에서도 기능 값이 변경 될 수 있습니다. 따라서 최적화를 할 수 없습니다. 비교적 적은 데이터베이스 이런 의미에서 기능은 휘발성입니다. 몇 가지 예는입니다.random (), currval (), TimeOfday (). 그러나 어떤 기능이든 주목하십시오 부작용은 부작용이 휘발성이 있어도 분류되어야합니다 결과는 통화를 방지하기 위해 예측 가능합니다 최적화; 예는입니다.setVal ().
자세한 내용은 참조하십시오.섹션 35.6.
NULL 입력을 호출( 기본값)는 함수가 호출 될 것임을 나타냅니다 일반적으로 일부 논쟁이 무인 상태 일 때. 그때입니다 NULL을 확인하는 배트맨 토토 저자의 책임 필요한 경우 가치와 적절하게 응답합니다.
null 입력에서 null을 반환또는엄격한함수를 나타냅니다 인수가 무효 일 때마다 항상 널을 반환합니다. 이 매개 변수가 지정되면 함수는 그렇지 않습니다 널 주장이있을 때 실행; 대신 널 결과는 자동으로 가정됩니다.
Security Invoker배트맨 토토은 그것을 호출하는 사용자. 그것은 기본입니다.보안 정의기함수를 지정합니다 사용자의 권한으로 실행해야합니다. 그것을 만들었습니다.
키워드외부IS SQL 적합성을 허용하지만 그 이후로 선택 사항입니다. SQL과 달리이 기능은 모든 기능에 적용됩니다. 외부의 외부.
예상 실행 비용을 제공하는 양수 함수의 경우 단위cpu_operator_cost. 함수가 세트를 반환하는 경우 이것은 당 비용입니다. 반환 된 행. 비용이 지정되지 않은 경우 1 단위입니다 C- 언어 및 내부 기능으로 가정하고 100 다른 모든 언어의 기능 단위. 더 큰 값 플래너가 기능 평가를 피하려고 시도합니다. 필요한 것보다 더 자주.
추정 수의 행을 제공하는 양수 플래너는 기능이 반환 될 것으로 예상해야합니다. 이것 함수가 반환하도록 선언 될 때만 허용됩니다. 세트. 기본 가정은 1000 줄입니다.
theSET절의 원인 지정된 구성 매개 변수로 설정할 수 있습니다 지정된 값 함수가 입력 될 때 함수가 종료 될 때 이전 값으로 복원.현재에서 설정저장 값으로 매개 변수의 세션의 현재 값 함수가 입력 될 때 적용됩니다.
if aset조항이 첨부되어 있습니다 함수, 그런 다음 a의 효과세트 현지의동일한 변수는 기능으로 제한됩니다 구성 매개 변수의 이전 값은 여전히 복원되어 있습니다 기능 종료. 그러나 평범한SET명령 (Local)를 무시합니다set조항 이전의로컬 설정명령 : the 이러한 명령의 영향은 기능 종료 후에도 지속됩니다. 현재 거래가 롤백되지 않는 한.
참조윈 토토 : 문서 : 9.0 : set및18 장자세한 내용 허용되는 매개 변수 이름 및 값에 대해.
함수를 정의하는 문자열 상수; 의미 언어에 따라 다릅니다. 내부 기능이 될 수 있습니다 이름, 객체 파일, SQL 명령 또는 텍스트 경로 절차 적 언어로.
종종 달러 견적을 사용하는 것이 도움이됩니다 (참조섹션 4.1.2.4) 함수 정의 문자열을 작성하려면 일반적인 단일 견적 구문보다는. 달러없이 인용, 함수의 단일 따옴표 또는 백 슬래시 정의는 두 배로 늘어서 탈출해야합니다.
이 형태의as절은입니다 동적으로로드 가능한 C 언어 함수에 사용됩니다 C 언어 소스 코드의 함수 이름은 동일하지 않습니다. SQL 함수의 이름으로. 문자열OBJ_FILE는 파일의 이름입니다 동적으로로드 가능한 객체를 포함하고link_symbol는 함수의 링크입니다 기호, 즉 C 언어의 함수 이름 소스 코드. 링크 기호를 생략하면 가정됩니다 SQL 함수의 이름과 동일하려면 한정된.
반복 될 때배트맨 토토 생성통화는 동일한 개체 파일을 참조하고 파일은 전용입니다. 세션 당 한 번로드. 파일을 언로드하고 다시로드합니다 (아마도 개발 중에), 새로운 세션을 시작하십시오.
선택적인 부분을 지정하는 역사적 방법 기능에 대한 정보. 다음 속성 여기에 나타날 수 있습니다 :
동등한엄격한또는null에서 null을 반환합니다 입력.
iscachable는 더 이상 사용되지 않습니다 동등한불변; 역 호환성으로 여전히 허용됩니다 이유.
속성 이름은 대소 문자에 민감하지 않습니다.
참조PostgreSQL : 문서 : 9.0 : 사용자 스포츠 토토 결과 함수추가 작문 배트맨 토토에 대한 정보.
PostgreSQL함수 허용과부하; 즉, 같은 이름이 할 수 있습니다 그들이 가지고있는 한 여러 가지 기능에 사용됩니다. 뚜렷한 입력 인수 유형. 그러나 모두의 C 이름입니다 함수는 달라야하므로 과부하 C를 제공해야합니다. 기능 다른 C 이름 (예 : 인수 유형 사용 C 이름의 일부로).
동일한 경우 두 기능이 동일하게 간주됩니다. 이름과입력인수 유형, 무시out매개 변수. 따라서 예를 들어 이러한 선언 충돌은 다음과 같습니다.
함수 만들기 foo (int) ... food foo (int, out text) ...
다른 인수 유형 목록이있는 함수는 다음과 같습니다. 생성 시간에 충돌로 간주되지만 기본값이 그들이 상충 될 수 있다면. 예를 들어, 고려
함수 만들기 foo (int) ... 기능을 만들기 foo (int, int default 42) ...
A Callfoo (10)로 인해 실패합니다 어떤 함수를 호출 해야하는지에 대한 모호성.
전체SQLType Syntax IS 함수의 인수 및 반환 값을 선언 할 수 있습니다. 그러나, 괄호 화 된 유형 수정 자 (예 : 정밀 필드 유형숫자)함수 만들기. 예를 들어배트맨 토토 생성 foo (varchar (10)) ...IS 정확히함수 생성 foo (Varchar) ....
기존 함수를 대체 할 때함수 생성 또는 교체, 제한이 있습니다 매개 변수 이름을 변경합니다. 이미 이름을 변경할 수 없습니다 입력 매개 변수에 할당 된 (이름을 추가 할 수 있지만 이전에 없었던 매개 변수). 둘 이상이 있다면 출력 매개 변수, 출력 이름을 변경할 수 없습니다. 매개 변수는 기능의 결과를 설명하는 익명 복합 유형. 이러한 제한은 기존의 호출이 교체 할 때 기능은 작동을 멈추지 않습니다.
함수가 선언 된 경우엄격한에이variadic주장, 엄격함 Variadic 어레이를 확인하십시오전체적으로는 널이 아닙니다. 그만큼 배열에 null 요소가있는 경우 배트맨 토토이 여전히 호출됩니다.
시작하는 데 도움이되는 몇 가지 사례가 있습니다. 을 위한 자세한 정보 및 예, 참조PostgreSQL : 문서 : 9.0 : 사용자 스포츠 토토 결과 함수.
함수 추가 (정수, 정수) 정수를 반환합니다 '$ 1 + $ 2를 선택하십시오'; 언어 SQL 불변 널 입력에서 null을 반환합니다;
인수 이름을 사용하여 정수를 증가시킵니다.pl/pgsql:
함수 증분 생성 또는 교체 (I Integer) 정수를 $$로 반환합니다. 시작하다 반환 i + 1; 끝; $$ 언어 plpgsql;
여러 출력 매개 변수가 포함 된 레코드를 반환합니다 :
함수 DUP 작성 (int, out f1 int, out f2 텍스트) $$로 $ 1, 캐스트 (텍스트 $ 1) || '텍스트'$$입니다 언어 SQL; * DUP에서 *를 선택하십시오 (42);
당신은 명시 적으로 더 구두로 똑같은 일을 할 수 있습니다. 명명 된 복합 유형 :
유형 DUP_RESULT 생성 (f1 int, f2 텍스트); 기능 dup (int)를 작성합니다. dup_result를 반환합니다 $$로 $ 1, 캐스트 (텍스트 $ 1) || '텍스트'$$입니다 언어 SQL; * DUP에서 *를 선택하십시오 (42);
여러 열을 반환하는 또 다른 방법은 A를 사용하는 것입니다.테이블배트맨 토토 :
함수 생성 DUP (int) 리턴 테이블 (F1 int, F2 텍스트) $$로 $ 1, 캐스트 (텍스트 $ 1) || '텍스트'$$입니다 언어 SQL; * DUP에서 *를 선택하십시오 (42);
그러나 a테이블함수는입니다 이전 예제와는 다릅니다 a 반환SET레코드가 아니라 기록.
aSecurity Definer함수 그것을 만든 사용자의 권한으로 실행됩니다. 함수를 오용 할 수 없도록하려면 필요합니다. 을 위한 보안,search_path신뢰할 수없는 사용자가 쓸 수있는 스키마를 제외하도록 설정해야합니다. 이렇게하면 악의적 인 사용자가 마스크를 마스킹하는 객체를 만드는 것을 방지합니다 함수에서 사용되는 객체. 이것에서 특히 중요합니다 고려는 임시 테이블 스키마로, 먼저 검색됩니다. 기본값은 일반적으로 누구나 쓸 수 있습니다. 안전한 배열 임시 스키마를 마지막으로 검색하도록함으로써 가능합니다. 이렇게하려면 쓰기PG_TEMP마지막으로 입장search_path. 이 배트맨 토토 안전한 사용법을 보여줍니다 :
함수 만들기 check_password (텍스트 unse, pass 텍스트) 부울을 $$로 반환합니다 통과 된 부울 선언; 시작하다 전달 된 (PWD = $ 2)를 선택하십시오 PWD에서 여기서 사용자 이름 = $ 1; 통과 된 반환; 끝; $$ 언어 plpgsql 보안 정의기 - 안전한 search_path : 신뢰할 수있는 스키마를 설정 한 다음 'pg_temp'를 설정하십시오. set search_path = admin, pg_temp;
전PostgreSQL버전 8.3,SET옵션을 사용할 수 없었습니다. 따라서 오래된 배트맨 토토에는 다소 복잡한 논리가 포함될 수 있습니다. 저장, 설정 및 복원search_path. 그만큼set옵션을 사용하기가 훨씬 쉽습니다 목적.
명심해야 할 또 다른 포인트는 기본적으로 실행한다는 것입니다. 특권이 부여됩니다public새로 생성 된 기능 (참조메이저 토토 사이트 : 문서 : 9.0 : 메이저 토토 사이트자세한 정보). 종종 당신은 a의 사용을 제한하고 싶을 것입니다 보안 정의기는 일부 사용자에게만 작동합니다. 그렇게하려면, 당신 기본값을 취소해야합니다public권한과 그랜트 execute 특권을 선택적으로 부여합니다. 피하기 위해 모든 사람이 새 배트맨 토토에 액세스 할 수있는 창이있는 그것을 만들고 단일 거래 내에서 권한을 설정하십시오. 을 위한 예:
시작; 함수 check_password (텍스트 un, pass 텍스트) ... 보안 정의기를 만듭니다. function check_password (텍스트의 미확인, 통과 텍스트)에서 모두를 공개합니다. Admins에 함수 check_password (텍스트의 미확인, 통과)에 대한 execute execute; 저지르다;
a배트맨 토토 생성명령이 정의됩니다 SQL : 1999 이상. 그만큼PostgreSQL버전은 비슷하지만 완전히는 아닙니다 호환 가능. 속성은 휴대용이 아니며 사용 가능한 다른 언어.
다른 데이터베이스 시스템과의 호환성argmode앞에 서면 작성할 수 있습니다 후에argname. 그러나 첫 번째 방식은 표준 준수입니다.
SQL 표준은 매개 변수 기본값을 지정하지 않습니다. 그만큼 와 구문기본값키워드는 왔습니다 Oracle, 그리고 그것은 표준의 정신에있다 : SQL/PSM 가변 기본값에 사용합니다. 의 구문=T-SQL 및 Firebird에서 사용됩니다.