SQL 기능 임의의 SQL 문을 실행합니다. 목록의 마지막 쿼리 결과를 반환합니다. 간단하게 (비 세트) 케이스, 마지막 쿼리 결과의 첫 번째 행은 다음과 같습니다. 반환. (그 점을 명심하십시오"첫 번째 열"멀티 르 결과의 결과는 귀하가 제대로 정의되지 않습니다 사용주문.) 마지막 쿼리가 발생하면 줄을 전혀 반환하지 않으려면 널 값이 반환됩니다.
또는 SQL 함수는 함수의 리턴 유형 assetofSomegetype.이 경우 마지막 쿼리 결과의 모든 행 반환됩니다. 자세한 내용은 아래에 표시됩니다.
SQL 함수의 본문은 하나 이상의 목록이어야합니다. 세미콜론으로 분리 된 SQL 문. 이에 유의하십시오 의 구문토토 결과 만들기명령 토토 결과의 본문은 단일로 둘러싸여 있어야합니다. 따옴표, 단일 견적 마크 (') 사용 기능의 본문은 두 개의 싱글을 작성하여 탈출해야합니다. 인용문 (''120PostgreSQL : 문서 : 7.4 : 쿼리 언어 (SQL) 함수63\ ') 각 견적이 원하는 곳.
SQL 함수에 대한 인수는 구문을 사용하는 기능 본문$n: $ 1참조 첫 번째 논쟁에$ 2두 번째로, 등. 인수가 복합 유형 인 경우 도트는 표기법 (예 :$ 1.name, 익숙해 질 수 있습니다 인수의 액세스 속성.
가장 간단한 가능한SQL토토 결과는 인수가 없으며 단순히 기본 유형을 반환합니다. 처럼Integer:
함수 생성 one ()은 정수를 반환합니다. 결과적으로 1을 선택하십시오. '언어 SQL; 하나를 선택하십시오 (); 하나 ----- 1
토토 결과 내에서 열 별칭을 정의했음을 알 수 있습니다. 토토 결과 결과에 대한 본문 (이름 포함결과), 그러나이 열 별칭은 보이지 않습니다 기능 밖. 따라서 결과는 레이블이 지정됩니다ONE대신결과.
거의 정의하기 쉽습니다SQL기본 유형을 사용하는 기능 논쟁. 아래의 예에서, 우리가 어떻게 참조하는지 주목하십시오. 기능 내의 인수$ 1and$ 2.
함수 생성 add_em (정수, 정수)은 정수를 반환합니다. $ 1 + $ 2를 선택하십시오. '언어 SQL; 답변으로 add_em (1, 2)을 선택하십시오. 답변 -------- 3
여기에 더 유용한 기능이 있습니다.이 기능은 차변에 사용될 수 있습니다. 은행 계좌 :
함수 생성 TF1 (정수, 숫자) 정수를 반환합니다. 은행 업데이트 밸런스 설정 = 균형 - $ 2 여기서 AccountNo = $ 1; 선택 1; '언어 SQL;
사용자는이 기능을 차변 계정으로 실행할 수 있습니다 17 다음과 같이 $ 100.00 :
TF1 (17, 100.0); 선택
실제로는 더 유용한 결과를 원할 것입니다. 상수 1보다 함수에서 정의는입니다.
함수 생성 tf1 (정수, 숫자) 숫자를 숫자로 반환합니다. 은행 업데이트 밸런스 설정 = 균형 - $ 2 여기서 AccountNo = $ 1; AccountNo = $ 1 인 은행에서 잔액을 선택하십시오. '언어 SQL;
밸런스를 조정하고 새로운 밸런스를 반환합니다.
SQL언어를 함께 포장 할 수 있습니다 토토 결과로 정의됩니다. 게다가select쿼리, 명령에는 데이터 수정이 포함될 수 있습니다 (예 :삽입, 업데이트및삭제). 그러나 최종 명령은 A 여야합니다.select그것은 지정된 모든 것을 반환합니다 함수의 리턴 유형. 또는 정의하려면 a 작업을 수행하지만 유용한 값이없는 SQL 기능 반환, 반환으로 정의 할 수 있습니다void. 이 경우 기능 본문이 끝나지 않아야합니다 A와 함께select. 예를 들어:
토토 결과 만들기 clean_emp () voids as ' emp에서 삭제하십시오 여기서 급여 <= 0; '언어 SQL; clean_emp ()를 선택하십시오. clean_emp ---------- (1 행)
복합 유형의 인수로 기능을 지정할 때,
우리는 우리가 원하는 주장을 지정해야 할뿐만 아니라
위의$ 1and$ 2)뿐만 아니라 그 주장의 속성.
예를 들어,emp는 테이블입니다
직원 데이터를 포함하므로
테이블의 각 행의 복합 유형. 다음은 함수입니다double_salary
그것은 무엇을 계산합니다
누군가의 급여는 두 배가된다면 :
테이블 emp 만들기 ( 이름 텍스트, 급여 정수, 나이 정수, 칸막이 지점 ); 토토 결과 만들기 Double_salary (EMP) 정수를 '로 반환합니다. $ 1. Salary * 2를 급여로 선택하십시오. '언어 SQL; 꿈으로 이름, Double_salary (EMP)를 선택하십시오 emp에서 여기서 emp.cubicle ~ = point '(2,1)'; 이름 | 꿈 ------+------- 샘 | 2400
구문 사용에 주목하십시오$ 1. Salary인수의 한 분야를 선택하려면 행 값. 또한 부름이 어떻게select명령은 테이블 이름을 사용하여 복합 값으로 해당 테이블의 전체 현재 행. 그만큼 표 행은 다음과 같이 참조 할 수 있습니다.
꿈으로 이름, double_salary (emp.*)를 선택하십시오 emp에서 여기서 emp.cubicle ~ = point '(2,1)';
그 행성을 강조합니다.
반환하는 토토 결과를 빌드 할 수도 있습니다. 복합 유형. 이것은 반환하는 토토 결과의 예입니다. 하나의emp행 :
토토 결과 만들기 new_emp ()는 emps를 반환합니다. 이름으로 텍스트 ''없음 '을 선택하고 급여로 1000, 25 나이로 칸막이로서 포인트 ''(2,2) ''; '언어 SQL;
이 예에서는 각 속성을 지정했습니다. 일정한 가치를 지니고 있지만 어떤 계산이든 이 상수로 대체되었습니다.
토토 결과 정의에 대한 두 가지 중요한 사항에 주목하십시오.
쿼리의 선택 목록 순서는 정확히 열이 테이블에 나타나는 것과 동일 복합 유형과 관련이 있습니다. (열의 이름 지정 우리는 위에 있었고 시스템과 관련이 없습니다.)
당신은 표현을 일치시키기위한 표현을 형성해야합니다 복합 유형의 정의 또는 오류가 발생합니다. 이와 같이:
오류 : EMP를 반환하라고 선언 한 함수 1 열에서 텍스트 대신 varchar를 반환합니다
행을 반환하는 함수 (복합 유형)를 사용할 수 있습니다. 아래에 설명 된대로 테이블 함수로서. 또한 호출 할 수 있습니다 SQL 표현식의 맥락에서, 그러나 추출 할 때만 행에서 단일 속성 또는 전체 행을 동일한 복합 유형을 받아들이는 또 다른 함수.
이것은 행에서 속성을 추출하는 예입니다. 유형:
select (new_emp ()). 이름; 이름 ------ 없음
우리는 파서를 유지하려면 여분의 괄호가 필요합니다. 혼란스러워 :
new_emp (). 이름을 선택하십시오. 오류 : "또는 그 근처의 구문 오류." 캐릭터 17
또 다른 옵션은 추출을 위해 기능 표기법을 사용하는 것입니다 속성. 이것을 설명하는 간단한 방법은 우리가 사용할 수 있다는 것입니다. 표기법속성 (표)andtable.attribute상호 교환 적으로.
select name (new_emp ()); 이름 ------ 없음
- 이것은 다음과 같습니다. - Emp.age <30에서 Emp.name의 이름으로 Emp.Name을 선택하십시오. 젊은이로 이름 (EMP)을 선택하십시오 emp에서 Age (Emp) <30; 어린이 ---------- 샘
행을 사용하는 다른 방법은 행 결과를 반환합니다. 두 번째 함수 선언 행 유형 인수를 수락하고 첫 번째 기능의 결과를 전달합니다.
토토 결과 만들기 getName (EMP) 1. 이름을 선택하십시오. '언어 SQL; getName (new_emp ())을 선택하십시오. getName ------- 없음 (1 행)
모든 SQL 함수는에서 사용될 수 있습니다.From쿼리 조항이지만 특히 그렇습니다 복합 유형을 반환하는 기능에 유용합니다. 토토 결과 인 경우 기본 유형을 반환하도록 정의되며 테이블 토토 결과는 1 열 테이블. 토토 결과가 반환하도록 정의 된 경우 복합 유형, 테이블 토토 결과는 각각의 열을 생성합니다. 복합 유형의 속성.
여기 예입니다.
테이블 foo (FOOD INT, FOOSUBID int, fooname 텍스트) 만들기; foo 값에 삽입 (1, 1, 'Joe'); foo 값에 삽입 (1, 2, 'ed'); foo 값에 삽입 (2, 1, 'Mary'); 기능 생성 getfoo (int)는 foo를 '로 반환합니다. FOO에서 * FOO FOOOD = $ 1; '언어 SQL; getfoo (1)에서 *, 상단 (Fooname)을 선택하여 t1; 거품 | foosubid | Fooname | 높은 -------+----------+---------+------- 1 | 1 | 조 | 조 (2 줄)
예에서 알 수 있듯이, 우리는 기능의 결과는 마치 일반 테이블.
우리는 토토 결과에서 하나의 행만 얻었습니다. 이것은 우리가 사용하지 않았기 때문에setof. 이것은 다음 섹션에서 설명합니다.
SQL 함수가 반환으로 선언 될 때setofSOMENTYPE, 토토 결과의 최종select22118_22230
이 기능은 일반적으로 토토 결과를 호출 할 때 사용됩니다. 그만큼절. 이 경우 각 행 토토 결과에 의해 반환 된 것은 질문. 예를 들어, 해당 테이블을 가정합니다foo위와 동일한 내용을 가지고 있으며, 우리는 우리입니다 말하다:
함수 생성 getfoo (int) foo sets foo as ' FOO에서 * FOO FOOOD = $ 1; '언어 SQL; getfoo (1)에서 *를 선택하여 t1;
그러면 우리는 다음을 얻을 것입니다 :
폼 | foosubid | Fooname -------+----------+------- 1 | 1 | 조 1 | 2 | 에드 (2 줄)
현재, 반환 세트도 호출 할 수 있습니다 쿼리의 선택 목록. 쿼리의 각 행에 대해 그 자체로 생성되고, 반환 세트가 호출되고 함수의 각 요소마다 출력 행이 생성됩니다. 결과 세트. 그러나이 기능은 더 이상 사용되지 않습니다 향후 릴리스에서 제거 될 수 있습니다. 다음은 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
빈 세트를 반환합니다
이러한 인수의 경우 결과 행이 생성되지 않습니다.
SQL토토 결과 일 수 있습니다
다형성 유형을 받아들이고 반환하도록 선언AnylementandAnyArray. 보다섹션
33.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, 당신은 다음과 같은 오류를 얻을 것입니다 :
오류 : 입력 유형이 "알 수없는"이기 때문에 "anyArray"/"anylement"유형을 결정할 수 없습니다.
a 결정 론적 반환 유형이지만 대화는 아닙니다. 을 위한 예:
함수 생성 IS_GREER (Anylement, Any Element) Boolean을 반환합니다. $ 1 $ 2를 선택하십시오. '언어 SQL; IS_GREATER (1, 2)를 선택하십시오. is_greater ------------ 에프 (1 줄) 토토 결과 만들기 invalid_func () 선택 1; '언어 SQL; 오류 : 결과 데이터 유형을 결정할 수 없습니다 세부 사항 : "AnyArray"또는 "Anylement"를 반환하는 함수는 하나의 유형에 대한 하나 이상의 인수가 있어야합니다.