118 Stimmen

ORA-00904: Ungültiger Bezeichner

Ich habe versucht, die folgende Inner-Join-Abfrage mit einer Oracle-Datenbank zu schreiben:

 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

Dies führt zu der folgenden Fehlermeldung:

 INNER JOIN PS_TBL_DEPARTMENT_DETAILS Team ON Team.DEPARTMENT_CODE = Employee.DEPTID
                                              *
ERROR at line 4:
ORA-00904: "TEAM"."DEPARTMENT_CODE": invalid identifier

Die DDL einer Tabelle lautet:

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

0 Stimmen

Sind Sie sicher, dass der Spaltenname Department_Code richtig geschrieben ist?

0 Stimmen

Ja, es gibt eine Spalte Department_Code

16 Stimmen

TL;DR: einfache Anführungszeichen verwenden '' .

166voto

APC Punkte 140727

Ihr Problem sind diese verhängnisvollen Anführungszeichen.

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 erlaubt es uns, die Groß- und Kleinschreibung von Datenbankobjektnamen zu ignorieren, sofern wir sie entweder mit Namen in Großbuchstaben oder ohne doppelte Anführungszeichen erstellen. Wenn wir im Skript gemischte Groß- oder Kleinschreibung verwenden und die Bezeichner in doppelte Anführungszeichen einschließen, sind wir dazu verurteilt, doppelte Anführungszeichen und die genaue Groß-/Kleinschreibung zu verwenden, wenn wir uns auf das Objekt oder seine Attribute beziehen:

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

Verwenden Sie keine doppelten Anführungszeichen in DDL-Skripten

(Ich weiß, dass die meisten Codegeneratoren von Drittanbietern dies tun, aber sie sind diszipliniert genug, um alle ihre Objektnamen in GROSSBUCHSTABEN zu schreiben).


Das Gegenteil ist ebenfalls der Fall. Wenn wir die Tabelle ohne doppelte Anführungszeichen erstellen

create table PS_TBL_DEPARTMENT_DETAILS
( company_code VARCHAR2(255),
  company_name VARCHAR2(255),
  Cost_Center_Number VARCHAR2(255))
;

können wir auf sie und ihre Spalten verweisen, wie es uns beliebt:

select * from ps_tbl_department_details

oder

select * from PS_TBL_DEPARTMENT_DETAILS;

oder

select * from PS_Tbl_Department_Details
where COMAPNY_CODE = 'ORCL'
and cost_center_number = '0980'

17voto

Sireesh Yarlagadda Punkte 11586

In meinem Fall trat dieser Fehler auf, weil der Spaltenname in der Tabelle nicht vorhanden war.

Wenn ich " describe tablename " konnte ich die in der Mapping-HBM-Datei angegebene Spalte nicht finden.

Nachdem ich die Tabelle geändert hatte, funktionierte sie einwandfrei.

5voto

qyb2zm302 Punkte 6433

Zu Ihrer Information: In diesem Fall wurde als Ursache ein Spaltenname mit gemischter Groß-/Kleinschreibung in der DDL für die Tabellenerstellung festgestellt.

Wenn Sie jedoch "Old Style"- und ANSI-Joins mischen, können Sie dieselbe Fehlermeldung erhalten, selbst wenn die DDL ordnungsgemäß mit einem Tabellennamen in Großbuchstaben durchgeführt wurde. Dies geschah zu mir, und Google schickte mich zu dieser Stackoverflow-Seite, so dass ich dachte, ich würde teilen, da ich hier war.

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

Die beiden obigen SQL-Anweisungen sind gleichwertig und führen zu keinem Fehler.

Wenn Sie versuchen, sie zu mischen, können Sie Glück haben, oder Sie können einen Oracle hat einen ORA-00904-Fehler erhalten.

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

Und die wenig hilfreiche Fehlermeldung, die das Problem gar nicht wirklich beschreibt:

>[Error] Script lines: 1-12 -------------------------
ORA-00904: "A"."EMPLID": invalid identifier  Script line 6, statement line 6,
column 51 

In dem folgenden Blogbeitrag habe ich einige Untersuchungen dazu gefunden:

In meinem Fall habe ich versucht, manuell von Joins im alten Stil zu ANSI-Joins zu konvertieren, und zwar schrittweise, eine Tabelle nach der anderen. Das scheint eine schlechte Idee gewesen zu sein. Stattdessen ist es wahrscheinlich besser, alle Tabellen auf einmal zu konvertieren oder eine Tabelle und ihre Where-Bedingungen in der ursprünglichen Abfrage auszukommentieren, um sie mit der neuen ANSI-Abfrage zu vergleichen, die Sie schreiben.

4voto

hakima maarouf Punkte 477

In meinem Fall erhielt ich diesen Fehler, als ich versuchte, eine neue Tabelle in Oracle wie folgt zu erstellen , in der letzten Zeile

create table products(
  id_pro number primary key,
  product_name varchar2(20),
);

Durch Entfernen , das Problem wie folgt gelöst

create table products_test(
  id_pro number primary key,
  product_name varchar2(20)
);

4voto

Datajam Punkte 4091

DEPARTMENT_CODE ist keine Spalte, die in der Tabelle Team existiert. Überprüfen Sie die DDL der Tabelle, um den richtigen Spaltennamen zu finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X