INSERT … SELECT :缺少 SELECT 关键字

INSERT … SELECT : missing SELECT keyword

我正在尝试使用递归 CTE 将字符串拆分为多个值。然后将数据插入另一个 table.

以下在 PostgreSQL 中有效:

CREATE TABLE test(data varchar(255));

WITH RECURSIVE
    cte(genres) AS (SELECT 'apple,banana,cherry,date'),
    split(genre,rest,genres) AS (
        SELECT '', genres||',',genres FROM cte
        UNION ALL
        SELECT
            substring(rest,0,position(',' IN rest)),
            substring(rest,position(',' IN rest)+1),
            genres
        FROM split WHERE rest<>''
    )
INSERT INTO test(data)
SELECT genre
FROM split;

然而,Oracle 版本:

CREATE TABLE test(data varchar(255));
WITH
    cte(genres) AS (SELECT 'apple,banana,cherry,date' FROM dual),
    split(genre,rest,genres) AS (
        SELECT '', genres||',',genres FROM cte
        UNION ALL
        SELECT
            substr(rest,1,instr(rest,',')-1), 
            substr(rest,instr(rest,',')+1),
            genres
        FROM split WHERE rest IS NOT NULL
    )
INSERT INTO test(data)
SELECT genre
FROM split WHERE genre IS NOT NULL;

给我错误信息:

ORA-00928: missing SELECT keyword.

现在我很确定我有一个,在 INSERT 和下面的 FROM 之间。

注释掉INSERT,剩下的就给出结果了。在其他地方,我知道一个简单的 INSERT … SELECT 确实有效。

与递归CTE有关吗?如何使用标准递归 CTE 使其正常工作?

在 Docker 映像中使用 Oracle 18c。这里有一个fiddle:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=d24f3105634933af1b7072bded1dacdf .

INSERT-SELECT 表示首先是“INSERT”命令,然后是 SELECT 部分,WITH 是 SELECT 的一部分而不是插入。

SQL> create table t ( x int );

Table created.

SQL> with blah as ( select 1 c from dual)
  2  insert into t
  3  select * from blah;
insert into t
*
ERROR at line 2:
ORA-00928: missing SELECT keyword


SQL> insert into t
  2  with blah as ( select 1 c from dual)
  3  select * from blah;

1 row created.