2016-11-09 48 views
2

我已经创造了一些非常基本的SQL脚本的命令:的Oracle SQL Developer把我的意见为

/* 
    Change date format 
*/ 
alter session set nls_date_format='DD/MM/YYYY'; 

/* 
    Drop old tables (if exists) 
*/ 
DROP TABLE Students; 

/* 
    Create new tables 
*/ 
CREATE TABLE Students 
    (
    Id NUMBER(6) PRIMARY KEY, 
    LastName VARCHAR2(20), 
    FirstName VARCHAR2(10), 
    Address VARCHAR2(10), 
    BirthDay DATE, 
    GroupId NUMBER(3) 
); 

/* 
    Check the table was created successfully 
*/ 
DESC Students; 

/* 
    Insert a new record to the table 
*/ 
INSERT INTO Students VALUES(101, 'Solin', 'Dan', 'Beer-Sheva', '01/02/1985', 11); 

/* 
    Check the record was inserted succesfully 
*/ 
SELECT * FROM Students; 

/* 
    Add 'AvgMark' field to the table with default of 0 
*/ 
ALTER TABLE Students ADD AvgMark NUMBER(5,2) DEFAULT 0; 

/* 
    Check that the new field was added 
*/ 
DESC Students; 

/* 
    Insert 3 new records to the table 
*/ 
INSERT INTO Students VALUES(102, 'Tal', 'Ruti', 'Tel-Aviv', '10/07/1988', 12, 70); 
INSERT INTO Students VALUES(103, 'Kohen', 'Yossi', 'Dimona', '01/08/1987', 11, 80); 
INSERT INTO Students VALUES(104, 'Toys', 'Vered', 'Tel-Aviv', '15/09/1988', 12, 90); 

/* 
    Check the records were inserted succesfully 
*/ 
SELECT * FROM Students; 

/* 
    Change 'Address' data type to VARCHAR2(15) 
*/ 
ALTER TABLE Students MODIFY Address VARCHAR2(15); 

/* 
    Check that the data type has changed 
*/ 
DESC Students; -- Some comment 

Script Output我得到这个错误消息的结尾: ERROR: object COMMENT does not exist

如果我”我会得到同样的错误WORLD“对象”...

我改变了整个脚本,以避免单行注释,结果是一样的。

我可以再次避免在这个例子中,但我真的想了解是什么导致了这个奇怪的问题......


另一件事,这可能有助于解决这个问题,是另一种奇怪的错误我都在相同的脚本,在评论之上几行。在这条线: ALTER TABLE Students MODIFY Address VARCHAR2(15);

SQL开发人员显示我的最后两个字符下称Syntax error. Partially recognized rules (Railroad diagrams): ...

如果我要跑的声明,它会工作得很好错误(右括号和分号)..

+0

使用'--'。两个连字符应始终在SQL代码中工作(这是注释的ANSI标准)。 –

+2

我想这是因为'DESC'不是一个真正的SQL语句。它最终甚至不需要';'。 'desc学生; - bla'导致SQL \ * Plus中的“无效标识符”。 SQL Developer试图模仿我猜测的SQL \ * Plus行为。所以你唯一的选择是在你使用'DESC'的行中不要使用'--'注释。' –

+0

@a_horse_with_no_name - 实际上这不是因为'DESC'是一个SQL \ * Plus命令(与SQL或PL相对)。相反,无论声明是什么类型,注释都不能在声明终结符之后出现。 – mathguy

回答

4

这看起来像一个SQL Developer的bug /功能。


desc [ribe]是SQL Worksheet支持的SQL * Plus语句之一。

https://docs.oracle.com/cd/E11882_01/doc.112/e12152/intro.htm#RPTUG10710


在SQL Developer中,我们可以看到,不存在SQL * Plus中一些有趣的现象:
1. 给出多个令牌时,所有的令牌都被忽略除了最后一个。

desc some gibberish - yada yada yada t3 

Name Null Type  
---- ---- ---------- 
C3  NUMBER(38) 

2. --不被视为对行注释的符号,但作为一个对象的名称。

desc -- 

ERROR:       
------------------------------- 
ERROR: object -- does not exist 

3. 单分号被忽略,而不是被当作语句结束。

desc ; ; ; ; ; ; t1; 

Name Null Type  
---- ---- ---------- 
C1  NUMBER(38) 

因此,当给出的命令 -

DESC Students; -- Some comment 

只有最后一个令牌“评论”被处理,并产生一个错误,因为没有对象“注释” 。

+0

我在4.2中看不到这种行为;哪个版本你看到它,出于兴趣? –

+1

@AlexPoole,4.1.3.20 –