준비
수식은 다음과 같습니다.
d*b+(l*4+r)+(i/d)+s
변수를 $n
표기법으로 바꾸어 plpgsql에서 직접 값으로 바꿀 수 있습니다 EXECUTE
(아래 참조).
$1*$5+($3*4+$2)+($6/$1)+$4
원래의 공식을 추가로 (사람의 눈을 위해) 저장하거나 다음과 같은 표현식으로이 양식을 동적으로 생성 할 수 있습니다.
SELECT regexp_replace(regexp_replace(regexp_replace(
regexp_replace(regexp_replace(regexp_replace(
'd*b+(l*4+r)+(i/d)+s'
, '\md\M', '$1', 'g')
, '\mr\M', '$2', 'g')
, '\ml\M', '$3', 'g')
, '\ms\M', '$4', 'g')
, '\mb\M', '$5', 'g')
, '\mi\M', '$6', 'g');
번역이 소리인지 확인하십시오. 에 대한 몇 가지 설명 정규 표현식 식 :
\ m ..은 단어의 시작 부분
에서만 일치합니다. \ M ..은 단어의 끝 부분에서만 일치합니다.
4 번째 매개 변수 'g'
.. 전체적으로 교체
핵심 기능
CREATE OR REPLACE FUNCTION f_calc(
d int -- days worked that month
,r int -- new nodes accuired
,l int -- loyalty score
,s numeric -- subagent commission
,b numeric -- base rate
,i numeric -- revenue gained
,formula text
,OUT result numeric
) RETURNS numeric AS
$func$
BEGIN
EXECUTE 'SELECT '|| formula
INTO result
USING $1, $2, $3, $4, $5, $6;
END
$func$ LANGUAGE plpgsql SECURITY DEFINER IMMUTABLE;
요구:
SELECT f_calc(1, 2, 3, 4.1, 5.2, 6.3, '$1*$5+($3*4+$2)+($6/$1)+$4');
보고:
29.6000000000000000
주요 포인트
이 함수는 6 개의 값 매개 변수와 formula text
7 번째를 사용합니다. 수식을 마지막에 넣었으므로 $1 .. $6
대신 대신 사용할 수 있습니다 $2 .. $7
. 가독성을 위해.
적합하다고 생각되는 값에 데이터 유형을 할당했습니다. 올바른 유형을 지정하거나 (기본 상태 점검을 구현하기 위해) 모두 작성하십시오 numeric
.
USING
절을 사용하여 동적 실행을위한 값을 전달하십시오 . 이것은 앞뒤로 캐스팅을 피하고 모든 것을 더 간단하고 안전하며 빠르게 만듭니다.
OUT
매개 변수를 사용하면 더 우아하고 구문이 짧아지기 때문에 매개 변수를 사용 합니다. 마지막 RETURN
은 필요하지 않으며 OUT 매개 변수의 값이 자동으로 리턴됩니다.
@Chris의 보안 강의 와 매뉴얼의 "보안 DEFINER 기능 작성" 장을 고려하십시오 . 내 디자인에서, 단일 주입 지점은 공식 자체입니다.
일부 매개 변수의 기본값을 사용 하여 통화를 더욱 단순화 할 수 있습니다 .