ORA-00904: 잘못된 식별자
Oracle 데이터베이스를 사용하여 다음 내부 조인 쿼리를 작성하려고 했습니다.
SELECT Employee.EMPLID as EmpID,
Employee.FIRST_NAME AS Name,
Team.DEPARTMENT_CODE AS TeamID,
Team.Department_Name AS teamname
FROM PS_TBL_EMPLOYEE_DETAILS Employee
INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team
ON Team.DEPARTMENT_CODE = Employee.DEPTID
그러면 다음 오류가 발생합니다.
INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team ON Team.DEPARTMENT_CODE = Employee.DEPTID
*
ERROR at line 4:
ORA-00904: "TEAM"."DEPARTMENT_CODE": invalid identifier
1개의 테이블의 DDL은 다음과 같습니다.
CREATE TABLE "HRMS"."PS_TBL_DEPARTMENT_DETAILS"
(
"Company Code" VARCHAR2(255),
"Company Name" VARCHAR2(255),
"Sector_Code" VARCHAR2(255),
"Sector_Name" VARCHAR2(255),
"Business_Unit_Code" VARCHAR2(255),
"Business_Unit_Name" VARCHAR2(255),
"Department_Code" VARCHAR2(255),
"Department_Name" VARCHAR2(255),
"HR_ORG_ID" VARCHAR2(255),
"HR_ORG_Name" VARCHAR2(255),
"Cost_Center_Number" VARCHAR2(255),
" " VARCHAR2(255)
)
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS
너의 문제는 그 치명적인 이중인용이다.
SQL> CREATE TABLE "APC"."PS_TBL_DEPARTMENT_DETAILS"
2 (
3 "Company Code" VARCHAR2(255),
4 "Company Name" VARCHAR2(255),
5 "Sector_Code" VARCHAR2(255),
6 "Sector_Name" VARCHAR2(255),
7 "Business_Unit_Code" VARCHAR2(255),
8 "Business_Unit_Name" VARCHAR2(255),
9 "Department_Code" VARCHAR2(255),
10 "Department_Name" VARCHAR2(255),
11 "HR_ORG_ID" VARCHAR2(255),
12 "HR_ORG_Name" VARCHAR2(255),
13 "Cost_Center_Number" VARCHAR2(255),
14 " " VARCHAR2(255)
15 )
16 /
Table created.
SQL>
Oracle SQL을 사용하면 모두 대문자로 이름을 만들거나 큰따옴표를 사용하지 않고 데이터베이스 개체 이름을 생성할 수 있습니다.스크립트에서 대소문자를 혼용하고 식별자를 큰따옴표로 묶은 경우 개체 또는 개체 속성을 참조할 때마다 큰따옴표와 정확한 대소문자를 사용해야 합니다.
SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
2 where Department_Code = 'BAH'
3 /
where Department_Code = 'BAH'
*
ERROR at line 2:
ORA-00904: "DEPARTMENT_CODE": invalid identifier
SQL> select count(*) from PS_TBL_DEPARTMENT_DETAILS
2 where "Department_Code" = 'BAH'
3 /
COUNT(*)
----------
0
SQL>
dr;dr
DDL 스크립트에 큰따옴표 사용 안 함
(대부분의 서드파티 코드 생성기는 알고 있습니다만, 오브젝트명은 모두 대문자로 표기할 수 있습니다.)
그 반대도 사실이다.이중 따옴표를 사용하지 않고 표를 작성하면...
create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
company_name VARCHAR2(255),
Cost_Center_Number VARCHAR2(255))
;
…어떤 경우든 참조할 수 있고, 칼럼도 참조할 수 있습니다.
select * from ps_tbl_department_details
…또는
select * from PS_TBL_DEPARTMENT_DETAILS;
…또는
select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'
저의 경우 테이블에 열 이름이 없기 때문에 이 오류가 발생하였습니다.
""를실행했을 때"describe tablename
파일에 수 , "hbm" 입니다.
테이블을 고친 후, 그것은 잘 작동했다.
참고로 이 경우 테이블 작성을 위한 DDL의 혼합 케이스 열 이름이 원인인 것으로 확인되었습니다.
단, "old style"과 ANSI join을 혼합한 경우 DDL이 대문자 테이블 이름으로 올바르게 수행되었더라도 동일한 오류 메시지가 표시될 수 있습니다.이 일은 저에게 일어났고 구글이 스택오버플로우 페이지로 보내줬기 때문에 제가 여기 있을 때부터 공유하려고 했습니다.
--NO PROBLEM: ANSI syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
INNER JOIN PS_NAME_PWD_VW B ON B.EMPLID = A.EMPLID
INNER JOIN PS_HCR_PERSON_NM_I C ON C.EMPLID = A.EMPLID
WHERE
LENGTH(A.EMPLID) = 9
AND LENGTH(B.LAST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/
--NO PROBLEM: OLD STYLE/deprecated/traditional oracle proprietary join syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
, PS_NAME_PWD_VW B
, PS_HCR_PERSON_NM_I C
WHERE
B.EMPLID = A.EMPLID
and C.EMPLID = A.EMPLID
and LENGTH(A.EMPLID) = 9
AND LENGTH(B.LAST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/
위의 두 SQL 문은 동일하며 오류가 발생하지 않습니다.
혼합하려고 하면 운이 좋거나 Oracle에 ORA-00904 오류가 발생할 수 있습니다.
--LUCKY: mixed syntax (ANSI joins appear before OLD STYLE)
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM
PS_PERSON A
inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
, PS_NAME_PWD_VW B
WHERE
B.EMPLID = A.EMPLID
and LENGTH(A.EMPLID) = 9
AND LENGTH(B.FIRST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
/
--PROBLEM: mixed syntax (OLD STYLE joins appear before ANSI)
--http://sqlfascination.com/2013/08/17/oracle-ansi-vs-old-style-joins/
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM
PS_PERSON A
, PS_NAME_PWD_VW B
inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
WHERE
B.EMPLID = A.EMPLID
and LENGTH(A.EMPLID) = 9
AND LENGTH(B.FIRST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
/
그리고 전혀 문제를 설명하지 않는 도움이 되지 않는 오류 메시지:
>[Error] Script lines: 1-12 -------------------------
ORA-00904: "A"."EMPLID": invalid identifier Script line 6, statement line 6,
column 51
다음의 블로그 투고에서, 이것에 관한 조사를 찾을 수 있었습니다.
저 같은 경우에는 수동으로 이전 스타일에서 ANSI 스타일 조인으로 변환하려고 시도하고 한 번에 한 테이블씩 점진적으로 변환하려고 했습니다.이것은 좋지 않은 생각이었던 것 같다.대신 모든 테이블을 한 번에 변환하거나 원래 쿼리의 조건과 테이블에서 주석을 달아 작성하는 것이 좋습니다.
DEPUTE_CODE는 Team 테이블에 존재하지 않는 열입니다.표의 DDL을 확인하여 적절한 열 이름을 찾습니다.
제 경우 Oracle에서 다음과 같은 새 테이블을 생성하려고 할 때 이 오류가 발생했습니다.,
줄에
create table products(
id_pro number primary key,
product_name varchar2(20),
);
「」를 삭제해 .,
create table products_test(
id_pro number primary key,
product_name varchar2(20)
);
JPA를 통해 엔티티를 저장하려고 할 때 이 오류가 발생했습니다.
그랬다.@JoinColumn
「」가 있지 @ManyToOne
석입니니다다
" " " @ManyToOne
문제를 해결했습니다.
테이블 PS_에 DEPARTION_CODE 열이 있습니까?TBL_Department_Details
ORA-00904: 문자열: 잘못된 식별자 원인:입력한 열 이름이 누락되었거나 잘못되었습니다.액션:올바른 열 이름을 입력하십시오.유효한 열 이름은 문자로 시작해야 하며 30자 이하여야 하며 영숫자와 특수문자 $, _ 및 #로만 구성됩니다.다른 문자가 포함되어 있는 경우는 d개의 큰따옴표로 묶어야 합니다.예약어가 아닐 수 있습니다.
또한 쿼리를 실행하는 사용자에게 필요한 권한이 부여되었는지 확인하십시오.
테이블에 대한 쿼리의 경우 SELECT 권한을 부여해야 합니다.
다른 개체 유형(예: 저장 프로시저)에 대한 쿼리의 경우 EXECUTE 권한을 부여해야 합니다.
같은 예외가 있었습니다만, 제 경우는 서브 쿼리에 열이 없는 것이 문제였습니다.이것은, 「누락」컬럼/식별자가 참조하고 있는 에일리어스의 테이블에 속해 있는 것을 알고 있습니다만,
예 - 이 쿼리는 컬럼에 ORA-00904 - 비활성 식별자를 생성합니다.
SELECT MC.ID_CODE,
MC.EMP_NAME
FROM (SELECT MC.ID_CODE,
MC.EMP_NAME
FROM EMP_WORKER MC) MC
INNER JOIN TEM_SHEETS FR ON MC.SIT_TYPE = FR.ID_CODE -- This line has the ORA-00904 error.
LEFT JOIN WRK_TYPE RAS ON MC.ID_CODE = RAS.ID_CODE;
이제 열을 추가하여 하위 쿼리를 수정하면 가 삭제됩니다.
결과:
SELECT MC.ID_CODE,
MC.EMP_NAME
FROM (SELECT MC.ID_CODE,
MC.EMP_NAME,
-- Here, the "missing invalid identifier, in this case (MC.SIT_TYPE)" is added:
MC.SIT_TYPE
FROM EMP_WORKER MC) MC
INNER JOIN TEM_SHEETS FR ON MC.SIT_TYPE = FR.ID_CODE
LEFT JOIN WRK_TYPE RAS ON MC.ID_CODE = RAS.ID_CODE;
다음은 힌트입니다.
- 코드의 표/부호를 자세히 확인하십시오. (설정에 따라) SQL Developer는 코드 들여쓰기를 다르게 처리합니다.
- 작업 중인 코드가 표로 작성되거나 삽입되지 않을 수 있으므로 이러한 오류의 디버깅이 더 어렵고 시간이 많이 걸립니다.
- 컬럼/서브쿼리(일반적으로 코드)의 에일리어스를 수정하여 고유한 에일리어스를 생성합니다.즉, 서브쿼리 및 관련 테이블에 동일한 에일리어스를 사용하지 마십시오.
이클립스 링크를 사용한 JPA2에서도 같은 예외가 있었습니다.저는 @embedded 수업을 한 엔티티와 일대일 관계를 맺었습니다.실수로 임베디드 클래스에는 @Table()이라는 주석도 붙었습니다.트레이더')JPA가 엔티티로부터 DB를 작성했을 때, 테이블 TRADER(트레이더 엔티티가 메인 엔티티에 삽입되어 있었기 때문에 잘못)도 작성되었습니다.그 테이블이 존재하기 때문에 엔티티를 유지하려고 할 때마다 위의 예외가 발생하고 있었습니다.TRADER 테이블 삭제 후 예외가 사라졌습니다.
나는 견적서 없이 값을 전달하고 있었다.일단 내가 그 작은 인용문 안에 있는 조건들을 통과하자 마법처럼 작용했다.
Select * from emp_table where emp_id=123;
위의 방법 대신 다음을 사용합니다.
Select * from emp_table where emp_id='123';
테이블 에일리어스를 놓쳐서 사용하지 않아서 에러메시지가 떴어요.
cl' 에일리어스로 인해 다음 오류가 발생합니다.
SELECT * FROM MYSCHEMA.COMPANYLOCATION_CL cl JOIN MYSCHEMA.COMPANYTYPE_CT ON MYSCHEMA.COMPANYLOCATION_CL.CLNR = MYSCHEMA.COMPANYTYPE_CT.CT_CL_NR
'cl'이 없으면 정상적으로 작동합니다.
SELECT * FROM MYSCHEMA.COMPANYLOCATION_CL JOIN MYSCHEMA.COMPANYTYPE_CT ON MYSCHEMA.COMPANYLOCATION_CL.CLNR = MYSCHEMA.COMPANYTYPE_CT.CT_CL_NR
테이블 이름에 대해 불평하지 마세요. 스키마는 20년 된 것입니다.
제 경우 컬럼 이름에 잘못된 대소문자를 사용하여 오류가 발생했으며, 같은 문제가 발생한 것 같습니다.
Department_Code
같지 않다DEPARTMENT_CODE
Oracle 용입니다.
언급URL : https://stackoverflow.com/questions/6027961/ora-00904-invalid-identifier
'programing' 카테고리의 다른 글
MongoDB에서 현재 사용하고 있는 DB를 표시하는 명령어? (0) | 2023.03.22 |
---|---|
MongoDB에서 동등한 SQL Join을 실행하려면 어떻게 해야 합니까? (0) | 2023.03.22 |
실행 시 SPRING Boot HOST 및 PORT 주소를 취득하려면 어떻게 해야 합니까? (0) | 2023.03.22 |
BeanFactory와 어플리케이션 컨텍스트 (0) | 2023.03.22 |
MySQL에서 JSON 필드 속성의 값을 선택합니다. (0) | 2023.03.22 |