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에서 발생하는 문제를 방지하고, 함수 정의를 성공적으로 검색할 수 있을 것입니다.
배열의 개념에 대해 알아보고, 배열의 정의와 선언 형태, 배열과 기억공간의 표현에 대해 알아본다.
학습 목표
배열을 선언하고 초기화.
배열의 요소를 참조.
배열과 기억공간의 표현을 이해.
char형 배열을 이해.
주요 용어
배열 : 동일한 자료형으 ㅣ값들이 순서적으로 하나의 이름(배열명)에 모여있는 것으로, 같은 이름을 갖는 하나 이상의 변수 리스트.
1차원 배열 : 배열의 첨자가 하나만 있는 배열.
2차원 배열 : 배열의 첨자가 2개인 배열.
3차원 배열 : 배열의 첨자가 3개인 배열.
char형 배열 : 문자열을 처리하기 위해 사용되는 배열.
배열의 개념
n개의 자료를 처리하기 위해, n개의 변수를 만들고 모든 변수 이름을 기억하고 자료를 처리하기는 복잡함. -> 일관성 있고 효율적인 새료운 변수릐 필요
하나의 변수 이름에 순서에 의한 번호 부여.
변수명[0], 변수명[2], ...
효율적인 자료 처리 가능.
배열의 정의와 형태
배열의 정의.
동일한 자료형을 갖는 자료들의 리스트.
배열의 각 요소는 하나의 변수로 취급.
배열은 배열명과 첨자로 구분.
배열 선언 형태.
1차원 배열.
2차원 배열.
3차원 배열.
1차원 배열
배열의 첨자가 하나만 있는 배열.
첨자의 개수는 배열 전체의 구성요소의 개수를 의미.
배열의 각 요소는 배열명과 첨자로 구분.
첨자는 0 부터 시작.
배열의 각 요소는 배열명과 첨자로 구분.
자료형과 기억 클래스는 갖는다.
선언
형식 : 자료형 배열명 [개수]
사용 예 : int a [10]
의미 : 1차원 배열로서, 배열명은 a, 크기는 10, 정수 값이 기억됨.
1차원 배열의 기억 공간 표현
1차원 배열의 기억 공간 표현
1차원 배열의 초기화
배열을 선언하면 기억공간을 초기화 해야 함.
초기화 방법.
배열선언 후 초기값 할당.
int arr[4]; // -> 반드시 배열의 크기를 지정해야 함.
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
배열선언과 동시에 초기값 할당.
int arr[4] = {10, 20, 30, 40}; // -> 배열의 각 요소에 초기 값 할당.
int arr[] = {10, 20, 30, 40}; // -> 배열의 크기 생량 가능.
int arr[4] = {10, 20, 30,}; // -> arr[3] = 0으로 초기화.
int arr[4] = {10, , 30, 40}; // -> 에러 발생.
int arr[4] = {10, 20, 30, 40, 50}; // -> 에러
외부로부터 자료를 입력받아 초기화.
int x[10];
for( i = 0; i < 10; i++ ) {
scanf("%d", &x[i]);
}
1차원 배열의 초기화 후 기억공간의 표현 int arr[5] = {10, 20, 30, 40, 50};
1차원 배열의 초기화 후 기억공간의 표현
EX 1
#include <stdio.h>
int main()
{
// 배열 선언과 초기화
int arr1[4] = {10, 20, 30, 40};
int arr2[] = {10, 20, 30, 40};
int arr3[4] = {10, 20};
int arr4[4] = {0};
int i;
printf("\narr1 ->\n\t");
for (i = 0; i <= 3; i++)
{
printf("[%d] : %d\t", i, arr1[i]);
}
printf("\narr2 ->\n\t");
for (i = 0; i <= 3; i++)
{
printf("[%d] : %d\t", i, arr2[i]);
}
printf("\narr3 ->\n\t");
for (i = 0; i <= 3; i++)
{
printf("[%d] : %d\t", i, arr3[i]);
}
printf("\narr4 ->\n\t");
for (i = 0; i <= 3; i++)
{
printf("[%d] : %d\t", i, arr4[i]);
}
printf("\n");
return 0;
}
EX 2
#include <stdio.h>
int main()
{
// 1차원 배열 선언과 초기화
static int x[] = {1, 2, 3, 4};
static int y[] = {10, 20, 30, 40};
int i, z[4];
for (i = 0; i < 4; ++i)
z[i] = x[i] + y[3 - i];
printf("SUM OF OTHER SIDE OF EACH ARRAY\n");
for (i = 0; i < 4; ++i)
printf("%d + %d = %d\n", x[i], y[3 - i], z[i]);
return 0;
}
2차원 배열 선언
형식 : 자료형 배열명[행의 수][열의 수]
사용 예 : int a[3][4];
의미 : 2차원 배열로, 배열 명은 a이고, 3행 4열로 됨 12개의 요소를 가진 정수형 배열.