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

351 lines
10 KiB
PL/PgSQL

------------------------------------------------------------------------------
-----7 test implicit cursor attributes for DML: select,insert,update,delete-----
------------------------------------------------------------------------------
create database pl_test_cursor_part2 DBCOMPATIBILITY 'pg';
\c pl_test_cursor_part2;
create schema hw_cursor_part2;
set current_schema = hw_cursor_part2;
set behavior_compat_options = 'skip_insert_gs_source';
create table t1(v1 int,v2 varchar2(100));
insert into t1 values (1,'abc1');
insert into t1 values (2,'abc2');
insert into t1 values (3,'abc3');
create or replace procedure sp_testsp
as
v int:=0;
begin
--select
select v1 into v from t1 where v1=1;
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 sql%notfound then
raise notice '%','test select: sql%notfound=true';
end if;
raise notice 'test select: sql%%rowcount=%',sql%rowcount;
--insert
insert into t1 values (4,'abc4');
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 sql%notfound then
raise notice '%','test insert: sql%notfound=true';
end if;
raise notice 'test insert: sql%%rowcount=%',sql%rowcount;
--update
update t1 set v1=v1+100 where v1>1000;
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 sql%notfound then
raise notice '%','test update: sql%notfound=true';
end if;
raise notice 'test update: sql%%rowcount=%',sql%rowcount;
update t1 set v1=v1+100 where v1<1000;
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%notfound=true';
end if;
if sql%notfound then
raise notice '%','test update: sql%notfound=true';
end if;
raise notice 'test update: sql%%rowcount=%',sql%rowcount;
--delete
delete from t1 where v1>1000;
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 sql%notfound then
raise notice '%','test delete: sql%notfound=true';
end if;
raise notice 'test delete: sql%%rowcount=%',sql%rowcount;
delete from t1 where v1<1000;
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 sql%notfound then
raise notice '%','test delete: sql%notfound=true';
end if;
raise notice 'test delete: sql%%rowcount=%',sql%rowcount;
end;
/
call sp_testsp();
drop procedure sp_testsp;
drop table t1;
------------------------------------------------------------------------------
-----support A db's cursor in or out params---------------------------------
------------------------------------------------------------------------------
CREATE TABLE TBL(VALUE INT);
INSERT INTO TBL VALUES (1);
INSERT INTO TBL VALUES (2);
INSERT INTO TBL VALUES (3);
INSERT INTO TBL VALUES (4);
CREATE OR REPLACE PROCEDURE TEST_SP
IS
CURSOR C1(NO IN VARCHAR2) IS SELECT * FROM TBL WHERE VALUE < NO ORDER BY 1;
CURSOR C2(NO OUT VARCHAR2) IS SELECT * FROM TBL WHERE VALUE < 10 ORDER BY 1;
V INT;
RESULT INT;
BEGIN
OPEN C1(10);
OPEN C2(RESULT);
LOOP
FETCH C1 INTO V;
IF C1%FOUND THEN
raise notice '%',V;
ELSE
EXIT;
END IF;
END LOOP;
CLOSE C1;
LOOP
FETCH C2 INTO V;
IF C2%FOUND THEN
raise notice '%',V;
ELSE
EXIT;
END IF;
END LOOP;
CLOSE C2;
END;
/
CALL TEST_SP();
DROP TABLE TBL;
DROP PROCEDURE TEST_SP;
---------------------------------------------------------------------------------
----- test the mixed use of implicit and explicit cursor attributes -------------
----- test the effect of the implicit cursor use to explicit cursor attributes --
---------------------------------------------------------------------------------
drop table t1;
create table t1(v1 int,v2 varchar2(100));
insert into t1 values (1,'abc1');
insert into t1 values (2,'abc2');
insert into t1 values (3,'abc3');
create or replace procedure sp_testsp_select
as
v int:=0;
CURSOR cur IS select v1 from t1;
begin
open cur;
--select
select v1 into v from t1 where v1=1;
if not cur%isopen then
raise notice '%','test select: cur%isopen=false';
end if;
if cur%found then
raise notice '%','test select: cur%found=true';
end if;
if cur%notfound then
raise notice '%','test select: cur%notfound=true';
end if;
raise notice 'test select: cur%%rowcount=%',cur%rowcount;
close cur;
end;
/
call sp_testsp_select();
drop procedure sp_testsp_select;
drop table t1;
create table t1(v1 int,v2 varchar2(100));
insert into t1 values (1,'abc1');
insert into t1 values (2,'abc2');
insert into t1 values (3,'abc3');
create or replace procedure sp_testsp_insert
as
v int:=0;
CURSOR cur IS select v1 from t1;
begin
open cur;
--insert
insert into t1 values (4,'abc4');
if not cur%isopen then
raise notice '%','test insert: cur%isopen=false';
end if;
if cur%found then
raise notice '%','test insert: cur%found=true';
end if;
if cur%notfound then
raise notice '%','test insert: cur%notfound=true';
end if;
raise notice 'test insert: cur%%rowcount=%',cur%rowcount;
close cur;
end;
/
call sp_testsp_insert();
drop procedure sp_testsp_insert;
drop table t1;
create table t1(v1 int,v2 varchar2(100));
insert into t1 values (1,'abc1');
insert into t1 values (2,'abc2');
insert into t1 values (3,'abc3');
create or replace procedure sp_testsp_update
as
v int:=0;
CURSOR cur IS select v1 from t1;
begin
open cur;
--update
update t1 set v1=v1+100 where v1>1000;
if not cur%isopen then
raise notice '%','test update: cur%isopen=false';
end if;
if cur%found then
raise notice '%','test update: cur%found=true';
end if;
if cur%notfound then
raise notice '%','test update: cur%notfound=true';
end if;
raise notice 'test update: cur%%rowcount=%',cur%rowcount;
update t1 set v1=v1+100 where v1<1000;
if not cur%isopen then
raise notice '%','test update: cur%isopen=false';
end if;
if cur%found then
raise notice '%','test update: cur%found=true';
end if;
if cur%notfound then
raise notice '%','test update: cur%notfound=true';
end if;
raise notice 'test update: cur%%rowcount=%',cur%rowcount;
close cur;
end;
/
call sp_testsp_update();
drop procedure sp_testsp_update;
drop table t1;
create table t1(v1 int,v2 varchar2(100));
insert into t1 values (1,'abc1');
insert into t1 values (2,'abc2');
insert into t1 values (3,'abc3');
create or replace procedure sp_testsp_delete
as
v int:=0;
CURSOR cur IS select v1 from t1;
begin
open cur;
--delete
delete from t1 where v1>1000;
if not cur%isopen then
raise notice '%','test delete: cur%isopen=false';
end if;
if cur%found then
raise notice '%','test delete: cur%found=true';
end if;
if cur%notfound then
raise notice '%','test delete: cur%notfound=true';
end if;
raise notice 'test delete: cur%%rowcount=%',cur%rowcount;
delete from t1 where v1<1000;
if not cur%isopen then
raise notice '%','test delete: cur%isopen=false';
end if;
if cur%found then
raise notice '%','test delete: cur%found=true';
end if;
if cur%notfound then
raise notice '%','test delete: cur%notfound=true';
end if;
raise notice 'test delete: cur%%rowcount=%',cur%rowcount;
close cur;
end;
/
call sp_testsp_delete();
--I1.create table
create table fun_refcursor_tab_001(c_int int,c_varchar varchar(20));
--I2.insert data
insert into fun_refcursor_tab_001 values(generate_series(1,1000),generate_series(1,1000)||'abc');
--I3.create function --
create or replace function fun_refcursor_001_1() returns refcursor
as $$
declare
c1 refcursor;
begin
open c1 for select c_int,c_varchar from fun_refcursor_tab_001 order by 1 limit 10;
return c1;
end;$$
language plpgsql;
--I4.create procedure--
create or replace procedure pro_fun_refcursor_001_1(id out int,name out varchar)
as
declare
c1 refcursor;
begin
select fun_refcursor_001_1() into c1;
loop
fetch next from c1 into id,name;
raise notice '% -- %',id,name;
insert into fun_refcursor_tab_001 values(id,name);
exit when c1%notfound;
end loop;
end;
/
--I5.select
select pro_fun_refcursor_001_1();
select count(*) from fun_refcursor_tab_001;
--I6.create function--
create or replace function fun_refcursor_001_2(inputid in fun_refcursor_tab_001.c_int%type)
returns table(out_id int,out_name varchar)
as $$
begin
return query select c_int,c_varchar from fun_refcursor_tab_001 where c_int>inputId order by 1;
end;$$
language plpgsql;
call fun_refcursor_001_2(990);
--I7.create procedure
create or replace procedure pro_refcursor_001(a in int)
as
begin
insert into fun_refcursor_tab_001 values(a,a||'b');
end;
/
--I8.select
select pro_refcursor_001(1024);
select * from fun_refcursor_tab_001 where c_int=1024;
--I9.clean up
drop table fun_refcursor_tab_001;
drop function fun_refcursor_001_1;
drop procedure pro_fun_refcursor_001_1;
drop function fun_refcursor_001_2;
drop procedure pro_refcursor_001;
DROP TABLE t1;
DROP SCHEMA hw_cursor_part2 CASCADE;
\c regression;
drop database IF EXISTS pl_test_cursor_part2;