bigquery存储过程delete语句删除不应该删除的行

sulc1iza  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(363)

当我使用存储过程执行 DELETE 带有 WHERE 从句,从句似乎被忽略了。
复制步骤:

创建bq表

CREATE TABLE `[project].[dataset].test` (
   email STRING NOT NULL,
   providerId STRING NOT NULL
);

添加测试数据

insert into `[project].[dataset].test` (email, providerId) values ('test.email@gmail.com', 'test1');
insert into `[project].[dataset].test` (email, providerId) values ('test.email@gmail.com', 'test2');

创建一个以email和providerid作为输入的存储过程

CREATE OR REPLACE PROCEDURE `[project].[dataset].RemovePermission`(IN providerId STRING, IN email STRING)
BEGIN
  DELETE FROM `[project].[dataset].test` p
  WHERE       p.email = email
              AND p.providerId = providerId;
END;

执行存储过程

CALL [project].[dataset].RemovePermission('test1', 'test.email@gmail.com`)

注意,响应被删除了2行,测试表现在是空的。
相反,如果手动执行delete,如下所示,只删除1行-这是正确的行为。

DELETE FROM `[project].[dataset].test` p
  WHERE       p.email = 'test.email@gmail.com'
              AND p.providerId = 'test1';

我做错什么了?

mftmpeh8

mftmpeh81#

参数名称 email, providerId 与列名“冲突” email, providerId 因此 WHERE p.email = email AND p.providerId = providerId 总是 true 只要更改参数名称,它就应该按预期工作。像这样的

CREATE OR REPLACE PROCEDURE `project.dataset.RemovePermission`(IN Id STRING, IN txt STRING)
BEGIN
  DELETE FROM `project.dataset.test` p
  WHERE p.email = txt
  AND p.providerId = Id;
END;

相关问题