SQL 기능 임의의 SQL 문을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. 간단하게 (비 세트) 케이스, 마지막 쿼리 결과의 첫 번째 행은 다음과 같습니다. 반환. (그 점을 명심하십시오"첫 번째 열"멀티 로우 결과의 결과는 귀하가 제대로 정의되지 않습니다 사용주문.) 마지막 쿼리가 발생하면 줄을 전혀 반환하지 않으려면 널 값이 반환됩니다.
또는 SQL 함수는 함수의 리턴 유형을 as 지정하여 설정setof약간, 또는 선언하여반환 테이블(열). 이 경우 마지막 쿼리 결과의 모든 행이 반환됩니다. 자세한 내용 아래에 나타납니다.
SQL 함수의 본문은 SQL 문의 목록이어야합니다. 세미콜론으로 분리. 마지막 진술 후 세미콜론은 다음과 같습니다 선택 과목. 함수가 반환으로 선언되지 않는 한void, 마지막 진술은 A이어야합니다.select또는 an삽입, 업데이트또는삭제반환조항
SQL언어를 함께 포장 할 수 있습니다 함수로 정의됩니다. 게다가select쿼리, 명령에는 데이터 수정 쿼리가 포함될 수 있습니다 (삽입, 업데이트및삭제12442_12533커밋, SavePo토토 사이트및 일부 유틸리티 명령 (예 :12657_12665, inSQL함수) 그러나 최종 명령select또는 a반환무엇이든 반환하는 조항 함수의 리턴 유형으로 지정됩니다. 또는 당신이 있다면 동작을 수행하지만없는 SQL 함수를 정의하려고 반품에 유용한 값, 반환으로 정의 할 수 있습니다void. 예를 들어이 기능은 행을 제거합니다 의 부정적인 급여emp테이블 :
함수 만들기 clean_emp () voids as ' emp에서 삭제하십시오 여기서 급여 <0; '언어 SQL; clean_emp ()를 선택하십시오. clean_emp ---------- (1 행)
의 구문함수 만들기명령은 함수 본체가 문자열로 쓰여져야합니다. 끊임없는. 일반적으로 달러 인용문을 사용하는 것이 가장 편리합니다 (보다섹션 4.1.2.413690_13826') 및 백 슬래시 (\) (탈출 문자열 구문을 가정) 기능의 본문 (섹션 4.1.2.1).
SQL 함수의 인수는 이름이나 숫자를 사용하여 기능 본문. 둘 다의 예 방법은 아래에 나타납니다.
이름을 사용하려면 기능 인수를 이름을 말한 다음 기능 본문에 그 이름을 씁니다. 만약에 인수 이름은 현재의 열 이름과 동일합니다. 함수 내에서 SQL 명령, 열 이름이 상위. 이를 무시하려면 인수 이름을 적용하십시오 함수 자체의 이름, 즉function_name.argument_name. (만약 그렇다면 자격을 갖춘 열 이름과 충돌하고 열 이름 승리. 다른 별칭을 선택하여 모호성을 피할 수 있습니다. SQL 명령 내 테이블의 경우.)
오래된 숫자 접근법에서는 인수가 참조됩니다 구문 사용$n: $ 1첫 번째 입력 인수를 말합니다$ 2두 번째로. 이것은 이에 관계없이 작동합니다 특정 주장은 이름으로 선언되었습니다.
인수가 복합 유형 인 경우 DOT 표기법 (예 :argname.fieldname또는$ 1.FieldName, 액세스에 사용될 수 있습니다 논쟁의 속성. 다시, 당신은 자격을 갖추어야 할 수도 있습니다 형식을 만들기 위해 함수 이름을 가진 인수 이름 인수 이름이 명백합니다.
SQL 기능 인수는 데이터 값으로 만 사용할 수 있습니다. 식별자로. 예를 들어 이것은 합리적입니다 :
myTable 값에 삽입 ($ 1);
그러나 이것은 작동하지 않습니다 :
$ 1 값 (42)에 삽입;
참고 :이름을 사용하여 SQL을 참조하는 기능 기능 인수가 추가되었습니다PostgreSQL9.2. 사용되는 기능 이전 서버에서는를 사용해야합니다.$n표기법.
가장 간단한 가능한SQL함수는 인수가 없으며 단순히 기본 유형을 반환합니다. 처럼토토 사이트eger:
함수 생성 one ()은 정수를 $$로 반환합니다 결과적으로 1을 선택하십시오. $$ 언어 SQL; - 문자열 리터럴에 대한 대체 구문 : 기능 one ()를 작성하여 정수를 반환합니다. 결과적으로 1을 선택하십시오. '언어 SQL; 하나를 선택하십시오 (); 하나 ----- 1
함수 내에서 열 별칭을 정의했음을 알 수 있습니다. 함수 결과에 대한 본문 (이름 포함결과) 그러나이 열 별칭은 보이지 않습니다 기능 밖. 따라서 결과는 레이블이 지정됩니다ONE대신결과.
거의 정의하기 쉽습니다SQL기본 유형을 사용하는 기능 인수 :
함수 생성 add_em (x 정수, y 정수)은 정수를 $$로 반환합니다. x + y를 선택하십시오. $$ 언어 SQL; 답변으로 add_em (1, 2)을 선택하십시오. 답변 -------- 3
또는 우리는 이름을 분배 할 수 있습니다 인수 및 사용 숫자 :
함수 생성 add_em (정수, 정수)은 정수를 $$로 반환합니다 $ 1 + $ 2를 선택하십시오. $$ 언어 SQL; 답변으로 add_em (1, 2)을 선택하십시오. 답변 -------- 3
여기에 더 유용한 기능이 있습니다.이 기능은 차변에 사용될 수 있습니다. 은행 계좌 :
함수 생성 TF1 (AccountNo 토토 사이트eger, Debit Numeric) 정수를 $$로 반환합니다. 은행 업데이트 균형을 설정하십시오 = 균형 - 차변 여기서 AccountNo = Tf1.Accountno; 선택 1; $$ 언어 SQL;
사용자는이 기능을 차변 계정으로 실행할 수 있습니다 17 다음과 같이 $ 100.00 :
선택 TF1 (17, 100.0); 선택
이 예에서는 이름을 선택했습니다AccountNo첫 번째 논쟁의 경우입니다 의 열 이름과 동일합니다은행테이블. 내에서업데이트명령,AccountNo열을 참조하십시오bank.accountno, sotf1.accountno논쟁. 물론 다른 것을 사용하여 이것을 피할 수 있습니다. 논쟁의 이름.
실제로는 더 유용한 결과를 원할 것입니다. 상수 1보다 함수에서 정의는 다음과 같습니다.
함수 생성 TF1 (AccountNo 토토 사이트eger, Debit Numeric) 정수를 $$로 반환합니다. 은행 업데이트 균형을 설정하십시오 = 균형 - 차변 여기서 AccountNo = Tf1.Accountno; AccountNo = tf1.accountno; $$ 언어 SQL;
균형을 조정하고 새로운 잔액을 반환합니다. 그만큼 를 사용하여 하나의 명령에서 동일한 일을 수행 할 수 있습니다.반환:
기능 생성 TF1 (AccountNo 토토 사이트eger, 직불 숫자) 정수를 $$로 반환합니다. 은행 업데이트 균형을 설정하십시오 = 균형 - 차변 여기서 AccountNo = Tf1.Accountno 반환 균형; $$ 언어 SQL;
복합 유형의 인수로 기능을 작성할 때, 우리
우리가 원하는 인수뿐만 아니라
그 주장의 원하는 속성 (필드). 예를 들어,
그렇게 가정emp는 포함 된 테이블입니다
직원 데이터, 따라서 복합 이름의 이름도
테이블의 각 행의 유형. 다음은 함수입니다double_salary
그것은 누군가의 것을 계산합니다
급여는 두 배가된다면 :
테이블 emp 생성 ( 이름 텍스트, 급여 숫자, 나이 정수, 칸막이 지점 ); EMP 값에 삽입 ( 'Bill', 4200, 45, '(2,1)'); 기능을 작성하여 Double_salary (EMP)를 $$로 반환합니다 $ 1. Salary * 2를 급여로 선택하십시오. $$ 언어 SQL; 꿈으로 이름, double_salary (emp.*)를 선택하십시오 emp에서 여기서 emp.cubicle ~ = point '(2,1)'; 이름 | 꿈 ------+------- 빌 | 8400
구문의 사용에 주목하십시오$ 1. Salary인수의 한 분야를 선택하려면 행 값. 또한 부름이 어떻게select명령 용도table_name.*TO 테이블의 전체 현재 행을 복합 값으로 선택하십시오. 테이블 행을 대안으로 만 참조 할 수 있습니다. 테이블 이름 :
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)'; $$ 언어 SQL;
이 예에서는 각 속성을 지정했습니다. 일정한 가치를 지니고 있지만 어떤 계산이든 이 상수로 대체되었습니다.
함수 정의에 대한 두 가지 중요한 사항 참고 :
쿼리의 선택 목록 순서는 정확히 열이 테이블에 나타나는 것과 동일 복합 유형과 관련이 있습니다. (열의 이름 지정 우리는 위에 있었고 시스템과 관련이 없습니다.)
당신은 표현을 일치시키기위한 표현을 형성해야합니다 복합 유형의 정의 또는 오류가 발생합니다. 이와 같이:
오류 : EMP를 반환하라고 선언 한 함수 1 열에서 텍스트 대신 varchar를 반환합니다.
동일한 함수를 정의하는 다른 방법은 다음과 같습니다.
기능 작성 new_emp ()는 emp를 $$로 반환합니다 행 ( 'None', 1000.0, 25, '(2,2)') :: emp; $$ 언어 SQL;
여기 우리는 a를 썼습니다.select그 반환 올바른 복합 유형의 단일 열만. 이것은 아닙니다 이 상황에서는 정말 좋지만 편리한 대안입니다. 예를 들어 결과를 계산 해야하는 경우 경우에도 원하는 복합재를 반환하는 다른 함수를 호출함으로써 값.
우리는이 기능을 가치 표현 :
select new_emp (); new_emp ----------------------------- (없음, 1000.0,25, "(2,2)")
또는이를 테이블 함수라고 부르면 :
선택 *에서 new_emp (); 이름 | 급여 | 나이 | 작은 침실 ------+--------+-----+------- 없음 | 1000.0 | 25 | (2,2)
두 번째 방법은 더 자세히 설명합니다섹션 35.4.7.
복합 유형을 반환하는 함수를 사용하면 결과에서 하나의 필드 (속성) 만 원할 수 있습니다. 당신은 할 수 있습니다 다음과 같은 구문으로 수행하십시오.
select (new_emp ()). 이름; 이름 ------ 없음
파서를 유지하려면 여분의 괄호가 필요합니다. 혼란스러워. 당신이 그들없이 그것을하려고한다면, 당신은 다음과 같은 것 :
new_emp (). 이름을 선택하십시오. 오류 : "또는 그 근처의 구문 오류." 1 행 : SELECT NEW_EMP (). 이름; ^
또 다른 옵션은 추출을 위해 기능 표기법을 사용하는 것입니다 속성 :
select name (new_emp ()); 이름 ------ 없음
설명 된대로섹션 8.16.5, 필드 표기법과 기능적 표기법은 동일합니다.
복합 유형을 반환하는 기능을 사용하는 또 다른 방법은 다음과 같습니다. 결과를 올바른 것을 받아들이는 다른 함수로 전달하려면 입력으로 행 유형 :
function getName (EMP) 작성 텍스트를 $$로 반환합니다 1. 이름을 선택하십시오. $$ 언어 SQL; getName (new_emp ())을 선택하십시오. getName ------- 없음 (1 행)
함수의 결과를 설명하는 대체 방법은 다음과 같습니다. 로 정의하십시오.출력 매개 변수, AS 이 예에서 :
함수 생성 add_em (x int, y int, out sum int) 'x + y 선택'으로 언어 SQL; add_em (3,7)을 선택하십시오. add_em -------- 10 (1 행)
이것은 본질적으로와 본질적으로 다르지 않습니다.add_em표시섹션 35.4.2. 출력 매개 변수의 실제 값은 여러 반환 기능을 정의하는 편리한 방법 열. 예를 들어,
함수 생성 sum_n_product (x int, y int, out sum int, out product int) '선택 x + y, x * y'로 언어 SQL; 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 언어 SQL;
그러나 별도의 복합 유형으로 귀찮게 할 필요는 없습니다. 정의는 종종 편리합니다. 이름이 첨부되어 있습니다 출력 매개 변수는 단순한 장식이 아니라 결정합니다 익명 복합 유형의 열 이름. (당신이 생략한다면 출력 매개 변수의 이름 인 시스템은 이름을 선택합니다. 그 자체로.)
출력 매개 변수가 포함되어 있지 않다는 점에 주목하십시오 SQL에서 그러한 함수를 호출 할 때 인수 목록 호출. 이건이기 때문입니다.postgresql함수를 정의하기 위해 입력 매개 변수 만 고려합니다 서명을 호출합니다. 그것은 또한 입력만을 의미합니다 매개 변수는 목적으로 함수를 참조 할 때 중요합니다 떨어 뜨리는 것과 같은. 위의 기능을 사용하여 삭제할 수 있습니다 어느 쪽이든
드롭 함수 sum_n_product (x int, y int, out sum int, out product int); 드롭 함수 sum_n_product (int, int);
매개 변수는로 표시 될 수 있습니다.in( 기본),out, inout또는variadic.inout매개 변수는 둘 다 역할을합니다 입력 매개 변수 (호출 인수 목록의 일부) 및 출력 매개 변수 (결과 레코드 유형의 일부).variadic매개 변수는 입력 매개 변수이지만 다음에 설명 된대로 특별히 처리됩니다.
SQL함수 일 수 있습니다 가변적 인 수의 인수를 받아들이라고 선언했습니다. 모든"선택 사항"인수가 있습니다 동일한 데이터 유형. 선택적 인수는 전달됩니다 배열로서의 기능. 함수는 마킹으로 선언됩니다 마지막 매개 변수variadic; 이것 매개 변수는 배열 유형으로 선언해야합니다. 을 위한 예:
함수 생성 mleast (variadic arr numeric [])는 숫자를 $$로 반환합니다 generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오. $$ 언어 SQL; mleast (10, -1, 5, 4.4)를 선택하십시오. mleast -------- -1 (1 행)
효과적으로, 모든 실제 인수는variadic위치가 수집됩니다 당신이 작성한 것처럼 1 차원 배열
mleast (배열 [10, -1, 5, 4.4]); - 작동하지 않습니다
당신은 실제로 그것을 쓸 수는 없습니다. 이 기능 정의와 일치하지 않습니다. 표시된 매개 변수variadic하나 이상의 일치 자체 유형이 아닌 요소 유형의 발생.
때때로 통과 할 수있는 것이 유용합니다. variadic 함수에 대한 이미 구성된 배열; 이것은 한 가지 변동 함수가 전달되기를 원할 때 특히 편리합니다. 배열 매개 변수에 대한 배열 매개 변수. 당신은 그렇게 할 수 있습니다 지정variadic전화에서 :
mleast (variadic array [10, -1, 5, 4.4]); 선택
이것은 함수의 variadic 매개 변수의 확장을 방지합니다 그 요소 유형으로 배열 인수를 허용합니다 정상적으로 일치하는 가치.variadiccan 기능의 마지막 실제 인수에만 첨부됩니다. 부르다.
지정variadic전화에서 빈 배열을 Variadic으로 전달하는 유일한 방법 함수 예 :
mleast (variadic array [] :: numeric []); 선택
간단히 쓰기mleast () 선택Variadic 매개 변수가 하나 이상 일치해야하므로 작동하지 않습니다. 실제 주장. (두 번째 함수를 정의 할 수 있습니다.mleast, 매개 변수가없는 경우 그러한 전화를 허용하고 싶었습니다.)
variadic에서 생성 된 배열 요소 매개 변수 매개 변수는 자신의 이름이없는 것으로 취급됩니다. 이것은 명명 된 인수 (섹션 4.3) 당신은 지정variadic. 예를 들어, 이것은 작동합니다 :
mleast 선택 (variadic arr : = 배열 [10, -1, 5, 4.4];
그러나 이것들은 아닙니다 :
mleast (ARR : = 10); mleast를 선택하십시오 (arr : = 배열 [10, -1, 5, 4.4];
함수는 일부 또는 일부의 기본값으로 선언 할 수 있습니다. 모든 입력 인수. 기본값은 언제든지 삽입됩니다 이 기능은 실제가 충분하지 않은 실제로 호출됩니다 논쟁. 인수는 끝까지 만 생략 할 수 있기 때문입니다. 실제 인수 목록, 매개 변수의 모든 매개 변수 기본값도 기본값이 있어야합니다. (하지만 명명 된 인수 표기법의 사용은이 제한을 허용 할 수 있습니다. 긴장을 풀려면 여전히 위치 논쟁이되도록 시행됩니다. 표기법은 현명하게 작동합니다.)
예 :
함수 생성 foo (a int, b int default 2, c int default 3) int를 반환합니다 언어 SQL $$로 $ 1 + $ 2 + $ 3을 선택하십시오. $$; foo (10, 20, 30)를 선택하십시오. foo ----- 60 (1 줄) foo (10, 20)를 선택하십시오. foo ----- 33 (1 줄) foo (10)를 선택하십시오. foo ----- 15 (1 줄) foo ()를 선택하십시오. - 첫 번째 인수에 대한 기본값이 없으므로 실패합니다. 오류 : 함수 foo ()가 존재하지 않습니다
the=표지판도 사용할 수 있습니다 핵심 단어의 장소기본값.
모든 SQL 기능은에 사용할 수 있습니다.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; $$ 언어 SQL; getfoo (1)에서 *, 상단 (Fooname)을 선택하여 t1; 거품 | foosubid | Fooname | 높은 -------+----------+---------+------- 1 | 1 | 조 | 조 (1 행)
예에서 알 수 있듯이, 우리는 기능의 결과는 마치 일반 테이블.
우리는 함수에서 하나의 행만 얻었습니다. 이것은 우리가 사용하지 않았기 때문에setof. 그게 다음 섹션에서 설명합니다.
SQL 함수가 반환으로 선언 될 때setofSomegetype, 함수의 최종 쿼리는 완료로 실행되며 각각 행 출력은 결과 세트의 요소로 반환됩니다.
이 기능은 일반적으로 함수를 호출 할 때 사용됩니다. 그만큼From절. 이 경우 각 행 함수에 의해 반환 된 것은 질문. 예를 들어, 해당 테이블을 가정합니다foo위와 동일한 내용이 있습니다 말하다:
함수 생성 getfoo (int)는 foo를 $$로 반환합니다 FOO에서 * FOO FOOOD = $ 1; $$ 언어 SQL; 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에서 탭에서 선택하십시오. $$ 언어 SQL; SOM_N_PRODUCT_WITH_TAB (10)에서 *를 선택하십시오. 합계 | 제품 -----+------- 11 | 10 13 | 30 15 | 50 17 | 70 (4 줄)
여기서 핵심 요점은 당신이 작성해야한다는 것입니다returns setof record함수는 단지 하나 대신 여러 행을 반환합니다. 있다면 하나의 출력 매개 변수 만 대신 해당 매개 변수 유형을 작성하십시오 의레코드.
현재, 반환 세트를 호출 할 수 있습니다 쿼리의 선택 목록. 쿼리의 각 행에 대해 그 자체로 생성되고, 반환 세트가 호출되고 함수의 각 요소마다 출력 행이 생성됩니다. 결과 세트. 그러나이 기능은 더 이상 사용되지 않습니다 향후 릴리스에서 제거 될 수 있습니다. 다음은 an입니다 예제 기능 선택 목록에서 세트를 반환합니다.
함수 생성 ListChildren (텍스트) 텍스트를 $$로 반환합니다 부모 = $ 1 인 노드에서 이름을 선택하십시오 $$ 언어 SQL; * 노드에서 *를 선택하십시오. 이름 | 조상 ----------+-------- 상단 | child1 | 맨 위 child2 | 맨 위 child3 | 맨 위 하위 하일드 1 | child1 subchild2 | child1 (6 줄) ListChildren ( 'top')을 선택하십시오. 목록 -------------- child1 child2 child3 (3 줄) 노드에서 이름, ListChildren (이름)을 선택하십시오. 이름 | 목록 --------+------------- 상단 | child1 상단 | child2 상단 | child3 child1 | 하위 하드 1 child1 | subchild2 (5 줄)
마지막select출력 행이 나타납니다Child2,
Child3등. 이런 일이 발생합니다.ListChildren
빈 세트를 반환합니다
이러한 인수의 경우 결과 행이 생성되지 않습니다.
참고 :함수의 마지막 명령이삽입, 업데이트또는삭제with반환, 그 명령은 항상 될 것입니다 함수가 아닌 경우에도 완료에 실행됩니다 로 선언 됨setof또는 전화 쿼리가 모든 결과 행을 가져 오지는 않습니다. 여분의 행 제작반환절 조용히 떨어지지 만 명령 된 테이블 수정 여전히 발생합니다 (그리고 모두 돌아 오기 전에 완료됩니다 기능).
반환하는 것으로 함수를 선언하는 또 다른 방법이 있습니다. 구문을 사용하는 세트반환 테이블(열). 이것은 하나 이상 사용하는 것과 동일합니다out매개 변수 플러스 기능을 반환으로 표시Setof Record(또는setof적절한 단일 출력 매개 변수 유형). 이것 표기법은 최근 SQL 표준 버전에 지정되어 있습니다. 따라서 사용하는 것보다 휴대가 가능할 수 있습니다setof.
예를 들어, 이전의 합계 및 제품 예제가 될 수 있습니다 이런 식으로 완료됩니다 :
함수 생성 Sum_n_Product_with_tab (x int) 테이블 (합산, 제품 int)을 $$로 반환합니다 $ 1 + Tab.y, $ 1 * Tab.y에서 탭에서 선택하십시오. $$ 언어 SQL;
명시 적 사용이 허용되지 않습니다out또는inout매개 변수 와 함께반환 테이블표기법 - 당신 모든 출력 열을에 넣어야합니다.테이블목록.
SQL함수 일 수 있습니다
다형성 유형을 받아들이고 반환하도록 선언Anylement, AnyArray,
AnynonArray, AnyEnum및AnyRange. 보다섹션
35.2.5다형성에 대한 자세한 설명
기능. 다형성 기능은 다음과 같습니다.make_array
두 개에서 배열을 구축합니다
임의의 데이터 유형 요소 :
함수 생성 make_array (Anylement, Anylement)는 anyArray를 $$로 반환합니다 배열을 선택하십시오 [$ 1, $ 2]; $$ 언어 SQL; 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를 선택하십시오. $$ 언어 SQL; IS_GREATER (1, 2)를 선택하십시오. is_greater ------------ 에프 (1 줄) function invalid_func ()를 $$로 반환합니다 선택 1; $$ 언어 SQL; 오류 : 결과 데이터 유형을 결정할 수 없습니다 세부 사항 : 다형성 유형을 반환하는 함수는 하나 이상의 다형성 인수를 가져야합니다.
다형성은 출력이있는 함수와 함께 사용할 수 있습니다 논쟁. 예를 들어:
기능 DUP 작성 (F1 Anylement, Out F2 Anylement, Out F3 AnyArray) '선택 $ 1, 배열 [$ 1, $ 1]'언어 SQL; * DUP에서 *를 선택하십시오 (22); f2 | F3 ----+------- 22 | 22,22
다형성은 변수 함수와 함께 사용될 수 있습니다. 을 위한 예:
기능 작성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다 generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i])을 선택하십시오. $$ 언어 SQL; 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)을 선택하십시오. $$ 언어 SQL; concat_values ( '|', 1, 4, 2)를 선택하십시오. concat_values ----------------- 1 | 4 | 2 (1 행)
SQL 함수에 하나 이상의 Collatable 매개 변수가있는 경우
데이터 유형, 각 기능 호출에 대해 Collation이 식별됩니다.
실제 인수에 할당 된 콜라주에 따라
에 설명 된대로PostgreSQL : 문서 : 9.2 : 사설 토토 사이트 Support. 경우 a
Collation이 성공적으로 식별됩니다 (즉, NO가 있습니다
논쟁들 사이의 암시 적 콜라주의 갈등) 그 다음 모두
Collatable 매개 변수는 해당 협업으로 취급됩니다
암시 적으로. 이것은 행동에 영향을 미칩니다
함수 내에서 Collation에 민감한 작업. 을 위한
예, 사용AnyLeast
위에서 설명한 기능, 결과
anyleast ( 'abc':: text, 'abc'); 선택
는 데이터베이스의 기본 콜레이션에 따라 다릅니다. 안에C로케일 결과가 될 것입니다ABC그러나 다른 많은 지역에서는ABC. 사용할 수있는 콜라이트는 가능합니다 a를 추가하여 강요Collate절로 예를 들어 주장
anyleast를 선택하십시오 ( 'ABC':: 텍스트, 'ABC'Collate "C");
또는 기능이
호출 된 내용에 관계없이 특정 콜레이션
끼워 넣다Collate필요에 따라 조항
함수 정의. 이 버전의AnyLeast
항상 사용할 것입니다en_us현장 비교 로케일 :
기능 작성 anyleast (variadic anyArray)는 anylement를 $$로 반환합니다 generate_subscripts ($ 1, 1) g (i)에서 min ($ 1 [i] "collate"en_us "); $$ 언어 SQL;
그러나 이것은에 적용되면 오류가 발생합니다. 청소 불가능한 데이터 유형.
실제 중 공통 수집을 식별 할 수없는 경우 인수, 그런 다음 SQL 함수는 매개 변수를 그들의 데이터 유형의 기본 콜 레이션 (일반적으로 데이터베이스의 기본 콜레이션이지만 다를 수 있습니다 도메인 유형의 매개 변수).
Collatable 매개 변수의 동작은 텍스트 데이터에만 적용되는 제한된 형태의 다형성 형태 유형.