2012-08-24 1 views
0

Postgres DB로 문서를 가져 오는 데 문제가 있습니다. 내가 plpgsql 기능을 가지고, 더 간단 버전은 그렇게 볼 수 있었다 :
PL/pgSQL 함수 + 클라이언트 측 lo_import

create function add_file(flag integer, sth varchar) returns void as 
begin 
    if flag = 1 then 
     insert into tab_one values (my_file_oid, sth); 
    else 
     insert into tab_two values (my_file_oid, sth); 
    end if; 
end; 

그리고 psql의 명령을

\lo_import('path/to/file'); 

두 코드 파일 일인치 나는 클라이언트 사이트 lo_import가 필요하기 때문에 lo_import()를 삽입 문에 넣을 수 없다. 변수 LASTOID가 있지만 add_file 함수에서는 사용할 수 없습니다. 그리고 그것은 모든 호출 add_file()에서 업데이트되지 않을 것입니다.
그럼 어떻게하면 데이터베이스에 oid를 넣을 수 있습니까? 예를 들어, '플래그'와 'sth'는 insert 문을 사용하고 모든 것은 인수를 사용하여 함수에 넣으시겠습니까? 파일이 클라이언트 컴퓨터에 있습니다.

답변

1

psql's \lo_import은 가져 오기 결과 OID를 반환합니다.

CREATE FUNCTION add_file(_flag integer, _sth varchar, _oid oid) 
    RETURNS void LANGUAGE plpgsql AS 
BEGIN 
    IF _flag = 1 THEN 
     INSERT INTO tab_one(file_oid, sth) VALUES (_oid, _sth); 
    ELSE 
     INSERT INTO tab_two(file_oid, sth) VALUES (_oid, _sth); 
    END IF; 
END; 

를 제쳐두고 : 당신은 다음과 같이 할 수있는 기능을 매개 변수로 그에서 손을 필요 항상는 임시 전화를 제외하고 (AN INSERT 명령으로 테이블에 열 목록을 추가 , 아마도).


은 plpgsql 함수 내에서 당신은 또한 server side functions 제공에 사용하실 수 있습니다. 다음과 같이 수 :이 소유자 (일반적으로 시스템 사용자 postgres)의 권한으로 데이터베이스 서버의 파일 시스템 내에서 동작하는 것을

INSERT INTO tab_one(file_oid, sth) VALUES (lo_import('/etc/motd'), _sth); 

참고. 따라서 사용은 수퍼 유저로 제한됩니다.

+0

나는 다른 plpgsql 코드에서이 기능 (add_file)로 전화 : 는 '(주 함수를 만드는) 이 (...) 이 add_file (1,'A '를) 수행을 시작으로 무효 언어 plpgsql을 반환 end; ' 그래서 여기 \ lo_import를 사용할 수 없습니다. INSERT에 대한 도움말을 보내 주셔서 감사합니다! – Borgo

+0

@Borgo : 서버 측 실행을위한 변형을 추가했습니다. 그것은 슈퍼 유저들에게만 제한되어 있습니다. –