下面我有一个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
请帮助我,让我知道我在哪里犯了错误,我将不胜感激!
另外,如果你需要更多的理解,请告诉我。
从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;
在pgadmin4将id保存在postgresql中后,我无法从“test”表中检索到id: 这里是表“test”的pgadmi4生成的create脚本: org.postgresql.util.psqlexception:错误:关系“test_id”不存在位置 ;:16在org.postgresql.core.v3.queryexecutorimpl.receiveerrorresponse(q
执行简单查询时出现操作符不匹配错误。这是什么原因造成的? 表定义:
这个表的hibernate映射如下所述 在loginDetails.java中,我将id字段声明为long,userName和password字段声明为string。当我尝试执行以下命令时 我得到 我不明白哪里出了问题。如有任何帮助,不胜感激。
:“查询执行失败。原因: SQL错误[42P01]:错误:关系”temp_table“存在。 不存在” 我想创建一个临时表来临时存储一些记录。
这真的是一个令人头痛的问题,我不知道这里出了什么问题。我几周前才开始使用猫鼬,所以我想知道这是不是我在这里误解了一些基本的东西。
我有一个现有的AJAX GET脚本,它正在工作,并通过URL将数据传递回我的PHP代码。 由于我现在想要发送的数据,我想将AJAX更改为POST。 我已经用下面的JSON格式创建了一些数据 然后传递到下面的函数 Chrome给了我一个403禁止的错误,我似乎无法解决哪里出了问题。 铬错误 谢谢!!:)