복붙노트

[SQL] 오라클 SQL 구문 : 인용 식별자

SQL

오라클 SQL 구문 : 인용 식별자

나는처럼 보였다 SQL 쿼리를 발생

select "hello"
from "foo"."bar"

나는 우리가 오라클에서 인용하고 인용되지 않은 식별자를 가질 수 있음을 발견 : 데이터베이스 개체 이름과 예선

나는 DBA를 요청하고이 이름 바 테이블이다하지만 "바"고 나에게 말했다

왜 그런 겁니까?

해결법

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

    1.테이블은 바 없습니다 BAR 또는 "바"라는 있지만 소문자에 있기 때문에 당신은 단지 큰 따옴표를 사용하여 참조 할 수 있습니다 :

    테이블은 바 없습니다 BAR 또는 "바"라는 있지만 소문자에 있기 때문에 당신은 단지 큰 따옴표를 사용하여 참조 할 수 있습니다 :

    select * from bar; -- will fail
    
    select * from "bar"; -- will succeed
    

    교훈은 다음과 같은 테이블을 생성하지!

  2. ==============================

    2.그것은 그 data_dictionary에서, 개체 이름은 모두 대문자로 저장됩니다 알고하는 데 도움이; 당신이 인용 식별자를 사용하지 않는 한 특별히 "이 문자 그대로의 이름으로이 테이블을 생성", "이 경우 민감하게 이름을 객체 이봐, 우리가 wan't"또는 다른 말로 오라클에게

    그것은 그 data_dictionary에서, 개체 이름은 모두 대문자로 저장됩니다 알고하는 데 도움이; 당신이 인용 식별자를 사용하지 않는 한 특별히 "이 문자 그대로의 이름으로이 테이블을 생성", "이 경우 민감하게 이름을 객체 이봐, 우리가 wan't"또는 다른 말로 오라클에게

    아래 -라는 테이블 줄을 작성, 당신은 'BAR에서', '바에서', '바에서'사용하여 선택할 수 있습니다. 당신이 오라클에 말을하지 작업 때문에 ''바 '에서'바 '나에게 말 그대로 소문자라는 이름의 테이블에서 결과를 "".

    "바"라는 이름의 테이블을 생성, 당신 만이 ''바 '에서'사용을 선택할 수 있습니다. 이는 '에서 바'를 번역에 'BAR에서'입니다.

    SQL> create table bar (x varchar2(1));
    
    Table created.
    
    SQL> 
    SQL> select * from bar;
    
    no rows selected
    
    SQL> select * from BAR;
    
    no rows selected
    
    SQL> select * from "bar";
    select * from "bar"
                  *
    ERROR at line 1:
    ORA-00942: table or view does not exist 
    
    
    SQL> select * from "BAR";
    
    no rows selected
    
    SQL> 
    SQL> drop table bar;
    
    Table dropped.
    
    SQL> 
    SQL> create table "bar" (x varchar2(1));
    
    Table created.
    
    SQL> 
    SQL> select * from bar;
    select * from bar
                  *
    ERROR at line 1:
    ORA-00942: table or view does not exist 
    
    
    SQL> select * from BAR;
    select * from BAR
                  *
    ERROR at line 1:
    ORA-00942: table or view does not exist 
    
    
    SQL> select * from "bar";
    
    no rows selected
    
    SQL> select * from "BAR";
    select * from "BAR"
                  *
    ERROR at line 1:
    ORA-00942: table or view does not exist 
    
    
    SQL> 
    SQL> drop table "bar";
    
    Table dropped.
    
    SQL> spool off
    
  3. ==============================

    3.뭔가를 인용하여 데이터베이스 엔티티에 비 부씩 일치를 강제합니다. 그래서 나는 토니의 대답은 거의 잘 생각 :

    뭔가를 인용하여 데이터베이스 엔티티에 비 부씩 일치를 강제합니다. 그래서 나는 토니의 대답은 거의 잘 생각 :

    select sysdate from dual; -- works
    
    select sysdate from DUAL; -- works
    
    select sysdate from "DUAL"; -- works
    
    select sysdate from "dual"; - FAILS
    

    당신이 인용 테이블이 인용 된 문자열을 사용하여 만든다면, 그때는 아마 그것을 참조하기 위해 인용 된 문자열을 사용해야합니다.

    나는 오라클과 실험,하지만 다른 DBMS를에 인용 식별자를 사용하면, 예를 들어 식별자로 예약어를 사용할 수 없습니다했습니다 다음은 유효한 것 (토끼 귀보다는 역 인용 부호를 사용) MySQL은 :

    SELECT `SUM` FROM `WHERE`;
    

    HTH

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

    4.당신이 인용 한 텍스트를 나타냅니다 같은 다른,하지만 비슷한 메모에서, 오라클에서 따옴표는 식별자가 아닌 문자열 상수를 나타냅니다. 귀하의 예제는 당신에게 "foo는". "바"가있는 경우에도 오류를 줄 것이다이 의미합니다. 이 간단한 예제를 생각해 봅시다 :

    당신이 인용 한 텍스트를 나타냅니다 같은 다른,하지만 비슷한 메모에서, 오라클에서 따옴표는 식별자가 아닌 문자열 상수를 나타냅니다. 귀하의 예제는 당신에게 "foo는". "바"가있는 경우에도 오류를 줄 것이다이 의미합니다. 이 간단한 예제를 생각해 봅시다 :

    SQL> SELECT "hello" FROM "DUAL";
    
    SELECT "hello" FROM "DUAL"
    
    ORA-00904: "hello": invalid identifier
    

    이 대 :

    SQL> SELECT 'hello' FROM "DUAL";
    
    'HELLO'
    -------
    hello
    

    "DUAL"는 식별자는이 경우에이 테이블을 나타낸다. 그것은 등 사용자, 열을 나타낼 수 있지만, 문자열 상수로 해석되지 않습니다.

  5. from https://stackoverflow.com/questions/6468337/oracle-sql-syntax-quoted-identifier by cc-by-sa and MIT license