【问题标题】:INSERT..SELECT in Oracle always fails with "SQL command not properly ended"Oracle 中的 INSERT..SELECT 总是以“SQL 命令未正确结束”而失败
【发布时间】:2014-04-13 22:42:56
【问题描述】:

我精通 SQL-Server 和其他形式的 SQL,但我正在努力学习 Oracle SQL。由于某种原因,我什至无法让最简单的INSERT INTO .. SELECT .. 工作,它总是以“SQL 命令未正确结束。

这是我当前的示例:

CREATE TABLE table1 (year INT, id INT, dat DATE, categ VARCHAR(99));

INSERT INTO table1
(year, id, dat, categ)
select year, id, dat, categ from table1 where id=5000 and year=2013;

这是它的 SqlFiddle:http://sqlfiddle.com/#!4/c4d34/1

我似乎无法弄清楚这里出了什么问题。我在 SO 上检查了大约十几个其他相关问题,在 Google 上检查了十多个,但所有答案要么不适用,要么不起作用。我还尝试了上述命令的大约一百万种变体,但似乎没有任何效果。

任何帮助非常感谢


FWIW,我现在认为这只是一个 SQLFiddle 问题,正如许多人所说的那样。

使用我的代码向我报告问题的 Oracle 用户当然是使用完整的 SQL 语句,然后我才将其剥离以尝试隔离问题。 那个查询有一个完全不同的问题,只是碰巧在 SQLFiddle 中报告了相同的错误。具体来说,它的问题是我使用As 表示表别名,这在Oracle 中显然是无效的(或者可能只是在我编写的查询中)。

无论如何,衷心感谢所有试图帮助我的人。

【问题讨论】:

  • @Linger 生成“缺少表达式”错误。
  • 您使用哪个工具来运行该脚本? Oracle-XE (Express) 的 Web 界面不允许您将多个语句作为脚本运行。如果您正在使用 XE Web 界面(在浏览器中),您最好立即转储该界面并使用适当的 GUI 客户端(例如 SQL Developer 或任何其他客户端,甚至 SQL*Plus 会更好)
  • 不幸的是,我自己没有Oracle,我现在必须使用SQLFiddle,所以我不知道如何回答这个问题。对于我尝试过的所有其他情况,SQLFiddle 工具似乎确实允许 DDL 和多个 DML。 (我欢迎任何便宜的方式在我的桌面上安装 Oracle,比如 SQL Server 的开发人员版)。
  • 对我来说很好用。在 SQL Developer(来自 Oracle 的免费 IDE)中,将其放入 SQL 工作表并按 F5(运行脚本)。
  • 这不是一般的 Oracle 问题(您的脚本在我的 SQL 客户端中运行良好)。如果您使用左侧面板中的插入,它确实在 SQLFiddle 中工作:sqlfiddle.com/#!4/c5678/1

标签: oracle sqlfiddle


【解决方案1】:

我不知道你为什么会遇到这个问题,但语法没有问题

我认为这就是您在小提琴上执行查询的方式确切的工作)

看到这个http://sqlfiddle.com/#!4/38e62/1

【讨论】:

    【解决方案2】:
    CREATE TABLE table1 (year INT, id INT, dat DATE, categ VARCHAR(99))
    /
    
    INSERT INTO table1
    (year, id, dat, categ)
    select year, id, dat, categ from table1 where id=5000 and year=2013
    

    这有效,也就是说,如果您将两个语句都粘贴到 SQL fiddle 的左侧(模式)窗口中。我认为 SQL Fiddle 根本不允许在 SQL 窗口中使用 insert..select

    【讨论】:

    • SQLFiddle 允许在 SQL 窗口中插入。 INSERT..VALUES(..) 工作得很好。 INSERT..SELECT.. 适用于 SQLFiddle 中的其他 DBMS。
    • 和“;” 在我的示例的两个 SQLFiddle 窗口中选择的分隔符。
    • 尽管如此:该语句在左侧窗口中有效,而在右侧窗口中则失败,即使没有分号。
    • @RBarryYoung - 正如其他人指出的那样,Oracle SQLFiddle 右侧面板中的 INSERT...SELECT... 失败。将它移到左侧面板(参见this SQLFiddle),它工作正常。分享和享受。
    【解决方案3】:

    SQL Fiddle

    CREATE TABLE table1 (year INT, id INT, dat DATE, categ VARCHAR(99))
    //
    
    INSERT INTO table1 (year, id, dat, categ)
    SELECT year, id, dat, categ 
    FROM table1 
    WHERE id = 5000 AND year=2013
    //
    

    【讨论】:

    • 这只会产生更多错误:第一个之后的“缺少或无效选项”和第二个之后的“缺少表达式”。
    • 您的 SQLfiddle 拥有 Build-Schema 窗口中的所有内容,因此它永远不会在 Run SQL 窗口中执行 INSERT..SELECT。
    • 好的,CREATE TABLE 上的“缺少或无效选项”错误已通过更改 SQLFiddle 上的“语句终止符”下拉选项清除。但是当我尝试在 RunSQL 窗口中执行您的INSERT 时,原始错误仍然存​​在。
    • 这不是问题,可以选择并将数据插入同一张表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2021-11-17
    • 2014-04-15
    • 2022-01-18
    相关资源
    最近更新 更多