基于Oracle SQL中所有_表的选择递归更新表行
我有一个表,其中包含一个模式中所有表的table_name和ID列的值,我想根据每个表中ID列的最大值设置值 到目前为止,我有一个从表中获取max(id)的函数:基于Oracle SQL中所有_表的选择递归更新表行,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个表,其中包含一个模式中所有表的table_name和ID列的值,我想根据每个表中ID列的最大值设置值 到目前为止,我有一个从表中获取max(id)的函数: create or replace function get_max_id ( t_name in varchar2 ) return number as max_id number default null; begin execute immediate 'select max(id) from ' || t_name
create or replace function get_max_id ( t_name in varchar2 )
return number as max_id number default null;
begin
execute immediate
'select max(id) from ' || t_name into max_id;
return max_id;
end;
下面的select返回所有表名和最大(id)值:
但我正在努力用max\u id值更新ENTITY\u KEYS
表
这显然不起作用(获取单行子查询返回多行
):
如何更改上面的update语句以递归方式更新每一行,或者如何更新select语句以仅返回一行
尝试使用联接,但自然会出现相同的错误:
update SCHEMA_NAME.ENTITY_KEYS
set CUR_VALUE = (
select GET_MAX_ID( owner || '.' || table_name )
from SCHEMA_NAME.ENTITY_KEYs eks
inner join ALL_TABLES t on t.TABLE_NAME = eks.NAME
where t.owner = 'SCHEMA_NAME'
)
;
只需在update table语句中使用direct函数即可:
UPDATE SCHEMA_NAME.ENTITY_KEYS EKS
SET
EKS.CUR_VALUE = GET_MAX_ID('SCHEMA_NAME'
|| '.'
|| EKS.NAME)
WHERE
EXISTS (
SELECT
1
FROM
ALL_TABLES T
WHERE
T.TABLE_NAME = EKS.NAME
AND T.OWNER = 'SCHEMA_NAME'
);
干杯 您确定所有表都有相同的列“Id”吗?有什么特别的原因需要这种设计吗?当值必须更改时,在表中存储id的最大值有什么用?我相信有一种更好的方法可以解决您试图解决的问题。是的,所有表都有
ID
列。实体键
应该在每次插入新记录时用最新值更新,因此本质上是实体键。CUR\u值
应该与每个表的max(ID)
匹配。但是test env中存在一些差异,我想修复这些差异,我不想手动执行这些操作,因为有数百个表。“每次插入新记录时,实体_键都应该用最新的值进行更新”-这可以通过使用触发器实现(即使可以避免改变表错误)在所有表上,这是不可取的。我没有试图修复设计或系统:)我想做的是修复其中一个测试环境中数据不正确的ENTITY\u key
表。这实际上不起作用。我正在获取的视图表不存在用户名。获取\u MAX\u ID
确定,因此您只需要传递存在的表。然后需要使用所有的表。让我重新构思我的答案
update SCHEMA_NAME.ENTITY_KEYS
set CUR_VALUE = (
select GET_MAX_ID( owner || '.' || table_name )
from SCHEMA_NAME.ENTITY_KEYs eks
inner join ALL_TABLES t on t.TABLE_NAME = eks.NAME
where t.owner = 'SCHEMA_NAME'
)
;
UPDATE SCHEMA_NAME.ENTITY_KEYS EKS
SET
EKS.CUR_VALUE = GET_MAX_ID('SCHEMA_NAME'
|| '.'
|| EKS.NAME)
WHERE
EXISTS (
SELECT
1
FROM
ALL_TABLES T
WHERE
T.TABLE_NAME = EKS.NAME
AND T.OWNER = 'SCHEMA_NAME'
);