2016-10-14 7 views
2

일련의 쿼리를 만들 스키마에서 함수를 만듭니다. 마치 함수의 스키마가 검색 경로에서 처음 인 것처럼 모든 쿼리를 작성하기를 원합니다. 함수의 컨텍스트 내에서 검색 경로를 변경할 수는 있지만 함수에서 내 함수가 포함 된 스키마를 배우는 방법을 찾을 수는 없습니다.내 기능과 동일한 스키마의 테이블을 어떻게 참조합니까?

답변

1

당신은 get diagnosticspg_context 반환 값 구문 분석을 시도 할 수 있습니다 :

create or replace function test_schema.test_function_2() 
returns text language sql as $$ 
    select nspname::text 
    from pg_namespace n 
    join pg_proc p on n.oid = pronamespace 
    where proname = 'test_function_2' 
$$; 

select test_schema.test_function_2() as schema_name; 

schema_name 
------------- 
test_schema 
(1 row) 
+0

내가 돈 ': 함수 이름을 사용하면 시스템 카탈로그 pg_namespace를 쿼리 스키마 이름을 얻을 수있는 유일한 경우

create schema test_schema; create or replace function test_schema.test_function() returns text language plpgsql as $$ declare stack text; begin get diagnostics stack = pg_context; return stack; end $$; select test_schema.test_function(); test_function ------------------------------------------------------------------------- PL/pgSQL function test_schema.test_function() line 5 at GET DIAGNOSTICS (1 row) 

을 첫 번째 해결책을 사랑하지 마십시오. 그것은 매우 많은 해킹 인 것으로 보이는데, 이것은 단지 포스트그레스가하도록 설계된 것이 아니라는 것을 암시합니다. 두 번째는 훨씬 깔끔하지만 도움이되지 않습니다. 중복 된 이름을 처리하기 위해 스키마를 처음 사용하고 있습니다. 그 때마다 스키마 이름을 텍스트 매개 변수로 추가 할 것입니다. –

+0

여러 스키마에서 같은 이름을 가진 서로 다른 함수가 반 패턴이므로 장래에 이상한 문제가 발생할 수 있습니다. – klin

+0

이것은 부당하게 모호하게 보입니다. 비슷한 이름의 함수를 사용하고 있는데, 그 이유는 각 스키마에서 동일한 목적을 수행하지만 동일한 내용을 가지고 있지 않기 때문입니다. 예를 들어, 각 스키마에는 동일한 데이터 형식에 대해 작동하는 집계 함수가 있지만 스키마에서 스키마로 가중치 집계가 어떻게 변경 될 수 있습니다. '이상한 문제'에 대한 정보가 없으면, 어떻게 그런 일을 더 잘 수행 할 수 있을까요? –

관련 문제