执行立即更新返回NULL,而非字符串查询工作正常

问题描述 投票:0回答:1

我有一个更新查询,工作正常。一旦我把它放在我的PLSQL块中它返回NULL并且没有错误。在块的这一部分之前,我在目标表中插入一个默认值,因此我知道更新实际上是将字段更新为NULL。由于此查询将每个列组的行计为另一列,因此总是有一个值。我从字符串外部的查询中获取正确的计数。

当我将查询放在我的plsql块中时,我使用Execute immediate,查询将是一个字符串,其中my_table_name和my_column_names和Table_1是可变的。

我搜索了很多,发现了我应该承诺的东西等等。但问题仍然存在。

例如:Need help in execute immediate update query

    update Table_FINAL r
set column_1  = 
(
    select max(totalcount)
    from    (
            select 'my_table_name' as table_name, 'my_collumn_name' as column_name, column_3, count(*) as totalcount
            from  my_table_name a
            where exists (select 1 from Table_2 where Table_2.column_x = a.column_x)
            group by column_3
            ) s 
    where r.column_3 = s.column_3
)
;

这里是字符串:

    execute immediate 'update Table_FINAL r
set column_1  = 
(
    select max(totalcount)
    from    (
            select ''' || my_table_name || ''' as table_name, ''' || my_collumn_name || ''' as column_name, column_3, count(*) as totalcount
            from ' ||  my_table_name || ' a
            where exists (select 1 from Table_2 where Table_2.column_x = a.column_x)
            group by column_3
            ) s 
    where r.column_3 = s.column_3
)'
;
oracle plsql dynamic-sql
1个回答
2
投票

它将column_1更新为NULL

如果动态SQL没有返回任何行,则totalcount将为null,因此max(totalcount)将为null,在这种情况下,column_1将更新为null。

有几个明显的解决方案:

  1. 如果有值,则仅执行更新:... where r.column_3 = s.column_3 and totalcount is not null
  2. 处理null:select max(nvl(totalcount,0)) …

现在,您断言更新查询“正常”。对于你作为my_table_name传递的所有值,它是否正常工作? Another reason why动态SQL很难,我们无法查看源代码并确定它在运行时将要做什么。所以你需要这么一些调试。在没有更新的情况下运行动态SELECT语句,看看你实际执行的是什么:

execute immediate ' select max(totalcount) from (
       select ''' || my_table_name || ''' as table_name, ''' || my_collumn_name || ''' as column_name, column_3, count(*) as totalcount
            from ' ||  my_table_name || ' a
            where exists (select 1 from Table_2 where Table_2.column_x = a.column_x)
            group by column_3)' into l_total_count;
dbms_ouput.put_line(my_table_name ||'.'|| my_collumn_name ||' max(totalcount) = ' ||  l_total_count);

请记住在您使用的任何客户端中启用SERVEROUTPUT。


更新字符串在循环内部,似乎在每个循环中它确实进行了正确的更新但是然后将其余部分更新为NULL ...但是我没有完全得到我应该做的事情,因为我有数百个字段..(sic )

我猜你是从循环中调用这段代码的。所以,并不是你没有用null覆盖“正确的更新”,而是你不想用任何后续值覆盖任何值。我可以提供一些建议,但实际上这是您的数据模型和业务逻辑,因此只有您可以决定处理此问题的正确方法。

  1. 聚集totalcount像这样:set column_1 = column_1 + total_count。为此,你需要应用nvl(max(totalcount),0)
  2. 向TABLE_FINAL添加一列以存储my_collumn_value的值。在UPDATE语句的WHERE子句中引用该列。 (显然,这假设与先前的建议完全不同的结果集)。您可能还需要一列my_table_name的值。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.