PostgreSql函数中的保存点
我想在PostgreSQL的函数中使用保存点功能。我听说保存点不能在Postgres的函数中使用 但是当我回滚时,我想回滚到一个特定的点,因为我想使用savepoint。有什么替代方法 示例代码PostgreSql函数中的保存点,postgresql,plpgsql,savepoints,Postgresql,Plpgsql,Savepoints,我想在PostgreSQL的函数中使用保存点功能。我听说保存点不能在Postgres的函数中使用 但是当我回滚时,我想回滚到一个特定的点,因为我想使用savepoint。有什么替代方法 示例代码 CREATE or replace FUNCTION fn_loadData_Subha() RETURNS BIGINT AS $$ DECLARE batchId BIGINT; currentTime TIMESTAMP; processName VARCHAR(
CREATE or replace FUNCTION fn_loadData_Subha()
RETURNS BIGINT
AS
$$
DECLARE
batchId BIGINT;
currentTime TIMESTAMP;
processName VARCHAR(20);
BEGIN
-- Getting current date and time
select TIMESTAMP 'NOW' into currentTime;
select 'ETL_Subha' INTO processName;
SAVEPOINT first_savepoint;
-- Inserting new record into batch log table
INSERT INTO TB_HSS_BATCH_LOG
(PROCESS_NAME,START_DATE,STATUS)
SELECT processName,currentTime,'STARTED';
select currval('TB_HSS_BATCH_LOG_id_seq') INTO batchId;
-- Inserting cost data to history table
Insert into tb_hss_procedure_cost_hist1
(HOSP_SYSTEM, HOSP_FACILITY, surgeon_name, procedure_name, department, current_dept_rank, no_of_surgeons, current_imp_cost
, current_med_surg_cost, current_total_cost, annual_volume, sys_pref_cost,load_seq_no, CREATED_AT)
Select
HOSP_SYSTEM, HOSP_FACILITY,surgeon_name,procedure_name,department,current_dept_rank, no_of_surgeons, current_imp_cost
, current_med_surg_cost, current_total_cost, annual_volume, sys_pref_cost, batchId,currentTime
from tb_hss_procedure_cost_stag_in;
RELEASE SAVEPOINT first_savepoint;
RETURN 1;
EXCEPTION
WHEN PLPGSQL_ERROR THEN
RAISE EXCEPTION '% %', SQLERRM, SQLSTATE;
RAISE NOTICE '% %', SQLERRM, SQLSTATE;
RETURN 0;
WHEN OTHERS THEN
RAISE EXCEPTION '% %', SQLERRM, SQLSTATE;
RAISE NOTICE '% %', SQLERRM, SQLSTATE;
RETURN 0;
ROLLBACK TRANSACTION;
END;
$$LANGUAGE plpgsql;
在PL/pgSQL函数中使用保存点的方法是使用
BEGIN。。。例外。。。结束
块。在引擎盖下,这将在BEGIN
处设置一个保存点,并在遇到异常时回滚到该保存点
因此,您的代码可能是这样的(我不能100%确定我是否正确阅读了您的代码):
对代码的一些一般性注释:
- 从不使用批处理ID
是不必要的–每次调用currenttime
都会在事务中返回相同的值current\u time
- 使用
引发异常将终止执行。如果你想抛出一个错误,就不要捕捉原始异常;这将比你的例外更有意义。我上面的代码假设您希望捕获异常并返回0RAISE
与发动机罩下的SELECT val INTO variable
相同,但后者通常被认为更具可读性variable:=value
回滚到第一个保存点
:您不能在PostgreSQL函数内使用任何与事务相关的SQL语句。回滚到第一个保存点在函数内不起作用,因为不能在函数内使用保存点。我想知道savepoint的替代方案谢谢Laurenz。。该代码是一个部分代码..因此它有一些未使用的内容,这些内容在后面的部分中实际使用。不,我不想返回0,我想回滚到一个特定的点(替代保存点,因为保存点不能在函数中使用)…这是我发布此问题的最重要原因..如我所写,一旦您进入异常
块,您就已经回滚到保存点。我无法在函数中引入任何保存点,因为这是不允许的。我说:在PL/pgSQL函数中使用保存点的方法是使用开始。。。例外。。。结束
块。在引擎盖下,这将在开始时设置一个保存点,并在遇到异常时回滚到该保存点。因此,如果编写这样的块,您已经引入了保存点。
DECLARE
batchid bigint;
processname varchar(20) := 'ETL_Subha';
BEGIN
BEGIN
INSERT INTO TB_HSS_BATCH_LOG
(PROCESS_NAME,START_DATE,STATUS)
VALUES (processname,current_timestamp,'STARTED')
RETURNING id INTO batchid;
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END;
END;