Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Oracle SQL中所有_表的选择递归更新表行_Sql_Oracle_Oracle11g - Fatal编程技术网

基于Oracle SQL中所有_表的选择递归更新表行

基于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

我有一个表,其中包含一个模式中所有表的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 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'
    );