此过程是否有理由不更新我的表?

时间:2019-10-14 00:03:49

标签: sql oracle plsql

下面的代码应该执行以下操作: 1:读取txt文件 2:将其打印到CSV文件中; 3:更新数据库中的“ CATEGORY2”表

这不是按照我想要的方式更新表格。这是正确的方法吗?如果要在此过程中使用更新语句正确,那么它必须是INSERT INTO。

CustomPanel

我目前没有收到任何错误,但它根本没有更新我的表。 这将读取TXT文件并将其写入CSV文件,只是不更新​​所需的Tablle。信息。

2 个答案:

答案 0 :(得分:3)

发现符合条件的零条记录的UPDATE语句不会被视为失败,因此即使没有记录更新,PL / SQL也会继续执行而不会出错。

  UPDATE Category2  ---Should this insert the values int the Category tablE??????????
  SET Category_ID= mvi, Category_name= textout
  WHERE mvi = CATEGORY_ID;

您的代码似乎将mvi初始化为1,然后在每次循环执行时递增。该逻辑似乎假设category_id从文件第一行的1开始,一直到对应于文件最后一行的最大ID。如果确实如此,那很好。但是我会检查一下category2表中有哪些记录,并检查category_id值是否确实符合您的期望。

如Rustam所指出的那样,您的UPDATE也不必要地更新category_id=mvi,它没有任何用处(因为where子句已经确定它们已经相同)。

答案 1 :(得分:0)

也许您的答案已经内置在脚本中:

UPDATE Category2  ---Should this insert the values int the Category tablE??????????

这意味着您希望插入不存在但没有插入的行。那么这个问题的答案是否定的。如所示,影响0行的更新不视为错误,但这也不表示应创建行。如果确实是您要寻找的功能,那么您需要Merge语句而不是update。

Merge into Category2 c2
  using (select mvi, textout from dual) m
     on (m.mvi = c2.category_id)
  when matched then
          set c2.category_name = m.testout
  when not matched then 
       insert (category_id, category_name)
       values (m.mvi, m.textout);

如果请求的category_id没有退出,您将获得插入内容。但是,我同意@JeffreyKemp关于假定逻辑的观点,这似乎有点基于可疑的假设。另外,要获得完整答案,您需要提供测试数据(格式为文本)以及该数据的预期输出。