今天遇到一个奇怪的问题: 本来打算给一个数据检查的视图做一个参数表.
SQL>create table d_data_look_over as select distinct upper(table_name) "table_name" from dw_log where start_date>trunc(sysdate-10);
SQL> table created
SQL> select table_name from d_data_look_over ;
select table_name from d_data_look_over
ORA-00904: "table_name": invalid identifier 报无效的标识符.
在其他数据库下进行测试 没有发现异常
百思不得其解,难道数据库出了问题? 但是执行下面的语句又是正常的
SQL>select * from d_data_look_over;
SQL>36 rows selected
无意之间仔细检查创建表的语句,发现别名指定为小写的"table_name"
SQL>select "table_name" from d_data_look_over;
SQL>36 rows selected
这样是可以正常查询的
将这个表删除之后重新建了一次 并且将引号中的别名改为大写
SQL>create table d_data_look_over as select distinct upper(table_name) "TABLE_NAME" from dw_log where start_date>trunc(sysdate-10);
SQL> table created
SQL> select table_name from d_data_look_over;
SQL>36 rows selected
可以正常查询没有问题.
end;
ps: 有时候字符问题确实能对初学者造成很大的困惑,昨天一个客户在QQ上说他写的一个存储过程无论如何也无法编译成功,于是我让他把脚本传过来,仔细查看之后没有发现问题,语句也完全是正常的,但是一直提示execute immediate这一行有问题,无意之间将这一行前面的空格删除之后 居然编译成功了 compiled successfully.之后考虑报错之由于前面的空格是中文全角空格造成的,删除了这个全角空格 自然也就不再报错了. 经过测试发现果然如此,中文输入法下也是正常的 但是切换为全角之后输入的空格就被认为是字符,从而无法成功编译.
后记:发用这个方法可以实现使用Oracle的保留字作为字段
例如:
SQL>create table zyp (LEVEL number(1),
SQL> COLUMN varchar2(10));
ORA-00904:无效的标识符.
SQL>create table zyp ("LEVEL" number(1),
SQL> "COLUMN" varchar2(10));
Table created
但是要注意在查看的时候 需要加上"LEVEL" 必须为大写,否则会报错.