복붙노트

[SQL] HOURS-00904 : 잘못된 식별자

SQL

HOURS-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

한 테이블의 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

해결법

  1. ==============================

    1.문제는 이러한 악성 따옴표입니다.

    문제는 이러한 악성 따옴표입니다.

    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>
    

    오라클 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>
    

    TL; DR

    DDL 스크립트에 따옴표를 사용하지 마십시오

    (나는 대부분의 타사 코드 생성기는 어떻게 알고 있지만, 그들은 UPPER CASE에서 모든 개체 이름을 넣어 충분히 훈련되어 있습니다.)

    반대의 경우도 마찬가지입니다. 우리는 따옴표를 사용하지 않고 테이블을 작성하는 경우 ...

    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'
    
  2. ==============================

    2.내 경우,이 오류는 테이블의 열 이름의 존재의 부족으로 발생했습니다.

    내 경우,이 오류는 테이블의 열 이름의 존재의 부족으로 발생했습니다.

    내가 "TABLENAME을 설명하는"실행되면, 내가 매핑 HBM 파일에 지정된 열을 찾을 수 없습니다.

    테이블을 변경 한 후에는 벌금을했다.

  3. ==============================

    3.DEPARTMENT_CODE 테이블 팀에 존재하는 열이 아닙니다. 적절한 열 이름을 찾기 위해 테이블의 DDL을 확인합니다.

    DEPARTMENT_CODE 테이블 팀에 존재하는 열이 아닙니다. 적절한 열 이름을 찾기 위해 테이블의 DDL을 확인합니다.

  4. ==============================

    4.참고로,이 경우에는 그 원인이 표 생성을위한 DDL 혼합 경우 열 이름이었다.

    참고로,이 경우에는 그 원인이 표 생성을위한 DDL 혼합 경우 열 이름이었다.

    그러나 "이전 스타일"을 혼합하고 ANSI 당신이 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 문은 위의 동일 및 오류를 생성하지 않습니다.

    당신이 그들을 혼합 할 때 당신은 운이 얻을 수있는, 또는 당신은 오라클은 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 스타일의 조인에 수동으로 이전 스타일로 변환하려고 시도했습니다, 한 번에, 그래서 점진적으로 하나 개의 테이블을하고 있었다. 이 나타납니다 나쁜 생각이었다합니다. 대신, 한 번에 모든 테이블을 변환하는 아마 더 좋은, 또는 테이블 밖으로 의견과 그 위치를 작성하는 새로운 ANSI 쿼리와 비교하기 위해 원래 쿼리의 조건.

  5. ==============================

    5.당신은 확실히 당신은 당신의 테이블 PS_TBL_DEPARTMENT_DETAILS에 열 DEPARTEMENT_CODE이 있습니까

    당신은 확실히 당신은 당신의 테이블 PS_TBL_DEPARTMENT_DETAILS에 열 DEPARTEMENT_CODE이 있습니까

    당신의 오류에 대한 자세한 정보

  6. ==============================

    6.나는 일식의 링크를 사용하여 JPA 2에서 같은 예외를했다. 나는 엔티티 하나 개의 관계를 하나 가진 @Embedded 클래스를했다. 실수로 내장 클래스에, 나는 또한 주석 @Table ( "상인")를 가지고 있었다. DB를이 그것은 또한 그 테이블의 존재 (상인 엔티티가 주요 기업에 포함 된 같은 잘못) 테이블 상인을 만든 기관에서 JPA에 의해 생성되었을 때 위의 예외에게 전하려고 할 때마다 원인이되었다 내 엔티티를 지속. 상인 테이블을 삭제 한 후 예외가 disappered.

    나는 일식의 링크를 사용하여 JPA 2에서 같은 예외를했다. 나는 엔티티 하나 개의 관계를 하나 가진 @Embedded 클래스를했다. 실수로 내장 클래스에, 나는 또한 주석 @Table ( "상인")를 가지고 있었다. DB를이 그것은 또한 그 테이블의 존재 (상인 엔티티가 주요 기업에 포함 된 같은 잘못) 테이블 상인을 만든 기관에서 JPA에 의해 생성되었을 때 위의 예외에게 전하려고 할 때마다 원인이되었다 내 엔티티를 지속. 상인 테이블을 삭제 한 후 예외가 disappered.

  7. ==============================

    7.또한 쿼리를 실행하는 사용자가 필요한 권한이 부여 된 확인하십시오.

    또한 쿼리를 실행하는 사용자가 필요한 권한이 부여 된 확인하십시오.

    테이블에 대한 쿼리를 위해 당신은 SELECT 권한을 부여해야합니다. 다른 객체 유형에 대한 쿼리의 경우 (예를 들어 저장 프로 시저) 당신은 EXECUTE 권한을 부여해야합니다.

  8. ==============================

    8.나는 인용 부호없이 값을 전달했다. 나는이 통과되면 작은 따옴표 내부의 조건은 마법처럼 일했다.

    나는 인용 부호없이 값을 전달했다. 나는이 통과되면 작은 따옴표 내부의 조건은 마법처럼 일했다.

    Select * from emp_table where emp_id=123;
    

    대신에 위의 사용이 :

    Select * from emp_table where emp_id='123';
    
  9. ==============================

    9.JPA를 통해 엔티티를 저장하려고 할 때이 오류가 있었다.

    JPA를 통해 엔티티를 저장하려고 할 때이 오류가 있었다.

    내가 @ManyToOne 주석이 없었 @JoinColumn 주석과 열을 가지고 있기 때문이다.

    추가 @ManyToOne이 문제를 해결했습니다.

  10. from https://stackoverflow.com/questions/6027961/ora-00904-invalid-identifier by cc-by-sa and MIT license