array_agg is an aggregate function
에러는 pg_get_functiondef
가 aggregate 함수나 window 함수에 대해서 동작하지 않을 때 발생할 수 있습니다. 이 문제를 해결하려면 함수 정의를 얻는 다른 방법을 사용하거나, pg_proc
에서 특정 조건을 추가로 설정해줘야 할 수 있습니다.
아래는 이 문제를 해결할 수 있는 개선된 쿼리입니다:
1. Aggregate 및 Window 함수 제외:
PostgreSQL에서는 집계 함수와 일반 함수가 모두 pg_proc
에 저장되지만, 집계 함수와 window 함수는 pg_get_functiondef
로 정의를 조회할 수 없습니다. 이를 필터링하려면 proisagg
와 proiswindow
컬럼을 활용할 수 있습니다.
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_functiondef(p.oid) AS function_definition
FROM
pg_proc p
JOIN
pg_namespace n ON p.pronamespace = n.oid
WHERE
NOT p.proisagg -- 집계 함수가 아닌 것
AND NOT p.proiswindow -- 윈도우 함수가 아닌 것
AND pg_get_functiondef(p.oid) LIKE '%검색할_문자열%';
2. PostgreSQL 11 이상 (prokind 사용):
PostgreSQL 11 이상에서는 pg_proc
에 prokind
컬럼이 추가되어, 함수 유형을 더 쉽게 필터링할 수 있습니다. prokind = 'f'
는 일반 함수를 의미합니다.
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_functiondef(p.oid) AS function_definition
FROM
pg_proc p
JOIN
pg_namespace n ON p.pronamespace = n.oid
WHERE
p.prokind = 'f' -- 일반 함수만 선택
AND pg_get_functiondef(p.oid) LIKE '%검색할_문자열%';
3. 특정 스키마에 대해서만 검색 (옵션):
SELECT
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_functiondef(p.oid) AS function_definition
FROM
pg_proc p
JOIN
pg_namespace n ON p.pronamespace = n.oid
WHERE
p.prokind = 'f'
AND n.nspname = '특정_스키마명'
AND pg_get_functiondef(p.oid) LIKE '%검색할_문자열%';
위 쿼리 중 하나를 사용하면 pg_get_functiondef
에서 발생하는 문제를 방지하고, 함수 정의를 성공적으로 검색할 수 있을 것입니다.
728x90
반응형
'Database' 카테고리의 다른 글
[PostgreSQL] PostgreSQL AccessShareLock 이해 및 해제 가이드 (1) | 2024.11.19 |
---|---|
[DB] 특정 기간중 DB CPU 부하가 높은 SQL 찾기 (0) | 2023.04.20 |
[DB] Oracle 쿼리 튜닝을 위한 쿼리 분석 방법 (0) | 2023.04.13 |
[SQL] 오라클 조회 쿼리 성능 개선을 위한 정리 - 1 (0) | 2023.04.12 |
락 걸린 테이블 확인 및 락 해제 (0) | 2022.02.16 |