표준화를 위한 컬럼 추출
postgresql의 전체 테이블들의 컬럼을 출력하는 프로시져이다.
CREATE OR REPLACE FUNCTION get_all_table_columns()
RETURNS TABLE (
table_schema TEXT,
table_name TEXT,
ordinal_position INT,
column_name TEXT,
data_type TEXT,
not_null BOOLEAN,
default_value TEXT,
column_comment TEXT
) AS $$
DECLARE
v_tbl_schema TEXT;
v_tbl_name TEXT;
v_col RECORD;
full_table_name TEXT;
BEGIN
-- 테이블 목록 순회 (alias로 이름 충돌 방지)
FOR v_tbl_schema, v_tbl_name IN
SELECT t.table_schema, t.table_name
FROM information_schema.tables t
WHERE t.table_type = 'BASE TABLE'
AND t.table_schema NOT IN ('topology','information_schema', 'pg_catalog')
LOOP
-- 테이블 이름 문자열 조합
full_table_name := format('%I.%I', v_tbl_schema, v_tbl_name);
BEGIN
-- 컬럼 순회
FOR v_col IN
SELECT
a.attnum AS ordinal_position,
a.attname AS column_name,
format_type(a.atttypid, a.atttypmod) AS data_type,
a.attnotnull AS not_null,
pg_get_expr(d.adbin, d.adrelid, true) AS default_value,
col_description(a.attrelid, a.attnum) AS column_comment
FROM
pg_attribute a
LEFT JOIN
pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum
WHERE
a.attrelid = full_table_name::regclass
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY
a.attnum
LOOP
-- 반환할 테이블 필드 값 설정
table_schema := v_tbl_schema;
table_name := v_tbl_name;
ordinal_position := v_col.ordinal_position;
column_name := v_col.column_name;
data_type := v_col.data_type;
not_null := v_col.not_null;
default_value := v_col.default_value;
column_comment := v_col.column_comment;
RETURN NEXT;
END LOOP;
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE '오류 발생: %.% → %', v_tbl_schema, v_tbl_name, SQLERRM;
END;
END LOOP;
END;
$$ LANGUAGE plpgsql;
-- 출력은 이렇게
-- 출력은 이렇게
-- 출력은 이렇게
SELECT * FROM get_all_table_columns();
-- 결과화면