Oracle SQL,列名给出 ORA-00911:无效字符

如何解决Oracle SQL,列名给出 ORA-00911:无效字符

我通过一个pivot语句创建了一个表,它会自动创建一些以数字开头的变量名。

create table MYTAB as
select *
from (select x,anno,v,delta from tab_a13_2 where anno in(2017,2018,2019))
pivot(sum(v)  as v,sum(delta) as d for anno in (2017,2019)) 
where ordine > 0
order by ordine;

select * from MYTAB;
x 2017_V    2017_D  2018_V  2018_D  2019_V  2019_D
1   1.01    -3.18     1.04   11.18    0.96   -6.87
2   1.28     0.09     1.28    7.33    1.25   -1.49
...

但是,如果我尝试在选择中指定列名,则会收到此错误

select x,2017_V,2018_V,2019_V,2017_D,2018_D,2019_D 
from MYTAB;

Error at line 5:
ORA-00911: invalid character
           2017_V,^
1 statement Failed.

我不明白。要么我不允许创建以数字开头的列名,因此表创建应该失败,要么我应该能够使用它们。 我检查了列名没有被引用,即“2017_V”。

解决方法

来自 Database Object Names and Qualifiers 文档:

数据库对象命名规则

每个数据库对象都有一个名称。在 SQL 语句中,您用带引号的标识符或不带引号的标识符表示对象的名称。

  • 带引号的标识符以双引号 (") 开头和结尾。如果使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。
  • 未加引号的标识符没有被任何标点符号包围。

...

  1. 未加引号的标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。

您有一个以数字开头的标识符。这告诉您解决方案是使用带引号的标识符并用双引号将列名括起来:

select x,"2017_V","2018_V","2019_V","2017_D","2018_D","2019_D" 
from   MYTAB;
,

一种选择是,在创建表格时,不要创建以数字开头的列。执行 PIVOT 时,您可以为 IN 子句中的值设置别名,以便从数据透视生成的列对用户更加友好。尝试使用如下语句创建您的表:

  SELECT *
    FROM (SELECT x,anno,v,delta
            FROM tab_a13_2
           WHERE anno IN (2017,2018,2019))
         PIVOT (SUM (v) AS v,SUM (delta) AS d
               FOR anno
               IN (2017 AS year_2017,2018 AS year_2018,2019 AS year_2019))
   WHERE ordine > 0
ORDER BY ordine;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?