当前位置: 首页 > 知识库问答 >
问题:

帖子: SQL 错误 [42883]: 错误: 运算符不存在: uuid = 文本

苗运珧
2023-03-14

下面我有一个Postgres查询,它基于INSERT或UPDATE audit_operation将主表中的数据恢复到特定时间点的审计表中的数据。

create or replace function fun(test_val1_input text, test_val3_input text)
returns void
as $functions$
declare test_id text ;
    test_val1 text ;  
    test_val2 text ; 
    test_val3 timestamp;
    test_val4 text ;
declare cur cursor 
for select id, val1 , val2 , val3, val4
    from test_table at 
    where val1 = UUID($1) and val3 > to_timestamp($2, 'YYYY-MM-DD HH24:MI:SS')
    order by val3 desc;
begin   
open cur;

fetch next from cur into test_id, test_val1 , test_val2 , test_val3 , test_val4;

while found
loop

    if (test_val4 = 'INSERT')
    then
        delete from main_table mt where id = test_val1;
    elsif (test_val4 = 'UPDATE')
    then
        delete from main_table mt where id = test_val1;
        with cte
        as 
        (
            select * 
            from test_table at
            where val1 = test_val1 and val3 < test_val3 
            order by val3 desc
            limit 1
        )
        update mt 
        set mt.id = cte.id,
            mt.val1 = cte.val1,
            mt.val2= cte.val2
        from main_table mt
             join cte on cte.val1 = brb.val1; 
    end if;

    fetch next from cur into test_id, test_val1, test_val2, test_val3, test_val4;
end loop;

close cur;
end;
$functions$ language plpgsql;

供参考-

工柞道

     id       |         val1           |  val2
--------------+------------------------+---------
31cc5a4f-7a23 | 4d87-ad12-2f78c1c52b7a | data_1
12da6b6a-8b12 | 4d87-ad12-2f78c1c52b7a | data_2
82na1q1a-1b45 | 4d87-ad12-2f78c1c52b7a | data_3

main_table中的列类型

id: uuid

val1:uuid

val2:文本

审计表

     id       |           val1         |  val2   |    val3             | val4
--------------+------------------------+---------+---------------------+------------------
31cc5a4f-7a23 | 4d87-ad12-2f78c1c52b7a | data_1  | 2001-09-10 12:02:20 |      INSERT
12da6b6a-8b12 | 4d87-ad12-2f78c1c52b7a | data_2  | 2001-09-10 12:02:20 |      INSERT      
82na1q1a-1b45 | 4d87-ad12-2f78c1c52b7a | data_3  | 2001-09-12 15:12:54 |      INSERT      

audit_table中的列类型

id: uuid

val1:uuid

val2:文本

val3:时间戳

val4:文本

在为以下输入执行上述 SQL 函数时-

select fun('4d87-ad12-2f78c1c52b7a', '2001-09-10 12:02:20')

我收到以下错误:

SQL错误[42883]:错误:运算符不存在:uuid=text

提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。

其中:PL/pgSQL函数revert_business_rule_days(text, text)第23行SQL语句

相反,我希望主表中的数据在指定时间恢复:

工柞道

     id       |         val1           |  val2  
--------------+------------------------+---------
31cc5a4f-7a23 | 4d87-ad12-2f78c1c52b7a | data_1
12da6b6a-8b12 | 4d87-ad12-2f78c1c52b7a | data_2

请帮助我,让我知道我在哪里犯了错误,我将不胜感激!

另外,如果你需要更多的理解,请告诉我。

共有1个答案

司雅畅
2023-03-14

从Postgresql留档:

UUID由小写十六进制数字序列组成,由连字符分隔成若干组,具体来说就是一组8位数字后接三组4位数字,再接一组12位数字,总共32位数字代表128位。

PostgreSQL还接受以下替代形式的输入:使用大写数字,用大括号括起来的标准格式,省略部分或全部连字符,在任何一组四位数字后添加连字符。

您应该更正:

> < li>

当您创建函数时,它的名称是< code>fun,而不是< code > revert _ business _ rule _ days 。

变量< code>v_id和< code>v_pk_id的类型应为< code>UUID而非< code >文本。该错误出现在< code>DELETE语句的< code>WHERE子句中,因为< code>id列类型是< code>UUID而变量< code>v_id类型是文本。

您的< code>UPDATE查询应该类似于(您的语法不正确):

UPDATE main_table mt 
SET id = cte.id,
    pk_id = cte.pk_id,
    col_1= cte.col_1
FROM cte 
WHERE cte.pk_id = mt.pk_id; 
 类似资料: