젠 스포츠 토토 베트맨 : 문서 : 9.6 : 젠 스포츠 토토 베트맨 9.6.24 | |||
---|---|---|---|
Postgre스포츠 토토 베트맨 : 문서 : 9.6 : 사용자 정의 토토 사이트 순위 | Postgre무지개 토토 : 문서 : 9.6 : 무지개 토토 확장 | 제 36 장 확장PostgreSQL : 문서 : | 다음 |
스포츠 토토 베트맨 함수는 임의의 스포츠 토토 베트맨 문을 실행하여 목록의 마지막 쿼리 결과를 반환합니다. 간단한 (비 세트) 케이스에서 마지막 쿼리 결과의 첫 번째 행이 반환됩니다. (그 점을 명심하십시오"첫 번째 행"멀티 로우 결과의 결과는 사용하지 않는 한 잘 정의되지 않습니다주문 by.) 마지막 쿼리가 줄을 전혀 반환하지 않으면 널 값이 반환됩니다.
또는 스포츠 토토 베트맨 함수는 함수의 리턴 유형을 as를 지정하여 세트 (즉, 여러 행)를 반환하도록 선언 할 수 있습니다.setof약간반환 테이블 (열). 이 경우 마지막 쿼리 결과의 모든 행이 반환됩니다. 자세한 내용은 아래에 표시됩니다.
스포츠 토토 베트맨 함수의 본문은 세미콜론으로 분리 된 스포츠 토토 베트맨 문의 목록이어야합니다. 마지막 진술 후 세미콜론은 선택 사항입니다. 함수가 반환으로 선언되지 않는 한void, 마지막 진술은 A이어야합니다.select또는 an삽입, 업데이트또는삭제반환절.
스포츠 토토 베트맨언어는 함께 포장하고 함수로 정의 할 수 있습니다. 게다가select쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다 (삽입, 업데이트및삭제) 및 기타 스포츠 토토 베트맨 명령. (예 : 트랜잭션 제어 명령을 사용할 수 없습니다 (예 :커밋, SavePoint및 일부 유틸리티 명령 (예 :진공, in스포츠 토토 베트맨함수) 그러나 최종 명령은 A이어야합니다.select또는 a반환함수의 리턴 유형으로 지정된 것을 반환하는 절. 또는 동작을 수행하지만 반환 할 유용한 값이없는 스포츠 토토 베트맨 함수를 정의하려면 반환으로 정의 할 수 있습니다void. 예를 들어이 함수는의 음의 급여로 행을 제거합니다.emp테이블 :
함수 작성 clean_emp () voids as ' emp에서 삭제하십시오 여기서 급여 <0; '언어 스포츠 토토 베트맨; clean_emp ()를 선택하십시오. clean_emp ---------- (1 행)
참고 :스포츠 토토 베트맨 함수의 전체 본체는 실행되기 전에 구문 분석됩니다. 스포츠 토토 베트맨 함수에는 시스템 카탈로그를 변경하는 명령이 포함될 수 있습니다 (예 :테이블 만들기), 함수의 이후 명령을 구문 분석하는 동안 그러한 명령의 효과가 보이지 않을 것입니다. 예를 들어,테이블 생성 foo (...); foo 값에 삽입 (...);이후로 단일 스포츠 토토 베트맨 기능으로 패키지 된 경우 원하는대로 작동하지 않습니다.foo아직 존재하지 않을 것입니다삽입명령이 구문 분석됩니다. 사용하는 것이 좋습니다pl/pg스포츠 토토 베트맨이러한 유형의 상황에서 스포츠 토토 베트맨 함수 대신
의 구문함수 만들기명령은 함수 본문을 문자열 상수로 작성해야합니다. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (참조섹션 4.1.2.414271_14403') 및 Backslashes (\) (탈출 문자열 구문을 가정) 함수 본문에서 (참조섹션 4.1.2.1).
스포츠 토토 베트맨 함수의 인수는 이름이나 숫자를 사용하여 함수 본문에서 참조 할 수 있습니다. 두 방법의 예는 아래에 나타납니다.
이름을 사용하려면 함수 인수를 이름을 가진 것으로 선언 한 다음 해당 이름을 함수 본문에 작성하십시오. 인수 이름이 함수 내에서 현재 스포츠 토토 베트맨 명령의 열 이름과 동일하면 열 이름이 우선합니다. 이것을 무시하려면 인수 이름을 함수 자체의 이름으로 평가합니다.function_name.argument_name. (이것이 자격을 갖춘 열 이름과 충돌하는 경우, 열 이름이 승리합니다. 스포츠 토토 베트맨 명령 내에서 테이블에 대한 다른 별칭을 선택하여 모호성을 피할 수 있습니다.).
구형 숫자 접근법에서는 구문을 사용하여 인수를 참조합니다.$n: $ 1첫 번째 입력 인수를 말합니다$ 2두 번째로. 이것은 특정 주장이 이름으로 선언되었는지 여부에 관계없이 작동합니다.
인수가 복합 유형 인 경우, 도트 표기법 (예 :argname.FieldName또는$ 1.FieldName, 인수의 속성에 액세스하는 데 사용할 수 있습니다. 다시 말하지만, 인수 이름이있는 인수 이름을 가진 인수 이름을 가진 인수 이름으로 인수 이름을 가진 인수 이름을 지배해야 할 수도 있습니다.
스포츠 토토 베트맨 기능 인수는 식별자가 아닌 데이터 값으로 만 사용할 수 있습니다. 예를 들어 이것은 합리적입니다 :
myTable 값에 삽입 ($ 1);
그러나 이것은 작동하지 않습니다 :
$ 1 값 (42)에 삽입;
참고 :스포츠 토토 베트맨 기능 인수를 참조하기 위해 이름을 사용하는 기능이 추가되었습니다Postgre스포츠 토토 베트맨9.2. 이전 서버에서 사용할 함수는를 사용해야합니다.$n표기법.
가장 간단한 가능한스포츠 토토 베트맨함수는 인수가 없으며 단순히와 같은 기본 유형을 반환합니다.정수:
함수 1 ()을 작성하십시오 ()는 정수를 $$로 반환합니다 결과적으로 1을 선택하십시오. $$ 언어 스포츠 토토 베트맨; - 문자열 리터럴에 대한 대체 구문 : 기능 one ()를 작성하여 정수를 반환합니다. 결과적으로 1을 선택하십시오. '언어 스포츠 토토 베트맨; 하나를 선택하십시오 (); 하나 ----- 1
함수의 결과에 대해 함수 본문 내에서 열 별칭을 정의했음을 알 수 있습니다 (이름결과) 그러나이 열 별칭은 함수 외부에 표시되지 않습니다. 따라서 결과는 레이블이 지정됩니다ONE대신결과.
거의 정의하기 쉽습니다스포츠 토토 베트맨기본 유형을 인수로 취하는 기능 :
함수 생성 add_em (x 정수, y 정수)은 정수를 $$로 반환합니다. x + y를 선택하십시오. $$ 언어 스포츠 토토 베트맨; 답변으로 add_em (1, 2)을 선택하십시오. 답변 -------- 3
대안 적으로, 우리는 인수의 이름을 분배하고 숫자를 사용 할 수 있습니다.
함수 생성 add_em (정수, 정수)은 정수를 $$로 반환합니다 $ 1 + $ 2를 선택하십시오. $$ 언어 스포츠 토토 베트맨; 답변으로 add_em (1, 2)을 선택하십시오. 답변 -------- 3
여기에 유용한 기능이 있습니다.
함수 생성 tf1 (AccountNo Integer, Debit Numeric) 정수를 $$로 반환합니다. 은행 업데이트 균형을 설정하십시오 = 균형 - 차변 여기서 AccountNo = Tf1.Accountno; 선택 1; $$ 언어 스포츠 토토 베트맨;
사용자는이 기능을 다음과 같이 17 x $ 100.00에 차변 계정으로 실행할 수 있습니다.
선택 TF1 (17, 100.0); 선택
이 예에서는 이름을 선택했습니다AccountNo첫 번째 인수의 경우, 이것은의 열 이름과 동일합니다은행테이블. 내에서업데이트Command,AccountNo열을 참조하십시오bank.accountno, sotf1.accountno인수를 참조하는 데 사용해야합니다. 물론 논쟁의 다른 이름을 사용하여 이것을 피할 수 있습니다.
실제로는 상수 1보다 함수에서 더 유용한 결과를 원할 것입니다.
기능 생성 TF1 (AccountNo Integer, 직불 숫자) 정수를 $$로 반환합니다. 은행 업데이트 균형을 설정하십시오 = 균형 - 차변 여기서 AccountNo = Tf1.Accountno; AccountNo = tf1.accountno; $$ 언어 스포츠 토토 베트맨;
균형을 조정하고 새로운 잔액을 반환합니다. 를 사용하여 하나의 명령에서 동일한 일을 수행 할 수 있습니다.반환:
기능 작성 tf1 (AccountNo Inter, 직불 숫자) 정수를 $$로 반환합니다. 은행 업데이트 균형을 설정하십시오 = 균형 - 차변 여기서 AccountNo = Tf1.Accountno 반환 균형; $$ 언어 스포츠 토토 베트맨;
복합 유형의 인수와 함께 함수를 작성할 때, 우리는 원하는 인수뿐만 아니라 해당 인수의 원하는 속성 (필드)을 지정해야합니다. 예를 들어,emp는 직원 데이터가 포함 된 테이블이므로 테이블의 각 행의 복합 유형의 이름입니다. 다음은 함수입니다double_salary
두 배가 된 경우 누군가의 급여가 무엇인지 계산합니다 :
테이블 emp 생성 ( 이름 텍스트, 급여 숫자, 나이 정수, 칸막이 지점 ); EMP 값에 삽입 ( 'Bill', 4200, 45, '(2,1)'); 기능을 작성하여 Double_salary (EMP)를 $$로 반환합니다 $ 1. Salary * 2를 급여로 선택하십시오. $$ 언어 스포츠 토토 베트맨; 꿈으로 이름, double_salary (emp.*)를 선택하십시오 emp에서 여기서 emp.cubicle ~ = point '(2,1)'; 이름 | 꿈 ------+------- 빌 | 8400
구문의 사용에 주목하십시오$ 1. Salary인수 행 값의 한 필드를 선택하려면. 또한 부름이 어떻게select명령 용도table_name.*테이블의 전체 현재 행을 복합 값으로 선택합니다. 테이블 행은 다음과 같은 테이블 이름 만 사용하여 참조 할 수 있습니다.
Double_Salary (EMP) 이름을 꿈으로 선택하십시오 emp에서 여기서 emp.cubicle ~ = point '(2,1)';
그러나이 사용법은 혼란스러워지기 쉽기 때문에 더 이상 사용되지 않습니다. (보다섹션 8.16.5테이블 행의 복합 값에 대한이 두 가지 표기법에 대한 자세한 내용.)
때로는 합성 인수 값을 즉석에서 구성하는 것이 편리합니다. 이것은로 수행 할 수 있습니다.Row구성. 예를 들어, 전달되는 데이터를 기능으로 조정할 수 있습니다.
꿈으로서 이름, double_salary (행 (이름, 급여*1.1, 나이, 칸막이))을 선택하십시오 emp에서;
복합 유형을 반환하는 함수를 빌드 할 수도 있습니다. 이것은 단일을 반환하는 함수의 예입니다emp행 :
기능 작성 new_emp ()는 emp를 $$로 반환합니다 이름으로 '없음'을 선택하고 급여로 1000.0, 25 나이로 칸막이로서 '(2,2)'; $$ 언어 스포츠 토토 베트맨;
이 예에서는 일정한 값으로 각 속성을 지정했지만 이러한 상수에 대해 계산이 대체되었을 수 있습니다..
함수 정의에 관한 두 가지 중요한 사항을 참고하십시오.
쿼리의 선택 목록 순서는 복합 유형과 관련된 테이블에 열이 나타나는 것과 정확히 동일해야합니다. (위에서와 같이 열을 지정하는 것은 시스템과 관련이 없습니다.)
당신은 복합 유형의 정의와 일치하도록 표현식을 타이핑해야합니다. 그렇지 않으면 다음과 같은 오류가 발생합니다.
오류 : EMP를 반환하라고 선언 한 함수 1 열에서 텍스트 대신 varchar를 반환합니다
동일한 함수를 정의하는 다른 방법은 다음과 같습니다.
기능 작성 new_emp ()는 emp를 $$로 반환합니다 행 ( 'None', 1000.0, 25, '(2,2)') :: emp; $$ 언어 스포츠 토토 베트맨;
여기 우리는 a를 썼습니다.select올바른 복합 유형의 단일 열만 리턴합니다. 이 상황에서는 더 나은 것이 아니지만 경우에 따라 편리한 대안입니다. 예를 들어, 원하는 복합 값을 반환하는 다른 함수를 호출하여 결과를 계산 해야하는 경우.
값 표현식 에서이 함수를 사용 하여이 기능을 직접 호출 할 수 있습니다.
select new_emp (); new_emp ----------------------------- (없음, 1000.0,25, "(2,2)")
또는이를 테이블 함수라고 부르면 :
선택 *에서 new_emp (); 이름 | 급여 | 나이 | 작은 침실 ------+--------+-----+------- 없음 | 1000.0 | 25 | (2,2)
두 번째 방법은 더 자세히 설명합니다섹션 36.4.7.
복합 유형을 반환하는 함수를 사용하면 결과에서 하나의 필드 (속성) 만 원할 수 있습니다. 당신은 다음과 같은 구문으로 할 수 있습니다 :
select (new_emp ()). 이름; 이름 ------ 없음
파서가 혼란스러워지지 않도록 추가 괄호가 필요합니다. 당신이 그들없이 그것을 시도한다면, 당신은 다음과 같은 것을 얻습니다 :
new_emp (). 이름을 선택하십시오. 오류 : "또는 그 근처의 구문 오류." 1 행 : SELECT NEW_EMP (). 이름; ^
다른 옵션은 속성 추출을위한 기능 표기법을 사용하는 것입니다 :
select name (new_emp ()); 이름 ------ 없음
설명 된대로섹션 8.16.5, 필드 표기법 및 기능 표기법은 동일합니다.
함수를 사용하는 다른 방법 복합 유형을 반환하는 다른 방법은 올바른 행 유형을 입력으로 받아들이는 다른 함수로 결과를 전달하는 것입니다.
function getName (EMP) 작성 텍스트를 $$로 반환합니다 1. 이름을 선택하십시오. $$ 언어 스포츠 토토 베트맨; getName (new_emp ())을 선택하십시오. getName ------- 없음 (1 행)
함수의 결과를 설명하는 대체 방법은출력 매개 변수,이 예에서와 같이 :
함수 생성 add_em (x int, y int, out sum int) 'x + y 선택'으로 언어 스포츠 토토 베트맨; add_em (3,7)을 선택하십시오. add_em -------- 10 (1 행)
이것은 본질적으로 버전과 다르지 않습니다.add_em표시섹션 36.4.2. 출력 매개 변수의 실제 값은 여러 열을 반환하는 기능을 정의하는 편리한 방법을 제공한다는 것입니다. 예를 들어,
함수 생성 sum_n_product (x int, y int, out sum int, out product int) '선택 x + y, x * y'로 언어 스포츠 토토 베트맨; sum_n_product (11,42)에서 *를 선택하십시오. 합계 | 제품 -----+------- 53 | 462 (1 행)
본질적으로 일어난 일은 우리가 함수 결과를 위해 익명의 복합 유형을 만들었다는 것입니다. 위의 예는와 동일한 최종 결과를 갖습니다.
sum_prod 유형 생성 (sum int, product int); 함수 sum_n_product (int, int) sum_prod를 반환합니다 '$ 1 + $ 2, $ 1 * $ 2'로 AS 언어 스포츠 토토 베트맨;
그러나 별도의 복합 유형 정의를 방해 할 필요는 없습니다. 출력 매개 변수에 첨부 된 이름은 단순한 장식이 아니라 익명 복합 유형의 열 이름을 결정합니다. (출력 매개 변수의 이름을 생략하면 시스템이 자체적으로 이름을 선택합니다.)
스포츠 토토 베트맨에서 그러한 함수를 호출 할 때 출력 매개 변수가 호출 인수 목록에 포함되어 있지 않음을 알 수 있습니다. 이건이기 때문입니다.Postgre스포츠 토토 베트맨함수의 호출 서명을 정의하기 위해 입력 매개 변수 만 고려합니다. 즉, 입력 매개 변수 만 기능을 삭제하는 것과 같은 기능을 참조 할 때만 중요합니다. 위의 기능을 중 하나로 삭제할 수 있습니다
드롭 함수 sum_n_product (x int, y int, out sum int, out product int); 드롭 함수 sum_n_product (int, int);
매개 변수는로 표시 될 수 있습니다.in(기본값),out, inout또는variadic.inout매개 변수는 입력 매개 변수 (호출 인수 목록의 일부)와 출력 매개 변수 (결과 레코드 유형의 일부) 역할을합니다..variadic매개 변수는 입력 매개 변수이지만 다음에 설명 된대로 특별히 처리됩니다.
PostgreSQL : 문서 :함수는 모든 인수 숫자를 수락하도록 선언 될 수 있습니다."선택 사항"인수는 동일한 데이터 유형입니다. 선택적 인수는 배열로 함수로 전달됩니다. 마지막 매개 변수를로 표시하여 함수가 선언됩니다.variadic; 이 매개 변수는 배열 유형으로 선언되어야합니다. 예를 들어:
함수 생성 mleast (variadic arr numeric [])는 숫자를 $$로 반환합니다 generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오. $$ 언어 스포츠 토토 베트맨; mleast (10, -1, 5, 4.4)를 선택하십시오. mleast -------- -1 (1 행)
효과적으로, 모든 실제 인수는variadic위치가 마치 마치 마치 1 차원 배열로 모여
mleast (배열 [10, -1, 5, 4.4]); - 작동하지 않습니다
당신은 실제로 그것을 쓸 수는 없지만 적어도이 기능 정의와 일치하지 않습니다. 표시된 매개 변수variadic자체 유형이 아닌 요소 유형의 하나 이상의 발생과 일치합니다.
때로는 이미 구성된 배열을 변수 함수로 전달할 수있는 것이 유용합니다. 이것은 하나의 variadic 기능이 배열 매개 변수를 다른 매개 변수로 전달하기를 원할 때 특히 편리합니다. 또한 이것은 신뢰할 수없는 사용자가 객체를 생성 할 수있는 스키마에서 발견 된 변수 함수를 호출하는 유일한 안전한 방법입니다. 보다Postgre스포츠 토토 베트맨 : 문서 : 9.6 : 토토. 지정 하여이 작업을 수행 할 수 있습니다variadic전화에서 :
mleast (variadic array [10, -1, 5, 4.4]); 선택
이것은 함수의 variadic 매개 변수의 요소 유형으로의 확장을 방지하여 배열 인수 값이 정상적으로 일치하도록 허용합니다..variadic함수 호출의 마지막 실제 인수에만 첨부 될 수 있습니다.
지정variadic통화에서 빈 배열을 Variadic 함수로 전달하는 유일한 방법입니다.
mleast (variadic array [] :: numeric []); 선택
간단히 쓰기mleast () 선택variadic 매개 변수는 하나 이상의 실제 인수와 일치해야하므로 작동하지 않습니다. (두 번째 함수를 정의 할 수 있습니다.mleast, 매개 변수가없는 경우, 그러한 통화를 허용하려는 경우)
variadic 매개 변수에서 생성 된 배열 요소 매개 변수는 자신의 이름이없는 것으로 취급됩니다. 즉, 이름의 인수 (를 사용하여 variadic 함수를 호출 할 수 없습니다.Postgre스포츠 토토 베트맨 : 문서 : 9.6 : 스포츠 토토 결과 호출), 지정할 때를 제외하고variadic. 예를 들어, 이것은 작동합니다 :
mleast (variadic arr = 배열 [10, -1, 5, 4.4]); 선택
그러나 이것들은 아닙니다 :
mleast (ARR = 10); mleast를 선택하십시오 (arr = 배열 [10, -1, 5, 4.4]);
함수는 일부 또는 모든 입력 인수에 대한 기본값으로 선언 할 수 있습니다. 기능이 불충분하게 실제 인수로 호출 될 때마다 기본값이 삽입됩니다. 인수는 실제 인수 목록의 끝에서만 생략 할 수 있으므로 기본값을 가진 매개 변수의 모든 매개 변수는 기본값도 있어야합니다. (명명 된 인수 표기법을 사용하면이 제한이 완화 될 수 있지만, 위치 인수 표기법이 현명하게 작동하도록 여전히 시행되어 있습니다.)이 기능을 사용하든이 기능은 일부 사용자가 다른 사용자를 불신하는 데이터베이스에서 기능을 호출 할 때 예방 조치가 필요합니다. 보다Postgre스포츠 토토 베트맨 : 문서 : 9.6 : 토토.
예 :
함수 생성 foo (a int, b int default 2, c int default 3) int를 반환합니다 언어 스포츠 토토 베트맨 $$로 $ 1 + $ 2 + $ 3을 선택하십시오. $$; foo (10, 20, 30)를 선택하십시오. foo ----- 60 (1 줄) foo (10, 20)를 선택하십시오. foo ----- 33 (1 줄) foo (10)를 선택하십시오. foo ----- 15 (1 줄) foo ()를 선택하십시오. - 첫 번째 인수에 대한 기본값이 없으므로 실패합니다. 오류 : 함수 foo ()가 존재하지 않습니다
the=기호도 키워드 대신 사용할 수 있습니다기본값.
모든 스포츠 토토 베트맨 기능은에서 사용할 수 있습니다.From쿼리 조항이지만 복합 유형을 반환하는 기능에 특히 유용합니다. 함수가 기본 유형을 반환하도록 정의되면 테이블 함수는 1 열 테이블을 생성합니다. 함수가 복합 유형을 반환하도록 정의되면 테이블 함수는 복합 유형의 각 속성에 대한 열을 생성합니다.
여기 예입니다.
테이블 foo (FOOD int, foosubid int, fooname 텍스트)를 작성합니다. foo 값에 삽입 (1, 1, 'Joe'); foo 값에 삽입 (1, 2, 'ed'); foo 값에 삽입 (2, 1, 'Mary'); function getfoo (int)를 만들기 foo를 $$로 반환합니다 FOO에서 * FOO FOOOD = $ 1; $$ 언어 스포츠 토토 베트맨; getfoo (1)에서 *, 상단 (Fooname)을 선택하여 t1; 거품 | foosubid | Fooname | 높은 -------+----------+---------+------- 1 | 1 | 조 | 조 (1 행)
예에서 알 수 있듯이, 우리는 함수 결과의 열을 일반 테이블의 열인 것과 마찬가지로 동일하게 작업 할 수 있습니다..
우리는 함수에서 하나의 행만 얻었습니다. 우리가 사용하지 않았기 때문입니다setof. 다음 섹션에 설명되어 있습니다.
스포츠 토토 베트맨 함수가 반환으로 선언 될 때34852_34860Somegetype, 함수의 최종 쿼리가 완료되도록 실행되고 출력이 결과 세트의 요소로 반환됩니다.
이 기능은 일반적으로에서 함수를 호출 할 때 사용됩니다.From절. 이 경우 함수에 의해 반환 된 각 행은 쿼리에서 보이는 테이블의 행이됩니다. 예를 들어, 해당 테이블을 가정합니다foo위와 동일한 내용이 있으며 다음과 같은 내용이 있습니다.
함수 생성 getfoo (int)는 foo를 $$로 반환합니다 FOO에서 * FOO FOOOD = $ 1; $$ 언어 스포츠 토토 베트맨; getfoo (1)에서 *를 선택하여 t1;
그러면 우리는 다음을 얻을 것입니다 :
폼 | foosubid | Fooname -------+----------+------- 1 | 1 | 조 1 | 2 | 에드 (2 줄)
출력 매개 변수로 정의 된 열을 다음과 같이 여러 행으로 반환 할 수도 있습니다.
테이블 탭 생성 (y int, z int); 탭 값 (1, 2), (3, 4), (5, 6), (7, 8)에 삽입; 함수 작성 sum_n_product_with_tab (x int, Out Sum int, Out Out Product int) Setof 레코드를 반환합니다 $$로 $ 1 + Tab.y, $ 1 * Tab.y에서 탭에서 선택하십시오. $$ 언어 스포츠 토토 베트맨; SOM_N_PRODUCT_WITH_TAB (10)에서 *를 선택하십시오. 합계 | 제품 -----+------- 11 | 10 13 | 30 15 | 50 17 | 70 (4 줄)
여기서 핵심 요점은 당신이 작성해야한다는 것입니다레코드를 반환함수가 단지 하나가 아닌 여러 행을 반환한다는 것을 나타냅니다. 출력 매개 변수가 하나만 있으면 대신 해당 매개 변수 유형을 작성하십시오.레코드.
테이블 또는 하위 퀘스트의 연속적인 행에서 오는 각 호출의 매개 변수를 사용하여 설정 퇴행 함수를 여러 번 호출하여 쿼리 결과를 구성하는 것이 종종 유용합니다. 이를 선호하는 방법은 사용하는 것입니다.측면key Word,섹션 7.2.1.5. 다음은 트리 구조의 요소를 열거하기 위해 설정 함수를 사용하는 예입니다.
노드에서 * 선택 *; 이름 | 조상 ----------+-------- 상단 | child1 | 맨 위 child2 | 맨 위 child3 | 맨 위 하위 하일드 1 | child1 subchild2 | child1 (6 줄) 함수 listchildren (텍스트)을 $$로 설정합니다 부모 = $ 1 인 노드에서 이름을 선택하십시오 $$ 언어 스포츠 토토 베트맨 안정; 선택 *에서 ListChildren ( 'top'); 목록 -------------- child1 child2 child3 (3 줄) 이름을 선택하고, 노드에서 자녀, 자녀로서의 측면 목록 (이름); 이름 | 어린이 --------+------------ 상단 | child1 상단 | child2 상단 | child3 child1 | 하위 하드 1 child1 | subchild2 (5 줄)
이 예제는 간단한 조인으로 수행 할 수 없었던 일을하지 않지만 더 복잡한 계산에서는 일부 작업을 함수에 넣는 옵션이 매우 편리 할 수 있습니다.
현재, 함수 쿼리 선택 목록에서 반환 세트를 호출 할 수 있습니다. 쿼리가 자체적으로 생성되는 각 행에 대해 기능 리턴 세트가 호출되고 함수 결과 세트의 각 요소에 대해 출력 행이 생성됩니다. 그러나이 기능은 더 이상 사용되지 않으며 향후 릴리스에서 제거 될 수 있습니다. 이전 예제는 다음과 같은 쿼리로 수행 할 수 있습니다.
ListChildren ( 'top')을 선택합니다. 목록 -------------- child1 child2 child3 (3 줄) 노드에서 이름, ListChildren (이름)을 선택하십시오. 이름 | 목록 --------+------------- 상단 | child1 상단 | child2 상단 | child3 child1 | 하위 하드 1 child1 | subchild2 (5 줄)
마지막select, 출력 행이 나타나지 않음Child2, Child3등. 이런 일이 발생합니다ListChildren
해당 인수에 대한 빈 세트를 반환하므로 결과 행이 생성되지 않습니다. 이것은 우리가 내부 조인에서 |를 사용할 때 기능 결과에 얻은 것과 동일한 동작입니다.측면구문.
참고 :함수의 마지막 명령이삽입, 업데이트, 또는삭제with반환, 그 명령은 함수가 선언되지 않더라도 항상 완료로 실행됩니다setof또는 호출 쿼리가 모든 결과 행을 가져 오지는 않습니다. 에 의해 생성 된 추가 행반환절은 조용히 삭제되었지만, 명령 된 테이블 수정은 여전히 발생합니다 (그리고 함수에서 돌아 오기 전에 모두 완료됩니다)..
참고 :| 선택 목록에서 설정 함수를 사용하는 데있어 핵심 문제From절은 동일한 선택 목록에 둘 이상의 설정 함수를 넣는 것이 매우 현명하게 작동하지 않는다는 것입니다. (그렇게하면 실제로 얻는 것은 각 세트 리턴 기능에 의해 생성 된 행의 수의 가장 일반적인 배수와 동일한 다수의 출력 행입니다.)측면Syntax는 여러 개의 설정 함수를 호출 할 때 덜 놀라운 결과를 생성하며 일반적으로 대신 사용해야합니다.
세트를 반환하는 것으로 함수를 선언하는 또 다른 방법이 있습니다. 구문을 사용하는 것입니다반환 테이블 (열). 이것은 하나 이상을 사용하는 것과 같습니다out매개 변수 플러스 기능을 반환으로 표시기록 설정(또는setof적절한 단일 출력 매개 변수 유형). 이 표기법은 최근 버전의 스포츠 토토 베트맨 표준에 지정되어 있으므로 사용하는 것보다 휴대가 가능할 수 있습니다.setof.
예를 들어, 앞의 합계 및 제품 예제도 다음 방식으로 수행 할 수 있습니다.
함수 생성 sum_n_product_with_tab (x int) 테이블 (합산, 제품 int)을 $$로 반환합니다 $ 1 + Tab.y, $ 1 * Tab.y에서 탭에서 선택하십시오. $$ 언어 스포츠 토토 베트맨;
명백한 사용이 허용되지 않습니다out또는inout테이블 리턴표기법 - 모든 출력 열을에 넣어야합니다.테이블List.
스포츠 토토 베트맨기능은 다형성 유형을 수락하고 반환하도록 선언 할 수 있습니다Anylement, AnyArray, AnynonArray, AnyEnum및AnyRange. 보다섹션 36.2.5다형성 기능에 대한 자세한 설명. 다형성 기능은 다음과 같습니다.make_array
두 개의 임의의 데이터 유형 요소에서 배열을 구축하는 것 :
함수 생성 make_array (Anylement, Anylement)는 anyArray를 $$로 반환합니다 배열을 선택하십시오 [$ 1, $ 2]; $$ 언어 스포츠 토토 베트맨; intarray, make_array ( 'a':: text, 'b')로 make_array (1, 2)를 선택하여 textarray; intarray | TextArray ----------+----------- 1,2 | a, b
typecast의 사용에 주목하십시오'a':: text인수가 유형임을 지정하려면텍스트. 인수가 단지 문자열 문자 인 경우 필요합니다. 그렇지 않으면 유형으로 취급되기 때문에.알 수없는및 배열알 수없는는 유효한 유형이 아닙니다. typecast가 없으면 다음과 같은 오류가 발생합니다.
오류 : 입력 유형이 "알 수없는"이므로 다형성 유형을 결정할 수 없습니다.
고정 된 반환 유형으로 다형성 인수를 할 수는 있지만 그 반대는 그렇지 않습니다. 예를 들어:
함수 생성 IS_GREATER (Anylement, Anylement)는 부울을 $$로 반환합니다 $ 1 $ 2를 선택하십시오. $$ 언어 스포츠 토토 베트맨; IS_GREATER (1, 2)를 선택하십시오. is_greater ------------ 에프 (1 줄) function invalid_func ()를 $$로 반환합니다 선택 1; $$ 언어 스포츠 토토 베트맨; 오류 : 결과 데이터 유형을 결정할 수 없습니다 세부 사항 : 다형성 유형을 반환하는 함수는 하나 이상의 다형성 인수를 가져야합니다.
다형성은 출력 인수가있는 함수와 함께 사용할 수 있습니다. 예를 들어:
기능 DUP 작성 (F1 Anylement, Out F2 Anylement, Out F3 AnyArray) '선택 $ 1, 배열 [$ 1, $ 1]'언어 스포츠 토토 베트맨; * DUP에서 *를 선택하십시오 (22); f2 | F3 ----+------- 22 | 22,22
다형성은 변수 함수와 함께 사용할 수 있습니다. 예를 들어:
기능 작성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다 generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오. $$ 언어 스포츠 토토 베트맨; anyleast (10, -1, 5, 4)를 선택하십시오. anyleast --------- -1 (1 줄) anyleast ( 'abc':: text, 'def')를 선택하십시오. anyleast --------- 알파벳 (1 줄) conection concat_values (text, variadic anyArray)는 텍스트를 $$로 반환합니다 array_to_string ($ 2, $ 1)을 선택하십시오. $$ 언어 스포츠 토토 베트맨; concat_values ( '|', 1, 4, 2)를 선택하십시오. concat_values ----------------- 1 | 4 | 2 (1 행)
스포츠 토토 베트맨 함수에 Collatable Data 유형의 하나 이상의 매개 변수가있는 경우, 실제 인수에 지정된 콜라주에 따라 각 함수 호출에 대해 콜로레이션이 식별됩니다.Postgre스포츠 토토 베트맨 : 문서 : 9.6 : 토토 커뮤니티 Support. Collation이 성공적으로 식별되면 (즉, 인수간에 암시 적 콜라주의 충돌이 없음) 모든 Collatable 매개 변수는 해당 충돌을 암시 적으로 갖는 것으로 취급됩니다. 이는 함수 내에서 Collation-Ensentivent Operation의 동작에 영향을 미칩니다. 예를 들어 사용AnyLeast
위에서 설명한 기능, 결과
anyleast ( 'abc':: text, 'abc'); 선택
는 데이터베이스의 기본 콜레이션에 따라 다릅니다. 안에C로케일 결과가ABC, 그러나 다른 많은 지역에서는ABC. A를 추가하여 사용할 수있는 콜라이트를 강요 할 수 있습니다.Collate예를 들어 주장에 대한 조항
anyleast를 선택하십시오 ( 'ABC':: text, 'ABC'Collate "C");
또는 대안 적으로, 호출 된 내용에 관계없이 특정 콜레이션과 함께 작동하기를 원하는 경우Collate함수 정의에 필요한 조항. 이 버전의AnyLeast
항상 사용할 것입니다en_us문자열 비교 로케일 :
기능 작성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다 generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i] "collate"en_us "); $$ 언어 스포츠 토토 베트맨;
그러나 청소 불가능한 데이터 유형에 적용되면 오류가 발생합니다.
실제 인수 사이에서 공통 수집을 식별 할 수없는 경우 스포츠 토토 베트맨 함수는 매개 변수를 데이터 유형의 기본 충전으로 처리하는 것으로 취급하지만 (일반적으로 데이터베이스의 기본 충전물이지만 도메인 유형의 매개 변수에 대해 다를 수 있음).
Collatable 매개 변수의 동작은 제한된 형태의 다형성으로 생각할 수 있으며, 텍스트 데이터 유형에만 적용됩니다.