젠 토토 : 문서 : 9.6 : 젠 토토 | |||
---|---|---|---|
PostgreSQL : 문서 : 9.6 : 토토 커뮤니티 및 메시지 | Postgre배트맨 토토 : 문서 : 9.6 : PL/PG배트맨 토토 -배트맨 토토 절차 언어 | 41 장pl/pgsql - SQL절차 언어 | 다음 |
pl/pgsql데이터 변경 또는 데이터베이스 이벤트에서 토토 사이트 프로 시저를 정의하는 데 사용할 수 있습니다. 토토 사이트 절차가로 생성됩니다.함수 만들기명령, 인수가없고 반환 유형의 함수로 선언토토 사이트(데이터 변경 토토 사이트 용) 또는event_trigger(데이터베이스 이벤트 토토 사이트 용). 특별 지역 변수 이름TG_뭔가통화를 유발 한 조건을 설명하기 위해 자동으로 정의됩니다.
a스포츠 토토 : 문서 :인수가없고 반환 유형의 함수로 선언됩니다토토 사이트. 에 명시된 일부 인수를받을 것으로 예상되는 경우에도 기능은 인수없이 선언되어야합니다.토토 사이트 만들기- 그러한 인수는를 통해 전달됩니다TG_ARGV, 아래 설명 된대로.
언제pl/pgsql함수는 토토 사이트라고하며, 여러 특수 변수는 최상위 블록에서 자동으로 생성됩니다. 그들은 :
데이터 유형레코드; 새 데이터베이스 행을 보유하는 변수삽입/업데이트로드 레벨 토토 사이트의 작동. 이 변수는 명세서 수준 토토 사이트에서 할당되지 않았습니다.삭제운영.
데이터 유형레코드; 기존 데이터베이스 행을 보유하는 변수업데이트/삭제행 수준 토토 사이트의 작동. 이 변수는 명세서 수준 토토 사이트에서 할당되지 않았습니다.삽입운영.
데이터 유형이름; 방아쇠의 이름이 실제로 해고 된 변수.
데이터 유형텍스트; 문자열전, 이후, 또는대신13084_13126
데이터 유형텍스트; 둘 중 하나Row또는진술방아쇠의 정의에 따라
데이터 유형텍스트; 문자열삽입, 업데이트, 삭제또는Truncate토토 사이트가 발생했는지에 대한 정보.
데이터 유형OID; 토토 사이트 호출을 일으킨 테이블의 객체 ID.
데이터 유형이름; 토토 사이트 호출을 일으킨 테이블의 이름. 이것은 이제 더 이상 사용되지 않으며 향후 릴리스에서 사라질 수 있습니다. 사용tg_table_name대신.
데이터 유형이름; 토토 사이트 호출을 일으킨 테이블의 이름.
데이터 유형이름; 토토 사이트 호출을 일으킨 테이블 스키마의 이름.
데이터 유형Integer; 의 토토 사이트 절차에 대한 인수의 수토토 사이트 만들기진술.
데이터 유형 배열텍스트; 의 논쟁토토 사이트 만들기진술. 인덱스는 0에서 카운트합니다. 유효하지 않은 인덱스 (0보다 작거나tg_nargs) null 값을 초래합니다.
토토 사이트 함수는 중 하나를 반환해야합니다null또는 테이블의 구조를 가진 레코드/행 값은 토토 사이트가 발사되었습니다.
로드 레벨 토토 사이트 발사전NULL을 반환하여 토토 사이트 관리자 에게이 행의 나머지 작업을 건너 뛰도록 신호를 보낼 수 있습니다 (즉, 후속 토토 사이트가 발사되지 않고삽입/업데이트/삭제이 행에는 발생하지 않습니다). unnull 값이 반환되면 작업은 해당 행 값으로 진행됩니다. 원래 값과 다른 행 값을 반환NEW삽입 또는 업데이트 될 행을 변경합니다. 따라서 토토 사이트 함수가 토토 사이트 조치가 행 값을 변경하지 않고 정상적으로 성공하기를 원한다면NEW(또는 동일한 값)를 반환해야합니다. 저장 될 행을 변경하려면 직접 단일 값을 대체 할 수 있습니다NEW수정 된 반환NEW또는 반품 할 새로운 레코드/행을 구축합니다. 전 토토 사이트의 경우삭제, 반환 된 값은 직접적인 영향을 미치지 않지만 토토 사이트 조치를 진행할 수 있도록 unnull이어야합니다. 참고NEW삭제토토 사이트, 따라서 반환하는 것은 일반적으로 합리적이지 않습니다. 일반적인 관용구삭제토토 사이트는 반환됩니다old.
대신토토 사이트 (항상로드 레벨 토토 사이트이며 시야에서만 사용될 수 있음)는 업데이트를 수행하지 않았다는 신호로 NULL을 반환 할 수 있으며이 행의 나머지 작업은 건너 뜁니다 (즉, 이후 토토 사이트가 발사되지 않아야하며 행이 줄을 서서 지적으로 구성되지 않아야합니다.삽입/업데이트/삭제). 그렇지 않으면 토토 사이트가 요청 된 작업을 수행했음을 알리려면 unnull 값을 반환해야합니다. 을 위한삽입and업데이트운영, 반환 값은NEW, 토토 사이트 함수가 지원하도록 수정할 수있는반환 삽입and업데이트 반환(이것은 후속 토토 사이트에게 전달 된 행 값에도 영향을 미치거나 특별한 사람에게 전달됩니다제외AN 내 별명 참조삽입진술이있는충돌시 업데이트절). 을 위한삭제운영, 반환 값은old.
로드 레벨 토토 사이트의 반환 값이 발사되었습니다이후또는 명세서 수준 토토 사이트 발사전또는이후항상 무시됩니다. 그것은 널가 될 수도 있습니다. 그러나 이러한 유형의 토토 사이트 중 하나는 오류를 제기하여 여전히 전체 작업을 중단 할 수 있습니다.
예 41-3토토 사이트 프로 시저의 예를 보여줍니다pl/pgsql.
예 41-3. 에이pl/pgsql토토 사이트 프로 시저
이 예제 토토 사이트는 테이블에 행이 삽입되거나 업데이트 될 때마다 현재 사용자 이름과 시간이 행에 찍혀 있는지 확인합니다. 그리고 직원의 이름이 주어지고 급여가 긍정적 인 가치인지 확인합니다.
테이블 emp 제작 ( Empname 텍스트, 급여 정수, last_date timestamp, last_user 텍스트 ); function emp_stamp ()를 $ emp_stamp $로 토토 사이트로 반환합니다 시작하다 - empname과 월급이 주어 졌는지 확인하십시오 new.empname이 null이라면 그렇다면 'empname은 null이 될 수 없다'는 예외를 높이십시오. 끝 IF; New.salary가 null이라면 '%는'%가 널 급여를 가질 수 없다 ', new.empname; 끝 IF; - 그들이 지불해야 할 때 누가 우리를 위해 일합니까? 새로운.salary <0이라면 '%는'%가 부정적인 급여를 가질 수 없습니다 ', new.empname; 끝 IF; - 누가 급여를 바꾸 었는지 기억하십시오 new.last_date : = current_timestamp; new.last_user : = current_user; 새로운 반환; 끝; $ emp_stamp $ language plpgsql; EMP에 삽입하거나 업데이트하기 전에 Trigger Emp_stamp를 만듭니다 각 행에 대해 Execute Procedure Emp_stamp ();
테이블을 로그에 로그하는 또 다른 방법에는 각 삽입, 업데이트 또는 삭제에 대해 행을 보유하는 새 테이블을 작성하는 것이 포함됩니다. 이 접근법은 테이블에 대한 감사 변경으로 생각할 수 있습니다.예 41-4감사 토토 사이트 절차의 예를 보여줍니다pl/pgsql.
예 41-4. 에이PL/PGSQL감사를위한 토토 사이트 절차
이 예제 토토 사이트는에서 행을 삽입, 업데이트 또는 삭제하는지 확인합니다.emp테이블이 기록되어 있습니다 (예 : 감사)emp_audit테이블. 현재 시간과 사용자 이름은 수행 된 작업 유형과 함께 행에 찍혀 있습니다.
테이블 emp 생성 ( embname 텍스트가 null, 급여 정수 ); 테이블 작성 emp_audit ( char (1) null이 아닌 작전, 스탬프 타임 스탬프가 널 있지 않음, userID 텍스트는 null이 아닙니다. embname 텍스트가 null, 급여 정수 ); 함수 process_emp_audit ()를 $ emp_audit $로 반환합니다 시작하다 - - EMP에서 수행 된 작업을 반영하기 위해 EMP_AUDIT에서 행을 만듭니다. - 특수 변수 TG_OP를 사용하여 작업을 수행하십시오. - if (tg_op = 'delete') 그러면 emp_audit에 삽입 'd', now (), user, old.*; 옛날 복귀; elsif (tg_op = 'update') emp_audit에 삽입 'u', now (), 사용자, 새로운.*; 새로운 반환; elsif (tg_op = 'insert') emp_audit에 삽입 'i', now (), user, new.*; 새로운 반환; 끝 IF; 널 리턴; - 결과는 방아쇠 이후에 무시됩니다. 끝; $ emp_audit $ 언어 plpgsql; 토토 사이트 emp_audit을 만듭니다 EMP에 삽입 또는 업데이트 또는 삭제 후 각 행에 대해 프로 시저 Execute process_emp_audit ();
이전 예제의 변형은 메인 테이블을 감사 테이블에 연결하는 뷰를 사용하여 각 항목이 마지막으로 수정되었을 때를 표시합니다. 이 접근법은 여전히 테이블 변경의 전체 감사 트레일을 기록하지만 감사 트레일의 단순화 된 관점을 제시하여 각 항목에 대한 감사 트레일에서 파생 된 마지막 수정 된 타임 스탬프 만 보여줍니다..예 41-5뷰에서 감사 토토 사이트의 예를 보여줍니다pl/pgsql.
예 41-5. 에이PL/PGSQL감사를위한 토토 사이트 절차보기
이 예제는보기에서 토토 사이트를 사용하여 업데이트 가능하게 만들고 뷰에서 행을 삽입, 업데이트 또는 삭제하는지 확인하십시오 (즉, 감사)emp_audit테이블. 현재 시간과 사용자 이름은 수행 된 작업 유형과 함께 기록되며, View는 각 행의 마지막 수정 시간을 표시합니다.
테이블 emp 생성 ( empname 텍스트 기본 키, 급여 정수 ); 테이블 작성 emp_audit ( char (1) null이 아닌 작전, userID 텍스트는 null이 아닙니다. embname 텍스트가 null, 급여 정수, 스탬프 타임 스탬프가 널 있지 않습니다 ); View emp_view as를 만듭니다 e.empname 선택, E.Salary, last_updated로 max (ea.stamp) emp e eam.empname = e.empname에서 emp_audit ea에 가입합니다 1, 2에 의해 그룹; 기능을 만들거나 바꾸십시오. update_emp_view () 토토 사이트를 $$로 반환합니다 시작하다 - - EMP에서 필요한 작업을 수행하고 EMP_AUDIT에서 행을 만듭니다. - EMP에 대한 변화를 반영합니다. - if (tg_op = 'delete') 그러면 empname = old.empname; 찾을 수없는 경우 NULL을 반환하십시오. 끝 IF; old.last_updated = now (); emp_audit 값 ( 'd', user, old.*)에 삽입; 옛날 복귀; elsif (tg_op = 'update') EMP 업데이트 SET SALARY = NEW.SALARY WHER EMPNAME = OLD.EMPNAME; 찾을 수없는 경우 NULL을 반환하십시오. 끝 IF; new.last_updated = now (); emp_audit 값에 삽입 ( 'u', user, new.*); 새로운 반환; elsif (tg_op = 'insert') EMP 값에 삽입 (New.empname, New.salary); new.last_updated = now (); emp_audit 값 ( 'i', user, new.*)에 삽입; 새로운 반환; 끝 IF; 끝; $$ 언어 plpgsql; 토토 사이트 emp_audit을 만듭니다 emp_view에 삽입하거나 업데이트하거나 삭제하는 대신 각 행에 대해 Execute Procedure update_emp_view ();
토토 사이트를 한 번 사용하는 것은 다른 테이블의 요약 테이블을 유지하는 것입니다. 결과 요약은 특정 쿼리에 대해 원래 테이블 대신에 사용될 수 있습니다. 종종 실행 시간이 크게 줄어 듭니다. 이 기술은 일반적으로 측정 또는 관찰 된 데이터 (사실 테이블)의 테이블이 매우 클 수있는 데이터웨어 하우징에 일반적으로 사용됩니다.예 41-6토토 사이트 절차의 예를 보여줍니다pl/pgsql데이터웨어 하우스의 사실 테이블에 대한 요약 테이블을 유지하는 것.
예 41-6. 에이pl/pgsql요약 테이블을 유지하기위한 토토 사이트 절차
여기에 자세히 설명 된 스키마는 부분적으로입니다.식료품 점예제데이터웨어 하우스 툴킷By Ralph Kimball.
-- - 메인 테이블 - 시간 차원 및 판매 사실. - 테이블 생성 time_dimension ( time_key 정수가 null, day_of_week 정수 NOT NULL, day_of_month Integer Not Null, 월 정수가 널이 아닌 쿼터 정수는 null이 아닙니다. 연도 정수는 null이 아닙니다 ); time_dimension (time_key)에서 고유 한 색인 time_dimension_key를 만듭니다. 테이블 생성 sales_fact ( time_key 정수가 null, Product_key Integer Not Null, store_key 정수 NOT NULL, 득 Unit_Sold Integer Not Null, 숫자 숫자 숫자 (12,2)는 널 not ); sales_fact (time_key)에서 색인 sales_fact_time을 만듭니다. - - 요약 테이블 - 시간별 판매. - 테이블 생성 sales_summary_bytime ( time_key 정수가 null, 득 Unit_SOLD 숫자 (12) NOT NULL, aMond_cost 숫자 (15,2)는 null이 아닙니다 ); sales_summary_bytime (time_key)에서 고유 한 인덱스 sales_summary_bytime_key 만들기; - - 기능 및 토토 사이트는 업데이트, 삽입, 삭제시 요약 된 열을 수정합니다. - 기능을 만들거나 교체합니다 $ maint_sales_summary_bytime $입니다 선언하다 delta_time_key 정수; delta_amount_sold 숫자 (15,2); delta_units_sold 숫자 (12); delta_amount_cost 숫자 (15,2); 시작하다 - 증분/감소량을 계산하십시오. if (tg_op = 'delete') 그러면 delta_time_key = old.time_key; delta_amount_sold = -1 * old.amount_sold; delta_units_sold = -1 * old.units_sold; delta_amount_cost = -1 * old.amount_cost; elsif (tg_op = 'update') - time_key를 변경하는 업데이트 금지 - - (Delete + Insert가 가장 많이 - 변경이 이루어집니다). if (old.time_key! = new.time_key) 그러면 'Time_key의 업데이트 : % - % 허용되지 않음', 예외 제기, old.time_key, new.time_key; 끝 IF; delta_time_key = old.time_key; delta_amount_sold = new.amount_sold -Old.amount_sold; delta_units_sold = new.units_sold -Old.units_sold; delta_amount_cost = new.amount_cost -Old.amount_cost; elsif (tg_op = 'insert') delta_time_key = new.time_key; delta_amount_sold = new.amount_sold; delta_units_sold = new.units_sold; delta_amount_cost = new.amount_cost; 끝 IF; - 새 값으로 요약 행을 삽입하거나 업데이트하십시오. << insert_update 고리 SALLE_SUMMARY_BYTIME 업데이트 set aveS_SOLD = aMber_sold + delta_amount_sold, units_sold = units_sold + delta_units_sold, aMber_cost = aMber_cost + delta_amount_cost 여기서 time_key = delta_time_key; 발견되면 insert_update를 종료합니다. 시작하다 sales_summary_bytime에 삽입 ( time_key, aMber_sold, Unit_Sold, aMber_cost) 값 ( delta_time_key, delta_amount_sold, delta_units_sold, delta_amount_cost ); insert_update 종료; 예외 그럼에도 불구하고 - 아무것도하지 않습니다 끝; 엔드 루프 insert_update; 널 리턴; 끝; $ maint_sales_summary_bytime $ 언어 plpgsql; 토토 사이트 maint_sales_summary_bytime을 만듭니다 sales_fact에서 삽입 또는 업데이트 또는 삭제 후 각 행에 대해 실행 절차 maint_sales_summary_bytime (); sales_fact 값 (1,1,1,10,3,15)에 삽입; Sales_Fact 값 (1,2,1,20,5,35)에 삽입; sales_fact 값에 삽입 (2,2,1,40,15,135); Sales_Fact 값 (2,3,1,10,1,13)에 삽입; sales_summary_bytime에서 *를 선택하십시오. sales_fact에서 삭제하는 곳에서 product_key = 1; sales_summary_bytime에서 *를 선택하십시오. Sales_fack Set units_sold = units_sold * 2 업데이트; sales _summary_bytime에서 * 선택 *
PL/PGSQL정의에 사용될 수 있습니다PostgreSQL : 문서 : 9.6 : 이벤트 메이저 토토 사이트. PostgreSQL이벤트 토토 사이트로 호출되는 절차는 인수가없고 반환 유형의 함수로 선언되어야합니다event_trigger.
언제pl/pgsql함수를 이벤트 토토 사이트라고하며, 여러 특수 변수가 최상위 블록에서 자동으로 생성됩니다. 그들은 :
데이터 유형텍스트; 토토 사이트가 발사 된 이벤트를 나타내는 문자열.
데이터 유형텍스트; 토토 사이트가 발사되는 명령 태그가 포함 된 변수.
예 41-7이벤트 토토 사이트 프로 시저의 예를 표시pl/pgsql.