【发布时间】:2015-06-15 21:50:09
【问题描述】:
此查询返回 1 行:
SELECT col1, col2 FROM table1 WHERE col1 = :column1;
但这更新了 0 行:
UPDATE table1 SET col2 = :column2 WHERE col1 = :column1;
COMMIT;
我添加了这个约束来将 col1 设置为主键,但它没有修复它。
ALTER TABLE table1 ADD CONSTRAINT col1_pk PRIMARY KEY (col1);
我正在从 SQL Developer 尝试这个,知道为什么它不更新行吗?
编辑:
col1 是VARCHAR2(32 BYTE) NOT NULL
col2 是CLOB NOT NULL
EDIT 2:测试用例,在选择和更新语句中设置 :var1 为 0011223344556677。
CREATE TABLE MY_TABLE
( COL1 VARCHAR2(32 BYTE) NOT NULL ENABLE,
COL2 CLOB,
CONSTRAINT "MY_TABLE_PK" PRIMARY KEY ("COL1")
)
INSERT INTO MY_TABLE (COL1, COL2) VALUES ('0011223344556677', '1434407992143440799214344079921434407992');
SELECT * FROM MY_TABLE WHERE COL1 = :var1;
UPDATE MY_TABLE SET COL2 = 'test' WHERE COL1 = :var1;
COMMIT;
【问题讨论】:
-
某些东西无法追踪。如果
select返回单行,则update将修改恰好1 行,假设它们在相同的上下文中运行。如果您的select在它选择的行未提交的会话中运行,而update在不同的会话中运行,则update将看不到有问题的行。如果其他会话在update发生并提交更改之前删除了该行,则update将更新 0 行。不过,在某种程度上,提供一个显示该行实际上没有更新的测试用例会很有帮助。 -
如何确定
update修改了0行?如果所有这些都在单个会话中完成并且select返回一行,则两个语句的绑定变量值实际上不同,或者您实际上没有执行update或update正在修改行,你错过了它。 -
感谢 @JustinCave,检查 Edit 2 中的测试用例。 SQL Developer 显示消息:“0 行已更新。提交完成。”在脚本输出中。我在同一个会话中使用相同的绑定变量值进行选择和更新。
-
你怎么知道绑定变量的值对于两个语句是一样的?
-
当我在 SQL Developer 中执行语句时,它会提示一个对话框输入绑定,在那里我输入 0011223344556677 for :var1 (实际上,sql developer 存储了这个值,所以我只需要输入一次)。你试过测试用例吗?它会更新您环境中的行吗?
标签: oracle bind-variables