【问题标题】:Using where clause in Insert statement while in CURSOR在 CURSOR 中的 Insert 语句中使用 where 子句
【发布时间】:2018-02-01 02:23:26
【问题描述】:

我正在运行此代码并收到此错误ORA-00933 SQL command not properly ended

您将如何编写此代码以使此错误不存在? member_addresses_to_remove 是CURSOR

 FOR curr_element IN member_addresses_to_remove 
  LOOP
    INSERT INTO schema.tablename(ID,NAME, PHONE_NUMBER)
    VALUES (curr_element.ID, curr_element.NAME,curr_element.PHONE_NUMBER)
    WHERE NOT EXISTS (SELECT 1
                      FROM SCHEMA.OTHERTABLE OT
                      WHERE OT.ID = curr_element.ID);                        
  END LOOP;
COMMIT;

【问题讨论】:

  • 将 SELECT [your columns] 的 VALUES 从 dual .... 更改为应该可以工作
  • 也许你只是忘了删除 INSERT 语句中的 WHERE 条件,
  • @JorgeCampos 我这样做了,现在它说 ORA-00907 缺少右括号。我有所有关闭的括号。这是你熟悉的东西吗?另外为什么从双重工作?它在那里做什么?
  • 好吧,我认为您没有从列中删除括号?我不够清楚,我想说选择不带括号的列.... :)

标签: sql database oracle plsql


【解决方案1】:

您的语法不正确,因为您将 values 子句与 where 子句组合在一起。

试试这个:

 FOR curr_element IN member_addresses_to_remove 
  LOOP
    INSERT INTO schema.tablename(ID,NAME, PHONE_NUMBER)
    SELECT curr_element.ID, curr_element.NAME,curr_element.PHONE_NUMBER
    FROM DUAL
    WHERE NOT EXISTS (SELECT 1
                      FROM SCHEMA.OTHERTABLE OT
                      WHERE OT.ID = curr_element.ID);                        
  END LOOP;
COMMIT;

【讨论】:

  • 你不太可能需要这个循环。您可能编写了一条 INSERT INTO 语句,而根本没有使用游标。但是您还没有显示该代码,这应该可以解决您的直接问题。
  • 谢谢!这行得通。你能解释一下为什么双重工作吗?那是如何从光标中的当前元素中获取我的数据的?
  • 你不能在 values 子句后面放任何东西,所以你需要一个表来选择。 Dual 有一行。
  • 嗨@WW。正如您已经评论的那样,我还将在您的答案中添加插入选择语句,以便 OP 可以选择正确的方法:) +1 无论如何
【解决方案2】:

插入语句语法错误,请检查以下示例。

INSERT INTO trg_tbl (col1, col2, col3)
SELECT col1,
       col2,
       col3
FROM src_tbl
WHERE col4 = myvale;

通过在 SQLPlus 中执行单个 SQL 语句来测试 SQL,然后添加它的过程

【讨论】:

  • 我正在尝试从带有 where 子句的 CURSOR 插入数据,以查看另一个表中是否存在值。如果是这样,那么我不想插入该数据。
  • 嗨,好的,我知道了。但我认为您可以在不使用游标的情况下在单个 SQL 语句中完成所有操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2013-03-12
  • 2018-07-04
相关资源
最近更新 更多