openGauss-server/src/test/regress/sql/hw_cursor_part8.sql

438 lines
12 KiB
PL/PgSQL

create database pl_test_cursor_part8 DBCOMPATIBILITY 'pg';
\c pl_test_cursor_part8;
CREATE schema hw_cursor_part8;
SET current_schema = hw_cursor_part8;
set behavior_compat_options = 'skip_insert_gs_source';
CREATE TABLE TEST_TB(ID INTEGER);
INSERT INTO TEST_TB VALUES(123);
INSERT INTO TEST_TB VALUES(124);
INSERT INTO TEST_TB VALUES(125);
DECLARE
CURSOR CURS1 IS SELECT * FROM TEST_TB;
TEMP INTEGER:=0;
BEGIN
FOR VARA IN CURS1 LOOP
raise notice '%',CURS1%ROWCOUNT;
END LOOP;
END;
/
--2 TEST FOR DISPLAY CURSOR IN (SELECT ,INSERT ,UPDATE ,DELETE);
DECLARE
CURSOR CURS1 IS SELECT * FROM TEST_TB;
TEMP INTEGER:=0;
BEGIN
FOR VARA IN CURS1 LOOP
-- FOR SELECT
SELECT ID INTO TEMP FROM TEST_TB WHERE ID = 123;
IF NOT CURS1%ISOPEN THEN --CURS1%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST SELECT: CURS1%ISOPEN=FALSE';
END IF;
IF CURS1%FOUND THEN
raise notice '%','TEST SELECT: CURS1%FOUND=TRUE';
END IF;
IF CURS1%NOTFOUND THEN
raise notice '%','TEST SELECT: CURS1%NOTFOUND=TRUE';
END IF;
raise notice 'TEST SELECT: CURS1%%ROWCOUNT=%',CURS1%ROWCOUNT;
-- FOR INSERT
INSERT INTO TEST_TB VALUES (125);
IF NOT CURS1%ISOPEN THEN --CURS1%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST INSERT: CURS1%ISOPEN=FALSE';
END IF;
IF CURS1%FOUND THEN
raise notice '%','TEST INSERT: CURS1%FOUND=TRUE';
END IF;
IF CURS1%NOTFOUND THEN
raise notice '%','TEST INSERT: CURS1%NOTFOUND=TRUE';
END IF;
raise notice 'TEST INSERT: CURS1%%ROWCOUNT=%',CURS1%ROWCOUNT;
--UPDATE
UPDATE TEST_TB SET ID=ID+1 WHERE ID=124;
IF NOT CURS1%ISOPEN THEN --CURS1%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST UPDATE: CURS1%ISOPEN=FALSE';
END IF;
IF CURS1%FOUND THEN
raise notice '%','TEST UPDATE: CURS1%FOUND=TRUE';
END IF;
IF CURS1%NOTFOUND THEN
raise notice '%','TEST UPDATE: CURS1%NOTFOUND=TRUE';
END IF;
raise notice 'TEST UPDATE: CURS1%%ROWCOUNT=%',CURS1%ROWCOUNT;
--DELETE
DELETE FROM TEST_TB WHERE ID=125;
IF NOT CURS1%ISOPEN THEN --CURS1%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST DELETE: CURS1%ISOPEN=FALSE';
END IF;
IF CURS1%FOUND THEN
raise notice '%','TEST DELETE: CURS1%FOUND=TRUE';
END IF;
IF CURS1%NOTFOUND THEN
raise notice '%','TEST DELETE: CURS1%NOTFOUND=TRUE';
END IF;
raise notice 'TEST DELETE: CURS1%%ROWCOUNT=%',CURS1%ROWCOUNT;
END LOOP;
END;
/
DROP TABLE IF EXISTS TEST_TB;
--3 TEST FOR IMPLICIT CURSOR IN (SELECT ,INSERT ,UPDATE ,DELETE)
CREATE TABLE TEST_TB (ID INT);
INSERT INTO TEST_TB VALUES (123);
INSERT INTO TEST_TB VALUES (124);
INSERT INTO TEST_TB VALUES (125);
DECLARE
TEMP INTEGER = 0;
BEGIN
-- FOR SELECT
SELECT ID INTO TEMP FROM TEST_TB WHERE ID = 123;
IF NOT SQL%ISOPEN THEN --SQL%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST SELECT: SQL%ISOPEN=FALSE';
END IF;
IF SQL%FOUND THEN
raise notice '%','TEST SELECT: SQL%FOUND=TRUE';
END IF;
IF NOT SQL%NOTFOUND THEN
raise notice '%','TEST SELECT: SQL%NOTFOUND=FALSE';
END IF;
raise notice 'TEST SELECT: SQL%%ROWCOUNT=%',SQL%ROWCOUNT;
-- FOR INSERT
INSERT INTO TEST_TB VALUES (125);
IF NOT SQL%ISOPEN THEN --SQL%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST INSERT: SQL%ISOPEN=FALSE';
END IF;
IF SQL%FOUND THEN
raise notice '%','TEST INSERT: SQL%FOUND=TRUE';
END IF;
IF NOT SQL%NOTFOUND THEN
raise notice '%','TEST INSERT: SQL%NOTFOUND=FALSE';
END IF;
raise notice 'TEST INSERT: SQL%%ROWCOUNT=%',SQL%ROWCOUNT;
--UPDATE
UPDATE TEST_TB SET ID=ID+1 WHERE ID<124;
IF NOT SQL%ISOPEN THEN --SQL%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST UPDATE: SQL%ISOPEN=FALSE';
END IF;
IF SQL%FOUND THEN
raise notice '%','TEST UPDATE: SQL%FOUND=TRUE';
END IF;
IF NOT SQL%NOTFOUND THEN
raise notice '%','TEST UPDATE: SQL%NOTFOUND=FALSE';
END IF;
raise notice 'TEST UPDATE: SQL%%ROWCOUNT=%',SQL%ROWCOUNT;
--DELETE
DELETE FROM TEST_TB WHERE ID<125;
IF NOT SQL%ISOPEN THEN --SQL%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST DELETE: SQL%ISOPEN=FALSE';
END IF;
IF SQL%FOUND THEN
raise notice '%','TEST DELETE: SQL%FOUND=TRUE';
END IF;
IF NOT SQL%NOTFOUND THEN
raise notice '%','TEST DELETE: SQL%NOTFOUND=FALSE';
END IF;
raise notice 'TEST DELETE: SQL%%ROWCOUNT=%',SQL%ROWCOUNT;
END;
/
DROP TABLE IF EXISTS TEST_TB;
--4 TEST FOR IMPLICIT CURSOR;
CREATE TABLE TEST_TB (ID INT);
INSERT INTO TEST_TB VALUES (123);
INSERT INTO TEST_TB VALUES (124);
INSERT INTO TEST_TB VALUES (125);
DECLARE
CURSOR CURS1 IS SELECT * FROM TEST_TB;
TEMP INTEGER:=0;
BEGIN
FOR VARA IN CURS1 LOOP
SELECT ID INTO TEMP FROM TEST_TB WHERE ID = 123;
IF NOT SQL%ISOPEN THEN --SQL%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST SELECT: SQL%ISOPEN=FALSE';
END IF;
IF SQL%FOUND THEN
raise notice '%','TEST SELECT: SQL%FOUND=TRUE';
END IF;
IF NOT SQL%NOTFOUND THEN
raise notice '%','TEST SELECT: SQL%NOTFOUND=FALSE';
END IF;
raise notice 'TEST SELECT: SQL%%ROWCOUNT=%',SQL%ROWCOUNT;
END LOOP;
END;
/
DROP TABLE IF EXISTS TEST_TB;
CREATE TABLE TEST_TB(ID INTEGER);
INSERT INTO TEST_TB VALUES(123);
INSERT INTO TEST_TB VALUES(124);
INSERT INTO TEST_TB VALUES(125);
DECLARE
CURSOR CURS1 IS SELECT * FROM TEST_TB;
TEMP INTEGER:=0;
BEGIN
FOR VARA IN CURS1 LOOP
raise notice 'TEST SELECT: CURS1%%ROWCOUNT=%',CURS1%ROWCOUNT;
END LOOP;
IF NOT CURS1%ISOPEN THEN --CURS1%ISOPEN ALWAYS BE FALSE
raise notice '%','TEST SELECT: CURS1%ISOPEN=FALSE';
END IF;
IF CURS1%FOUND THEN
raise notice '%','TEST SELECT: CURS1%FOUND=TRUE';
END IF;
IF CURS1%NOTFOUND THEN
raise notice '%','TEST SELECT: CURS1%NOTFOUND=TRUE';
END IF;
raise notice 'TEST SELECT: CURS1%%ROWCOUNT=%', CURS1%ROWCOUNT;
END;
/
DROP TABLE IF EXISTS TEST_TB;
--TEST FOR CURSOR SYS_REFCURSOR IN PROCEDURE AND EMPTY TABLE;
--IF THE RESULT IS 0 ,THAT'S OK,ELSE IS ERROR;
DROP TABLE IF EXISTS TEST_TBL;
CREATE TABLE TEST_TBL(ID INTEGER);
CREATE OR REPLACE PROCEDURE T1(O OUT SYS_REFCURSOR)
IS
C1 SYS_REFCURSOR;
BEGIN
OPEN C1 FOR SELECT ID FROM TEST_TBL ORDER BY ID;
O := C1;
END;
/
DECLARE
C1 SYS_REFCURSOR;
TEMP INTEGER;
BEGIN
T1(C1);
LOOP
FETCH C1 INTO TEMP;
EXIT WHEN C1%NOTFOUND;
END LOOP;
raise notice '%',C1%ROWCOUNT;
END;
/
DROP TABLE IF EXISTS TEST_TBL;
DROP PROCEDURE T1;
--TEST FOR CURSOR REFCURSOR IN PROCEDURE AND EMPTY TABLE;
--IF THE RESULT IS 0 ,THAT'S OK,ELSE IS ERROR;
DROP TABLE IF EXISTS TEST_TBL;
CREATE TABLE TEST_TBL(ID INTEGER);
CREATE OR REPLACE PROCEDURE T2(O OUT REFCURSOR)
IS
C1 SYS_REFCURSOR;
BEGIN
OPEN C1 FOR SELECT ID FROM TEST_TBL ORDER BY ID;
O := C1;
END;
/
DECLARE
C1 REFCURSOR;
TEMP INTEGER;
BEGIN
T2(C1);
LOOP
FETCH C1 INTO TEMP;
EXIT WHEN C1%NOTFOUND;
END LOOP;
raise notice '%',C1%ROWCOUNT;
END;
/
DROP TABLE IF EXISTS TEST_TBL;
DROP PROCEDURE T2;
--TEST CURSOR IN Anonymous block
DROP TABLE IF EXISTS TEST_TBL;
CREATE TABLE TEST_TBL(ID INTEGER);
DECLARE
C1 REFCURSOR;
TEMP INTEGER;
BEGIN
OPEN C1 FOR SELECT ID FROM TEST_TBL ORDER BY ID;
LOOP
FETCH C1 INTO TEMP;
EXIT WHEN C1%NOTFOUND;
END LOOP;
raise notice '%',C1%ROWCOUNT;
END;
/
DROP TABLE IF EXISTS TEST_TBL;
DROP PROCEDURE TEST_TEMP;
DROP PROCEDURE TEST_CRS_RPT_EMPTYSOR;
DROP TABLE TBL_RCWSCFG;
drop table TBL_TEMP_MODULE_312;
CREATE TABLE TBL_RCWSCFG (
IWSNO INTEGER,
USCDBMID SMALLINT
);
INSERT INTO TBL_RCWSCFG VALUES (0, 184);
CREATE TABLE TBL_TEMP_MODULE_312 (
I_MODULENO INTEGER
);
CREATE OR REPLACE PROCEDURE TEST_TEMP
AS
BEGIN
raise notice '%','TEST_TEMP';
END;
/
CREATE OR REPLACE PROCEDURE TEST_CRS_RPT_EMPTYSOR(FLAG INTEGER)
AS
TYPE T_PSTMT_CRS_RPT_EMPTY IS REF CURSOR;
CRS_RPT_EMPTY T_PSTMT_CRS_RPT_EMPTY;
PI_MODULENO INTEGER;
PSV_MODULETBLNAME VARCHAR2(128) := 'TBL_TEMP_MODULE_312';
PSV_SQL VARCHAR2(128);
PI_NN INTEGER := NULL;
BEGIN
OPEN CRS_RPT_EMPTY FOR SELECT DISTINCT USCDBMID FROM TBL_RCWSCFG;
LOOP
FETCH CRS_RPT_EMPTY INTO PI_MODULENO;
EXIT WHEN CRS_RPT_EMPTY%NOTFOUND;
IF (FLAG = 0) THEN
-- INSERT INTO TBL_TEMP_MODULE_312, INSERT TRIGGER FUNCTION CALLED
PSV_SQL := 'BEGIN INSERT INTO '||PSV_MODULETBLNAME||' (I_MODULENO) VALUES('||PI_MODULENO||');END;';
EXECUTE IMMEDIATE PSV_SQL;
ELSE
TEST_TEMP();
END IF;
END LOOP;
-- check cursor attris status
raise notice 'CRS_RPT_EMPTY%%ROWCOUNT :%',NVL(TO_CHAR(CRS_RPT_EMPTY%ROWCOUNT),'NULL');
raise notice 'SQL%%ROWCOUNT :%',NVL(TO_CHAR(SQL%ROWCOUNT),'NULL');
END;
/
CALL TEST_CRS_RPT_EMPTYSOR(0);
CALL TEST_CRS_RPT_EMPTYSOR(1);
DROP TABLE TBL_TEMP_MODULE_312;
--test cursor define
create or replace procedure pro_cursor_c0019() as
declare
cursor cursor1 for create table t1(a int);
BEGIN
END;
/
create table t1(a int);
--test with query
create or replace procedure test_cursor() as
declare
cursor cursor1 is
with recursive StepCTE(a)
as (select a from t1) select * from StepCTE;
BEGIN
null;
END;
/
cursor pro_cursor_c0019_1 with hold for select * from t1;
create or replace procedure pro_cursor_c0019() as
declare
cursor cursor1 for fetch pro_cursor_c0019_1;
BEGIN
open cursor1;
raise notice '%','test cursor';
close cursor1;
END;
/
select * from pro_cursor_c0019();
close pro_cursor_c0019_1;
select * from pro_cursor_c0019();
create table test_cursor_table(c1 int,c2 varchar);
insert into test_cursor_table values(1,'Jack'),(2,'Rose');
create or replace procedure test_cursor() as
declare
type ref_cur is ref cursor;
cur1 ref_cur;
a1 test_cursor_table%rowtype;
SQL_STR VARCHAR(100);
begin
OPEN cur1 FOR with cte1 as (select * from test_cursor_table) select c1, c2 from cte1;
if cur1%isopen then
LOOP
FETCH cur1 INTO a1;
EXIT WHEN cur1%NOTFOUND;
raise notice '%---%',a1.c1,a1.c2;
END LOOP;
end if;
CLOSE cur1;
end
/
call test_cursor();
create or replace procedure test_cursor() as
declare
type ref_cur is ref cursor;
cur1 ref_cur;
a1 test_cursor_table%rowtype;
SQL_STR VARCHAR(100);
ID_T integer;
begin
ID_T := 1;
SQL_STR := 'with cte1 as (select * from test_cursor_table) select c1, c2 from cte1 where c1 = :1';
OPEN cur1 FOR SQL_STR USING ID_T;
if cur1%isopen then
LOOP
FETCH cur1 INTO a1;
EXIT WHEN cur1%NOTFOUND;
raise notice '%---%',a1.c1,a1.c2;
END LOOP;
end if;
CLOSE cur1;
end
/
call test_cursor();
create type pro_type_04 as ( v_tablefield character varying, v_tablefield2 character varying, v_tablename character varying, v_cur refcursor);
CREATE FUNCTION pro_base13_03(v_tablefield character varying, v_tablefield2 character varying,v_tablename character varying, OUT v_cur refcursor) RETURNS refcursor
LANGUAGE plpgsql NOT SHIPPABLE
AS $$ DECLARE
begin
open v_cur for
'select '||v_tablefield||' as tablecode, '||v_tablefield2||' as tablename from '||v_tablename|| ' order by 1,2;';
end $$;
CREATE FUNCTION pro_base13_04(v_tablefield character varying, v_tablefield2 character varying, v_tablename character varying) RETURNS record
LANGUAGE plpgsql NOT SHIPPABLE
AS $$ DECLARE
v_record pro_type_04;
v_cur refcursor;
begin
v_cur := pro_base13_03(v_tablefield, v_tablefield2, v_tablename,v_cur);
loop
fetch v_cur into v_record;
EXIT WHEN v_cur%notfound;
return v_record;
end loop;
end $$;
select pro_base13_04('c1','c2','test_cursor_table');
CREATE or REPLACE FUNCTION pro_base12_01(OUT o_resultnum numeric, OUT o_result_cur refcursor,OUT o_result_cur_1 refcursor)
RETURNS record
LANGUAGE plpgsql
AS $$ DECLARE
begin
select count(*), max(c1),min(c2) into o_resultnum,o_result_cur,o_result_cur_1
from test_cursor_table;
return;
end$$;
select pro_base12_01() from test_cursor_table;
drop schema hw_cursor_part8 CASCADE;
\c regression;
drop database IF EXISTS pl_test_cursor_part8;