返回首页

gbase数据、南大通用产品文档:GBase8c示例

更新日期:2024年09月11日

示例1:支持在PLSQL 的存储过程内使用COMMIT/ROLLBACK。
CREATE TABLE EXAMPLE1(COL1 INT);
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE()
AS
BEGIN
FOR i IN 0..20 LOOP
INSERT INTO EXAMPLE1(COL1) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
END;
/
示例2:
支持含有EXCEPTION 的存储过程使用COMMIT/ROLLBACK。
支持在存储过程的EXCEPTION 语句内使用COMMIT/ROLLBACK。
支持DDL 在COMMIT/ROLLBACK 后的提交/回滚。
CREATE OR REPLACE PROCEDURE TEST_COMMIT_INSERT_EXCEPTION_ROLLBACK()
AS
BEGIN
DROP TABLE IF EXISTS TEST_COMMIT;
CREATE TABLE TEST_COMMIT(A INT, B INT);
INSERT INTO TEST_COMMIT SELECT 1, 1;
COMMIT;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
665
CREATE TABLE TEST_ROLLBACK(A INT, B INT);
RAISE EXCEPTION 'RAISE EXCEPTION AFTER COMMIT';
EXCEPTION
WHEN OTHERS THEN
INSERT INTO TEST_COMMIT SELECT 2, 2;
ROLLBACK;
END;
/
示例3 :支持在事务块里调用含有COMMIT/ROLLBACK 的存储过程,即通过
/BEGIN/START/END 等开启控制的外部事务。
BEGIN;
CALL TEST_COMMIT_INSERT_EXCEPTION_ROLLBACK();
END;
示例4:支持多数PLSQL 的上下文和语句内调用COMMIT/ROLLBACK,包括常用的
IF/FOR/CURSOR LOOP/WHILE。
CREATE OR REPLACE PROCEDURE TEST_COMMIT2()
IS
BEGIN
DROP TABLE IF EXISTS TEST_COMMIT;
CREATE TABLE TEST_COMMIT(A INT);
FOR I IN REVERSE 3..0 LOOP
INSERT INTO TEST_COMMIT SELECT I;
COMMIT;
END LOOP;
FOR I IN REVERSE 2..4 LOOP
UPDATE TEST_COMMIT SET A=I;
COMMIT;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO TEST_COMMIT SELECT 4;
COMMIT;
END;
/
示例5:支持存储过程返回值与简单表达式计算。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
666
CREATE OR REPLACE PROCEDURE exec_func3(RET_NUM OUT INT)
AS
BEGIN
RET_NUM := 1+1;
COMMIT;
END;
/
CREATE OR REPLACE PROCEDURE exec_func4(ADD_NUM IN INT)
AS
SUM_NUM INT;
BEGIN
SUM_NUM := ADD_NUM + exec_func3();
COMMIT;
END;
/
示例6:支持存储过程内GUC 参数的回滚提交。
SHOW explain_perf_mode;
SHOW enable_force_vector_engine;
CREATE OR REPLACE PROCEDURE GUC_ROLLBACK()
AS
BEGIN
SET enable_force_vector_engine = on;
COMMIT;
SET explain_perf_mode TO pretty;
ROLLBACK;
END;
/
call GUC_ROLLBACK();
SHOW explain_perf_mode;
SHOW enable_force_vector_engine;
SET enable_force_vector_engine = off;
示例7:函数(Function)中不允许调用commit/rollback 语句,同时不允许函数调用含
有commit/rollback 的存储过程。
CREATE OR REPLACE FUNCTION FUNCTION_EXAMPLE1() RETURN INT
AS
EXP INT;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
667
BEGIN
FOR i IN 0..20 LOOP
INSERT INTO EXAMPLE1(col1) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
SELECT COUNT(*) FROM EXAMPLE1 INTO EXP;
RETURN EXP;
END;
/
示例8:函数(Fucntion)中不允许调用带有commit/rollback 语句的存储过程。
CREATE OR REPLACE FUNCTION FUNCTION_EXAMPLE2() RETURN INT
AS
EXP INT;
BEGIN
--transaction_example 为存储过程,带有commit/rollback 语句
CALL transaction_example();
SELECT COUNT(*) FROM EXAMPLE1 INTO EXP;
RETURN EXP;
END;
/
示例9:
不允许Trigger的存储过程包含commit/rollback 语句,
或调用带有commit/rollback
语句的存储过程。
CREATE OR REPLACE FUNCTION FUNCTION_TRI_EXAMPLE2() RETURN TRIGGER
AS
EXP INT;
BEGIN
FOR i IN 0..20 LOOP
INSERT INTO EXAMPLE1(col1) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
668
SELECT COUNT(*) FROM EXAMPLE1 INTO EXP;
END;
/
CREATE TRIGGER TRIGGER_EXAMPLE AFTER DELETE ON EXAMPLE1
FOR EACH ROW EXECUTE PROCEDURE FUNCTION_TRI_EXAMPLE2();
DELETE FROM EXAMPLE1;
示例10:不支持带有IMMUABLE 以及SHIPPABLE 的存储过程调用commit/rollback,
或调用带有commit/rollback 语句的存储过程。
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE1()
IMMUTABLE
AS
BEGIN
FOR i IN 0..20 LOOP
INSERT INTO EXAMPLE1 (col1) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
END;
/
示例11:不支持出现在SQL 中的调用(除了Select Procedure)。
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE3()
AS
BEGIN
FOR i IN 0..20 LOOP
INSERT INTO EXAMPLE1 (col1) VALUES (i);
IF i % 2 = 0 THEN
EXECUTE IMMEDIATE 'COMMIT';
ELSE
EXECUTE IMMEDIATE 'ROLLBACK';
END IF;
END LOOP;
END;
/

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
669
示例12:存储过程头带有GUC 参数设置的不允许调用commit/rollback 语句。
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE4()
SET ARRAY_NULLS TO "ON"
AS
BEGIN
FOR i IN 0..20 LOOP
INSERT INTO EXAMPLE1 (col1) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
END;
/
示例13:游标open 的对象不允许为带有commit/rollback 语句的存储过程。
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE5(INTIN IN INT, INTOUT OUT INT)
AS
BEGIN
INTOUT := INTIN + 1;
COMMIT;
END;
/
CREATE OR REPLACE PROCEDURE TRANSACTION_EXAMPLE6()
AS
CURSOR CURSOR1(EXPIN INT)
IS SELECT TRANSACTION_EXAMPLE5(EXPIN);
INTEXP INT;
BEGIN
FOR i IN 0..20 LOOP
OPEN CURSOR1(i);
FETCH CURSOR1 INTO INTEXP;
INSERT INTO EXAMPLE1(COL1) VALUES (INTEXP);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
670
CLOSE CURSOR1;
END LOOP;
END;
/
示例14 :不支持CURSOR/EXECUTE 语句,以及各类表达式内调用
COMMIT/ROLLBACK。
CREATE OR REPLACE PROCEDURE exec_func1()
AS
BEGIN
CREATE TABLE TEST_exec(A INT);
COMMIT;
END;
/
CREATE OR REPLACE PROCEDURE exec_func2()
AS
BEGIN
EXECUTE exec_func1();
COMMIT;
END;
/
示例15:存储过程使用保存点回退事务部分修改。
CREATE OR REPLACE PROCEDURE STP_SAVEPOINT_EXAMPLE1()
AS
BEGIN
INSERT INTO EXAMPLE1 VALUES(1);
SAVEPOINT s1;
INSERT INTO EXAMPLE1 VALUES(2);
ROLLBACK TO s1;
-- 回退插入记录2
INSERT INTO EXAMPLE1 VALUES(3);
END;
/
示例16:存储过程中使用保存点回退到存储过程外部定义的保存点。
CREATE OR REPLACE PROCEDURE STP_SAVEPOINT_EXAMPLE2()
AS
BEGIN
INSERT INTO EXAMPLE1 VALUES(2);
ROLLBACK TO s1;
-- 回退插入记录2

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
671
INSERT INTO EXAMPLE1 VALUES(3);
END;
/
BEGIN;
INSERT INTO EXAMPLE1 VALUES(1);
SAVEPOINT s1;
CALL STP_SAVEPOINT_EXAMPLE2();
SELECT * FROM EXAMPLE1;
COMMIT;
示例17:存储过程外部回退到存储过程中定义的保存点。
CREATE OR REPLACE PROCEDURE STP_SAVEPOINT_EXAMPLE3()
AS
BEGIN
INSERT INTO EXAMPLE1 VALUES(1);
SAVEPOINT s1;
INSERT INTO EXAMPLE1 VALUES(2);
END;
/
BEGIN;
INSERT INTO EXAMPLE1 VALUES(3);
CALL STP_SAVEPOINT_EXAMPLE3();
ROLLBACK TO SAVEPOINT s1; --回退存储过程中插入记录2
SELECT * FROM EXAMPLE1;
COMMIT;

参数说明:控制是否启动对大对象权限检查的向后兼容模式。
该参数属于SUSET 类型参数,
请参考表GUC 参数设置方式中对应设置方法进行设置。
取值范围:布尔型
on 表示当读取或修改大对象时禁用权限检查,与PostgreSQL 9.0 以前的版本兼容。
默认值:off

GBase 8s 产品符合各种标准。
基于 SQL 的 GBase 8s 产品完全兼容 SQL-92 入门级
(发布为 ANSI X3.135-1992)

这与 ISO 9075:1992 完全相同。
另外,
GBase 8s 数据库服务器的许多功能都遵守 SQL-92
中级和完全级别以及 X/Open SQL 公共应用程序环境 (CAE) 标准。