2017-02-05 1 views
-2

PL/Python으로 작성된 함수가 있습니다. 고유 한 이름을 사용하여, 이 PostgreSQL 함수를 PL/Py에서 PL/SQL로 변환하는 방법은 무엇입니까?

CREATE PROCEDURAL LANGUAGE 'plpythonu' HANDLER plpython_call_handler 

(나는 멋진 트릭, 관리자가 아닌 사용자의 권한을 실행할 수 있도록 발견 : 그것은 때문에를 통해 설치 절차 언어의 허용 파이썬에서 실행되는 데이터베이스 기능입니다 내 질문 할 수 없습니다 많이 가지고 있지만, 나는 해킹 "내 손으로에서 질문에 지금

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpythonu2' HANDLER plpython_call_handler 
GRANT USAGE ON LANGUAGE plpythonu2 TO admin; 

) 그래서 아래의 대답은, 당신의 일부는 내가이 일을하고 궁금 확신 "위의 코드는 작동하지만 Amazon의 RDS 서비스를 사용하려면 언어를 설치할 수없고 PL/Python을 사용할 수 없습니다. 그러나 SQL은 그렇습니다.

따라서 파이썬으로 작성된 다음 함수를 순수 SQL로 변환하는 데 도움이 필요합니다.

CREATE OR REPLACE FUNCTION "public"."human_readable_bits" (
    "b" bigint = 0 
) 
RETURNS varchar AS 
$body$ 
import math 
if b: 
    exponent = math.floor(math.log(b)/math.log(1024)) 
    val = b/pow(1024, math.floor(exponent)) 
    val = round(val*2)/2 -- This rounds to the nearest HALF (X.5) B, Kb, Mb, Gb, etc. 
    return "%.2f %s" % (val, ('B','Kb','Mb','Gb','Tb','Pb','Eb','Zb','Yb')[int(exponent)]) 
else: 
    return "0 Gb" 
$body$ 
LANGUAGE 'plpythonu2' 
VOLATILE 
RETURNS NULL ON NULL INPUT 
SECURITY INVOKER 
COST 100; 

이 기능은 저와 같은 쿼리를 수행 할 수 있습니다 : 나는 기능을 만든 후, 사이드 노트/차 질문으로,

=> SELECT human_readable_bits(3285824466906); 
human_readable_bits 
--------------------- 
3.00 Tb 
(1 row) 

OR 또한

=> SELECT human_readable_bits(5920466906); 
human_readable_bits 
--------------------- 
5.50 Gb 
(1 row) 

을 때 DDL을 보았습니다. "보안 인보커"라는 줄이 있습니다. 그 사람이 의미 /하는 것이 무엇인지 알고 있습니까?

+0

두 번째 쿼리는 Mb가 아니며 Gb가 맞습니다. 맞습니까? –

답변

1

일반 PLPGSQL 기능에 대한 변환은 다음과 같습니다

CREATE OR REPLACE FUNCTION public.human_readable_bits(b NUMERIC) 
    RETURNS VARCHAR AS 
$BODY$ 
declare 
    exponent integer; 
    val float; 
    arr varchar[]; 
    sz VARCHAR(10); 
    result varchar(20); 
BEGIN 
    if b is null or b = 0 then 
     return '0 B'; 
    end if; 

    if b < 1024 then 
     return b::varchar || ' Bits'; 
    end if; 

    arr := ARRAY['B','Kb','Mb','Gb','Tb','Pb','Eb','Zb','Yb']; 
    exponent := floor(log(b)/log(1024)); 
    val := b/power(1024,exponent); 
    val := round(val*2)/2; 

    sz := arr[trunc(floor(log(b)/log(1024)))]; 

    if strpos(val::varchar,'.') > 0 then 
     result := substr(val::varchar, 1, strpos(val::varchar,'.')-1); 
     result := result || '.' || rpad(substr(val::varchar, strpos(val::varchar,'.')+1), 2, '0') || ' ' || sz; 
    else 
     result := val::varchar || '.00 ' || sz; 
    end if; 
    return result; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

을이 함수의 결과 :

select human_readable_bits(328582446690656456434534453) hrb0, 
     human_readable_bits(3285824466906) hrb1, 
     human_readable_bits(5920466906) hrb2, 
     human_readable_bits(1024) hrb3, 
     human_readable_bits(512) hrb4, 
     human_readable_bits(null) hrb5; 

이 될 것인가에 : 귀하의 측면으로 당

hrb0  hrb1  hrb2  hrb3  hrb4  hrb5 
    272.00 Zb 3.00 Gb  5.50 Mb  1.00 B  512 Bits  0 B 

질문에서 대답은 쉽게 찾을 수 있습니다. Create Function Documentation

보안 노출 자은 함수를 호출하는 사용자의 권한으로 함수를 실행해야 함을 나타냅니다. 이것이 기본값입니다. SECURITY DEFINER는 함수가 함수를 작성한 사용자의 특권으로 실행되도록 지정합니다.

관련 문제