Oracle EBS 커스텀 폼을 개발하다 보면 컴파일 단계에서부터 막히는 경우가 많습니다. 이번 글에서는 사용자 조직 구분용 커스텀 화면(Forms)을 만들면서 실제로 만난 에러 8가지를 순서대로 정리했습니다. 리스트 아이템 설정, DB 접속 문제, Record Group 오류, 런타임 예외, 아이템 속성 오류까지 — Forms 개발 초반에 누구나 한 번쯤 마주치는 에러들입니다.
각 에러마다 원인 → 확인 방법 → 해결 코드 순서로 정리했으니, 지금 같은 에러 메시지를 보고 계시다면 목차에서 바로 찾아가셔도 됩니다.
목차
1. FRM-30191: No list items defined for required poplist
에러 메시지
FRM-30191: No list items defined for required poplist.
List USE_YN
Item: USE_YN
Block: XXINV_OPRT_USER_ROLE
Form: XXINVC00545
FRM-30085: Unable to adjust form for output.

원인
Required = Yes로 설정된 리스트(Poplist/Combo Box) 아이템에 목록 요소가 하나도 정의되지 않았을 때 발생합니다. Forms는 필수 리스트 아이템에 NULL 요소를 자동으로 넣어주지 않기 때문에, 런타임에 POPULATE_LIST로 채울 계획이더라도 설계 시점에 최소 1개 요소가 반드시 있어야 컴파일이 통과합니다.
해결 방법
방법 1. 목록 요소를 직접 추가 (권장)
- Object Navigator → Data Blocks → 해당 블록 → Items → 문제의 아이템 선택
- Property Palette → Functional 섹션 →
Elements in List클릭 - List Item Elements 창에서 요소 추가
| List Element (화면 표시) | List Item Value (DB 값) |
|---|---|
| Y | Y |
| N | N |
방법 2. Required를 No로 변경
Property Palette → Data 섹션 → Required = No
이 경우 Forms가 빈 요소를 자동으로 채워 컴파일은 통과하지만, 값 입력 강제는 WHEN-VALIDATE-ITEM에서 별도로 처리해야 합니다.
함께 확인할 것
기존 데이터에 Y/N 외의 값이나 NULL이 섞여 있으면 런타임에서 또 문제가 됩니다. 미리 확인해두세요.
SELECT USE_YN, COUNT(*)
FROM XXINV_OPRT_USER_ROLE
GROUP BY USE_YN;
2. FRM-30188: No initial value given, and other values are not allowed
에러 메시지
FRM-30188: No initial value given, and other values are not allowed (item
XXINV_OPRT_USER_ROLE.USE_YN).
List USE_YN
Block: XXINV_OPRT_USER_ROLE
Created form file D:\forms_resource\XXINV\XXINVC00545.fmx

이번엔 하단에 “Module built successfully”가 함께 표시됩니다. 즉 컴파일은 성공했고 .fmx 파일도 정상 생성됐지만, 이 메시지는 경고입니다. 방치하면 런타임에서 실제 오류로 터집니다.
원인
리스트 아이템에 초기값(Initial Value)도 없고, 목록에 없는 값을 허용하는 설정(Mapping of Other Values)도 없는 상태입니다. 이 상태로 두면:
- 신규 레코드 생성 시 값이 NULL이 되는데, 목록에 NULL 요소가 없어 표시 불가
- DB에서 Y/N 외의 값이 조회되면 표시할 요소가 없어 런타임 오류
해결 방법
Property Palette에서 아래 두 속성 중 하나 이상을 설정합니다.
Initial Value (Data 섹션) — 신규 레코드 기본값
Initial Value = Y
Mapping of Other Values (Functional 섹션) — 목록에 없는 값 처리
Mapping of Other Values = N
⚠️ 주의: Mapping of Other Values는 데이터를 덮어쓸 수 있습니다
이 설정은 목록에 없는 모든 값을 지정한 요소로 바꿔 화면에 표시합니다. 예를 들어 DB에 USE_YN = 'X'인 행이 있는데 Mapping of Other Values = N으로 두면, 화면엔 N으로 보이고 그 상태로 저장하면 원본 값 X가 조용히 N으로 덮어써집니다.
설정 전 실제 데이터 분포를 먼저 확인하세요.
SELECT USE_YN, COUNT(*)
FROM XXINV_OPRT_USER_ROLE
GROUP BY USE_YN
ORDER BY 1;
Y, N, NULL만 있다면 안심하고 쓰셔도 됩니다. NULL이 많다면 Mapping of Other Values보다 리스트에 빈 요소를 추가하는 편이 더 안전합니다.
3. ORA-03114: not connected to ORACLE
에러 메시지
FRM-30064: Unable to parse statement select fu.USER_ID as user_id
,fu.user_name as emp_nm
,CASE
WHEN fu.description IS NOT NULL THEN fu.description
...
END AS user_desc
FROM fnd_user fu
,PER_ALL_PEOPLE_F ppf
,hz_parties hp
where fu.employee_id = ppf.person_id (+)
and fu.person_party_id = hp.PARTY_ID (+)
and fu.ENCRYPTED_FOUNDATION_PASSWORD <> 'INVALID'.
ORA-03114: not connected to ORACLE
Record Group RG_FND_USER_LV
Form: XXINVC00545
FRM-30085: Unable to adjust form for output.

원인
이 에러는 SQL 문법 문제가 아니라 DB 접속 자체가 끊어진 상태에서 Forms Builder가 Record Group 쿼리를 검증하려 했을 때 발생합니다. 원인은 대개 다음 중 하나입니다.
- 세션 유휴 타임아웃으로 DB 연결 끊김
- VPN·네트워크 순간 단절
- DB 리스너 재기동 등 서버 측 이벤트
해결 방법
1단계. 재접속
Forms Builder → File → Connect로 현재 연결 상태를 확인하고 재접속합니다. 대부분 이 단계에서 해결됩니다.
2단계. 재접속 후에도 같은 에러가 나면 SQL 자체를 의심
접속을 복구했는데도 계속 같은 SQL에서 오류가 난다면, 그때는 진짜 SQL 문제입니다. 특히 EBS 버전에 따라 존재하지 않을 수 있는 컬럼을 먼저 확인하세요.
SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'APPLSYS'
AND TABLE_NAME = 'FND_USER'
AND COLUMN_NAME IN ('PERSON_PARTY_ID', 'ENCRYPTED_FOUNDATION_PASSWORD');
PERSON_PARTY_ID는 R12 이후 추가된 컬럼이라, 버전이나 커스텀 뷰 구성에 따라 없을 수 있습니다.
4. FRM-12001: Cannot create the record group
에러 메시지
Forms
FRM-12001: Cannot create the record group (check your query).

DB 접속은 정상인데(ORA-03114 해결 후), Forms가 Record Group 쿼리를 실제로 실행해봤더니 실패했다는 의미입니다.
원인 후보 (우선순위 순)
1. 컬럼명 오류
가장 유력한 원인입니다. 예를 들어 FND_USER 테이블의 비밀번호 컬럼명은 EBS 버전에 따라 ENCRYPTED_USER_PASSWORD 또는 ENCRYPTED_FOUNDATION_PASSWORD 중 하나만 존재합니다.
SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'APPLSYS'
AND TABLE_NAME = 'FND_USER'
AND COLUMN_NAME LIKE '%PASSWORD%';
2. Record Group 쿼리 끝에 세미콜론 포함
Record Group의 Query 속성에는 세미콜론(;)을 넣으면 안 됩니다. PL/SQL 에디터를 열어 쿼리 텍스트 끝에 실수로 세미콜론이나 마침표가 들어갔는지 확인하세요.
3. 조회 권한 부족
Forms가 접속하는 계정(보통 APPS)에 대상 테이블 SELECT 권한이 없는 경우입니다.
SELECT TABLE_NAME, OWNER
FROM ALL_TAB_PRIVS
WHERE GRANTEE = 'APPS'
AND TABLE_NAME IN ('FND_USER', 'PER_ALL_PEOPLE_F', 'HZ_PARTIES');
원인을 빠르게 좁히는 방법
Property Palette의 Query 속성 끝 ... 버튼으로 PL/SQL 에디터를 열고, 쿼리를 단계적으로 줄여가며 각 단계에서 Compile을 눌러봅니다.
-- 1단계: 테이블만
SELECT USER_ID, USER_NAME FROM FND_USER;
-- 2단계: 조건 추가
SELECT USER_ID, USER_NAME FROM FND_USER
WHERE ENCRYPTED_FOUNDATION_PASSWORD <> 'INVALID';
-- 3단계: 조인 추가
1단계에서 막히면 권한 문제, 2단계에서 막히면 컬럼명 문제, 3단계에서 막히면 조인 테이블 문제입니다.
5. FRM-40350: Query caused no records to be retrieved
메시지
FRM-40350: Query caused no records to be retrieved.
Record: 1/1

이건 오류가 아니라 정상 동작입니다. 조회 조건에 맞는 데이터가 DB에 없다는 안내일 뿐, 폼 자체는 문제없이 실행되고 있는 상태입니다.
조건에 맞는 데이터가 분명 있는데도 이 메시지가 뜬다면
가장 흔한 원인은 LOV 표시값과 실제 저장값의 불일치입니다. 화면에는 사람이 읽기 편한 텍스트(예: “사용”)가 보이지만, 실제로 폼이 WHERE 조건으로 던지는 값은 그 텍스트 그대로일 수 있습니다.
확인 방법:
Object Navigator → 문제의 LOV 연결 아이템 → Property Palette
→ List Item Value 확인
디버깅이 필요하면 조회 버튼 트리거에 다음처럼 넣어 실제 WHERE절을 눈으로 확인하세요.
MESSAGE('WHERE = ' || l_where);
PAUSE;
DB에서 직접 실행한 조건과 폼이 실제로 던지는 조건을 나란히 비교하면 어디서 어긋나는지 바로 드러납니다.
6. FRM-40735 / ORA-01403: WHEN-NEW-RECORD-INSTANCE 예외
에러 메시지
FRM-40735: WHEN-NEW-RECORD-INSTANCE trigger raised unhandled exception ORA-01403.
Record: 1/1

원인
ORA-01403 (no data found)은 SELECT ... INTO ... 구문이 행을 하나도 찾지 못했을 때 발생합니다. WHEN-NEW-RECORD-INSTANCE 트리거 안의 조회 로직이 신규(빈) 레코드에서 커서가 진입할 때도 그대로 실행되면서, 키 값이 NULL인 상태로 조회를 시도해 실패한 것입니다.
전형적인 문제 코드 패턴:
-- 문제가 되는 코드
DECLARE
l_user_name VARCHAR2(240);
BEGIN
SELECT USER_NAME
INTO l_user_name
FROM FND_USER
WHERE USER_ID = :XXINV_OPRT_USER_ROLE.USER_ID; -- NULL이면 매칭 행 없음
:XXINV_OPRT_USER_ROLE.USER_DESC := l_user_name;
END;
신규 레코드에서는 USER_ID가 NULL이므로 WHERE USER_ID = NULL은 항상 거짓이 되어 NO_DATA_FOUND가 발생합니다.
해결 방법
1. NULL 체크 추가
DECLARE
l_user_name VARCHAR2(240);
BEGIN
IF :XXINV_OPRT_USER_ROLE.USER_ID IS NOT NULL THEN
SELECT USER_NAME
INTO l_user_name
FROM FND_USER
WHERE USER_ID = :XXINV_OPRT_USER_ROLE.USER_ID;
:XXINV_OPRT_USER_ROLE.USER_DESC := l_user_name;
END IF;
END;
2. 예외 처리까지 추가 (권장)
값이 있더라도 참조 테이블에서 이미 삭제된 경우를 대비해 NO_DATA_FOUND를 명시적으로 잡아줍니다.
DECLARE
l_user_name VARCHAR2(240);
BEGIN
IF :XXINV_OPRT_USER_ROLE.USER_ID IS NOT NULL THEN
BEGIN
SELECT USER_NAME
INTO l_user_name
FROM FND_USER
WHERE USER_ID = :XXINV_OPRT_USER_ROLE.USER_ID;
:XXINV_OPRT_USER_ROLE.USER_DESC := l_user_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
:XXINV_OPRT_USER_ROLE.USER_DESC := NULL;
END;
END IF;
END;
테스트할 것
이 오류를 고친 후에는 반드시 두 가지 케이스를 모두 테스트하세요.
- 조회 결과가 0건인 상태에서 신규 레코드 진입
- 조회 결과가 있는 상태에서 마지막 행 다음에 신규 행 추가
7. FRM-41042: No such property for Set_Item_Property
에러 메시지
Forms
FRM-41042: No such property for Set_Item_Property.

원인
SET_ITEM_PROPERTY에 넘긴 속성 이름이 잘못됐거나, 해당 아이템 유형에 적용할 수 없는 속성일 때 발생합니다. 실무에서 자주 걸리는 케이스는 VISUAL_ATTRIBUTE 속성에 문자열로 된 이름을 직접 지정하는 방식이, Forms 버전이나 설정에 따라 지원되지 않는 경우입니다.
-- 문제가 될 수 있는 코드
SET_ITEM_PROPERTY('BLOCK.ITEM', VISUAL_ATTRIBUTE, 'VA_ENTERABLE');
해결 방법
1단계. 문제되는 속성부터 제거하고 최소 구성으로 테스트
핵심 기능(입력 활성화/비활성화)과 무관한 장식성 속성부터 빼고, INSERT_ALLOWED / UPDATE_ALLOWED / ENABLED만 남긴 상태로 다시 컴파일합니다.
-- WHEN-CREATE-RECORD
BEGIN
SET_ITEM_PROPERTY('BLOCK.ITEM', INSERT_ALLOWED, PROPERTY_TRUE);
SET_ITEM_PROPERTY('BLOCK.ITEM', UPDATE_ALLOWED, PROPERTY_TRUE);
SET_ITEM_PROPERTY('BLOCK.ITEM', ENABLED, PROPERTY_TRUE);
END;
2단계. 블록명·아이템명 철자 재확인
FRM-41042는 속성명뿐 아니라 아이템 경로 자체가 틀렸을 때도 발생할 수 있습니다. Object Navigator에서 정확한 블록명과 아이템명을 다시 확인하세요.
3단계. 색상 변경이 꼭 필요하면 Named Visual Attribute를 미리 생성
Object Navigator → Visual Attributes에서 VA_ENTERABLE, VA_READONLY 등을 미리 만들어두고 참조해야 하며, 존재하지 않는 이름을 문자열로 넘기면 이 오류가 납니다.
8. 정리: 에러별 원인·해결 요약표
| 에러 코드 | 성격 | 핵심 원인 | 1차 조치 |
|---|---|---|---|
| FRM-30191 | 컴파일 실패 | 필수 리스트에 요소 없음 | List Item Elements 추가 |
| FRM-30188 | 컴파일 경고 | Initial Value·Mapping 미설정 | 초기값 또는 매핑값 지정 |
| ORA-03114 | 세션 단절 | DB 접속 끊김 | 재접속 후 재컴파일 |
| FRM-12001 | Record Group 오류 | 컬럼명·세미콜론·권한 | 쿼리 단계별 축소 테스트 |
| FRM-40350 | 정상 메시지 | 조회 결과 0건 | LOV 값·WHERE절 확인 |
| FRM-40735 / ORA-01403 | 런타임 예외 | NULL 키로 SELECT INTO 실행 | NULL 체크 + 예외처리 |
| FRM-41042 | 속성 오류 | 잘못된 속성명/아이템 경로 | 속성명 축소 후 재확인 |
Forms 컴파일 에러는 메시지 하나하나가 무섭게 보여도, 대부분 “필수인데 값이 없다” / “목록에 없는 값을 만났다” / “세션이 끊겼다” 이 세 가지 패턴 중 하나로 수렴합니다. 에러 메시지의 마지막 줄(Block, Item, Record Group 이름)을 먼저 보고 어느 객체가 문제인지부터 좁혀가시면 해결 속도가 훨씬 빨라집니다.
이 글이 도움이 되셨다면, EBS Forms/OAF 관련 다른 트러블슈팅 글도 함께 참고해보세요.
