programing

ORA-00904: 잘못된 식별자

muds 2023. 3. 22. 22:15
반응형

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_CODEOracle 용입니다.

언급URL : https://stackoverflow.com/questions/6027961/ora-00904-invalid-identifier

반응형