ORA-00904: अमान्य पहचानकर्ता


84

मैंने 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

क्या आपको यकीन है कि कॉलम नाम Department_Code सही ढंग से लिखा गया है?
फबरीज़ियो डी'अमासा

हां एक कॉलम है
विभाग_कोड

6
TL; DR: सिंगल कोट्स का उपयोग करें ''
एंड्रयू

जवाबों:


128

आपकी समस्या उन खतरनाक दोहरे उद्धरण चिह्नों की है।

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>

tl; डॉ

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'

28
इन अमानवीय प्रथाओं के साथ ओरेकल के कारणों के स्तर का वर्णन करने के लिए Pernicious भी शुरू नहीं करता है।
डॉन स्कॉट

13

मेरे मामले में, तालिका में कॉलम नाम की मौजूदगी की कमी के कारण यह त्रुटि हुई।

जब मैंने " describe tablename" निष्पादित किया , तो मैं मैपिंग hbm फ़ाइल में निर्दिष्ट कॉलम को खोजने में सक्षम नहीं था।

तालिका में फेरबदल करने के बाद, इसने ठीक काम किया।


1
एक और मामला पूरी तालिका के लापता होने का है।
हौयू चेन

5

FYI करें, इस मामले में कारण तालिका निर्माण के लिए DDL में मिश्रित केस कॉलम नाम पाया गया था।

हालाँकि, यदि आप "पुरानी शैली" मिला रहे हैं और ANSI जुड़ता है तो आपको वही त्रुटि संदेश मिल सकता है जब DDL अपरकेस टेबल नाम के साथ ठीक से किया गया था। यह मेरे साथ हुआ, और Google ने मुझे इस स्टैकओवरफ़्लो पृष्ठ पर भेजा ताकि मुझे लगे कि मैं यहाँ था।

--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 क्वेरी के साथ तुलना करने के लिए मूल क्वेरी में स्थितियां हैं।


4

DEPARTMENT_CODE एक स्तंभ नहीं है जो तालिका टीम में मौजूद है। उचित कॉलम नाम खोजने के लिए तालिका के डीडीएल की जाँच करें।


1
कॉलम टेबल में मौजूद है
जिसकी

1
क्या आप हमें तालिका का डीडीएल PS_TBL_DEPARTMENT_DETAILS दे सकते हैं?
दाताजम

1
बनाएँ "HRMS"। "PS_TBL_DEPARTMENT_DET Colors" ("कंपनी कोड" VARCHAR2 (255), "कंपनी का नाम" VARCHAR2 (255), "Sector_Code" VARCHAR2 (255), "Sector_Name" VARCHAR2 (255)), "Business_Unit_nit_bear_" ), "Business_Unit_Name" VARCHAR2 (255), "Department_Code" VARCHAR2 (255), "Department_Name" VARCHAR2 (255), "HR_ORG_ID" VARCHAR2 (255), "HR_ORG_Name" VARCHAR2 (255), "Cost_C_N_N" "" VARCHAR2 (255)) सेगमेंट सृजन तत्काल PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRES
Navaneethan

4
यदि वह वास्तव में डीडीएल है, तो कॉलम को केस-संवेदी बनाया गया है। आपको कॉलम परिभाषाओं से दोहरे उद्धरणों को हटा देना चाहिए। यदि आप तालिका को फिर से नहीं बना सकते हैं, तो टीम का उपयोग करें। "Department_Name" अपने चयनित विवरण में।
दाताजाम

4
मुझे विशेष रूप से अंतिम कॉलम नाम पसंद है; कोई अनुमान लगाता है कि वहाँ क्या जमा हो जाता है?
एलेक्स पोले

2

क्या आप वाकई एक स्तंभ है कर रहे हैं DEPARTEMENT_CODE अपनी मेज पर PS_TBL_DEPARTMENT_DETAILS

अपने ERROR के बारे में और अधिक जानकारी

ORA-00904: string: अमान्य पहचानकर्ता कारण: दर्ज किया गया स्तंभ नाम या तो अनुपलब्ध है या अमान्य है। क्रिया: एक मान्य स्तंभ नाम दर्ज करें। एक मान्य स्तंभ नाम एक अक्षर से शुरू होना चाहिए, 30 वर्णों से कम या बराबर होना चाहिए, और इसमें केवल अल्फ़ान्यूमेरिक वर्ण और विशेष वर्ण $, _, और # शामिल होंगे। यदि इसमें अन्य वर्ण हैं, तो इसे d दोहरे उद्धरण चिह्नों में संलग्न किया जाना चाहिए। यह एक आरक्षित शब्द नहीं हो सकता है।


1

जेपीए के माध्यम से एक इकाई को बचाने की कोशिश करते समय मुझे यह त्रुटि हुई।

ऐसा इसलिए था क्योंकि मेरे पास @JoinColumnएनोटेशन वाला एक कॉलम था जिसमें एनोटेशन नहीं था @ManyToOne

@ManyToOneनिश्चित मुद्दा जोड़ना ।


0

मुझे JPA 2 में समान लिंक का उपयोग करके समान अपवाद मिला। मेरे पास एक इकाई के साथ एक से एक संबंध के साथ एक @embedded वर्ग था। गलती से, एम्बेडेड क्लास में, मेरे पास एनोटेशन @Table ("TRADER") भी था। जब DB को JPA ने संस्थाओं से बनाया था तो उसने एक तालिका TRADER भी बनाई थी (जो कि एक गलत था जैसा कि ट्रेडर इकाई मुख्य इकाई से जुड़ा हुआ था) और उस तालिका का अस्तित्व हर बार उपरोक्त अपवाद पैदा कर रहा था, जिसमें मैं कोशिश कर रहा था मेरी इकाई बनी रहे। TRADER तालिका को हटाने के बाद अपवाद गायब हो गया।


0

यह भी सुनिश्चित करें कि क्वेरी जारी करने वाले उपयोगकर्ता को आवश्यक अनुमति दी गई है।

तालिकाओं पर प्रश्नों के लिए आपको सेलेक्ट अनुमति देने की आवश्यकता है।
अन्य ऑब्जेक्ट प्रकारों (जैसे संग्रहीत प्रक्रियाओं) पर प्रश्नों के लिए आपको EXECUTE की अनुमति देने की आवश्यकता है।


0

मैं बिना उद्धरणों के मूल्यों को पारित कर रहा था। एक बार जब मैंने एकल उद्धरणों के अंदर की स्थितियों को पारित कर दिया, तो एक आकर्षण की तरह काम किया।

Select * from emp_table where emp_id=123;

उपर्युक्त उपयोग के बजाय यह:

Select * from emp_table where emp_id='123';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.