关于oracle xe sql语句的问题,烦死了。 select ename from t_emp; 报"ENAME": invalid identifier错

如果写成这样 select "ename" from t_emp; 完全正确
这是为什么啊,请各位大虾帮帮忙,小弟感谢不急
最新回答
璎婲

2024-10-15 05:36:56

那可能是 你那里 创建表的时候

CREATE TABLE t_emp (
"ename" VARCHAR(10)
);
这样的方式来写了。

因为默认情况下。 Oracle 对表的字段名, 是不区分大小写的
也就是你
CREATE TABLE t_emp (
ename varchar(10)
);

CREATE TABLE T_EMP (
ENAME varchar(10)
);
执行后的结果是一样的。
Oracle 会自动把 小写的 表名/ 字段名 变为大写。
然后存储到数据字典里面去。

但是如果你是
CREATE TABLE t_emp (
"ename" VARCHAR(10)
);
那么 Oracle 认为你是要自己区分大小写了。 那么就不进行 自动的大小写转换了。

最后当你
select ename from t_emp;
的时候
Orale 自动 小写转大写
相当于
select ENAME from T_EMP

但是你数据库里面的字段名字, 是 小写的 "ename"
因此就会报 "ENAME": invalid identifier错误。
追问
Name     Type         Nullable Default Comments 
-------- ------------ -------- ------- --------
empno NUMBER(4)
ename VARCHAR2(20) Y
这是我创表的结构 字段名没有打引号啊。 这是为什么呢?
追答
不知道看了下面的执行结果, 你能不能明白。

SQL> CREATE TABLE t_emp1 (
2 "ename" VARCHAR(10)
3 );

表已创建。

SQL>
SQL> CREATE TABLE t_emp2 (
2 ename VARCHAR(10)
3 );

表已创建。

SQL> desc t_emp1;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ename VARCHAR2(10)

SQL> desc t_emp2;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ENAME VARCHAR2(10)

也就是当你查询表结构的时候, 如果看到的是 小写字母。
那么你查询的时候, 就 必须自己加 双引号了。
加双引号的目的, 就是告诉 Oracle , 我这个字段, 是要 区分大小写的。
不加双引号。 Oracle 自动把所有的 字段, 转换为大写。
栀夏暖阳

2024-10-15 03:13:08

是你创建的时候打引号了
也就是说 create table "ename"...
正确的方法应该是 create table "ENAME"... 或 create table ename
oracle 对于数据字典,默认都会转换为大写,但如果使用双引号时就不转换了
也就是说oracle在系统表中记录着所有表的名称,如果表被创建时,没有使用双引号,则名称会被转换成大写后保存在系统表中,如果使用双引号,则不改变大小写保存在系统表中
查询时也使用相同的规则.
暴躁的喵

2024-10-15 03:19:26

你查看t_emp 表列时 看看列是不是大写的,如果不是大写的话,你就编辑先重建表下,直到看到列为大写为止