oracle别名用中文,Oracle 指定别名"A" or"a"造成的问题

今天遇到一个奇怪的问题: 本来打算给一个数据检查的视图做一个参数表.

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" 必须为大写,否则会报错.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值