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

1589 lines
32 KiB
PL/PgSQL

---------------------forall------------------------
SET CHECK_FUNCTION_BODIES TO ON;
CREATE TABLE if not exists test_forall(a char(10));
CREATE FUNCTION test_forall(IN flag int, IN iter int) RETURNS integer AS $$
DECLARE
BEGIN
if flag=0 then
forall i in 1..iter
insert into test_forall values ('aa');
end if;
if flag=1 then
forall i in 1..10
insert into test_forall values ('bb');
end if;
if flag=2 then
forall i in 1..iter
update test_forall set a='cc' where a='aa';
end if;
if flag=3 then
forall i in 1..iter
delete from test_forall where a='bb';
end if;
return iter;
END;
$$ LANGUAGE plpgsql;
-- check prokind
select prokind from pg_proc where proname = 'test_forall';
CREATE FUNCTION test_forallDML1(IN iter int) RETURNS integer AS $$
BEGIN
forall i in 1..iter
CREATE ROLE jonathan PASSWORD 'ttest@123' LOGIN;
return iter;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_forallDML2(IN iter int) RETURNS integer AS $$
BEGIN
forall i in 1..iter
create table if not exists test_forall(a char(10));
return iter;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_forallDML3(IN iter int) RETURNS integer AS $$
BEGIN
forall i in 1..iter
alter table test_forall add column b varchar(10);
return iter;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_forallDML4(IN iter int) RETURNS integer AS $$
BEGIN
forall i in 1..iter
drop table test_forall;
return iter;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE PRO_SQLCODE
(
PSV_SQLCODE OUT INTEGER
)
AS
i INTEGER;
BEGIN
FORALL i IN 1..2
INSERT INTO test_forall VALUES(to_char(i));
-- EXCEPTION
-- WHEN FORALL_NEED_DML THEN
-- PSV_SQLCODE := SQLCODE;
-- raise info 'SQLCODE IS %', PSV_SQLCODE;
END ;
/
-- check prokind
select prokind from pg_proc where proname = 'pro_sqlcode';
CREATE FUNCTION test_forallDML5(IN iter int) RETURNS integer AS $$
BEGIN
forall i in 1..iter;
return iter;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_forallDML6(IN iter int) RETURNS integer AS $$
BEGIN
raise FORALL_NEED_DML;
return iter;
--EXCEPTION WHEN FORALL_NEED_DML THEN
-- return 0;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_forallDML7(IN iter int) RETURNS integer AS $$
BEGIN
raise SQLSTATE 'P0004';
return iter;
--EXCEPTION WHEN FORALL_NEED_DML THEN
-- return 0;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_forallDML8(IN iter int) RETURNS integer AS $$
BEGIN
raise SQLSTATE 'P0004';
return iter;
END;
$$ LANGUAGE plpgsql;
DECLARE
a int;
BEGIN
PRO_SQLCODE(a);
END;
/
SELECT test_forallDML6(10);
SELECT test_forallDML7(10);
SELECT test_forallDML8(10);
SELECT test_forall(0, 10);
SELECT test_forall(1, 10);
SELECT test_forall(2, 10);
SELECT test_forall(3, 10);
SELECT * from test_forall ORDER BY a;
DROP table test_forall;
DROP FUNCTION test_forall(int, int);
DROP FUNCTION test_forallDML6(int);
DROP FUNCTION test_forallDML7(int);
DROP FUNCTION test_forallDML8(int);
DROP PROCEDURE PRO_SQLCODE;
-------------------------function call-----------------------------------
-------------------------function defination-----------------------------
--
--
--
--no argument
CREATE FUNCTION hw_insertion() returns integer AS $$
BEGIN
insert into test_procedure values ('aa');
return 0;
END;
$$ LANGUAGE plpgsql;
--IN
CREATE FUNCTION hw_insertion1 (IN flag INT) returns integer AS $$
BEGIN
if flag=1 then
insert into test_procedure values ('aa');
end if;
return flag;
END;
$$ LANGUAGE plpgsql;
--OUT
CREATE FUNCTION hw_insertion2 (OUT arg INT) returns integer AS $$
BEGIN
insert into test_procedure values ('aa');
select count(*) into arg from test_procedure;
END;
$$ LANGUAGE plpgsql;
--IN, OUT
CREATE FUNCTION hw_insertion3 (in flag INT, OUT arg INT) returns integer AS $$
BEGIN
if flag=1 then
insert into test_procedure values ('aa');
select count(*) into arg from test_procedure;
end if;
END;
$$ LANGUAGE plpgsql;
--INOUT
CREATE FUNCTION hw_insertion4 (INOUT iter INT) returns integer AS $$
BEGIN
forall i in 0..iter
insert into test_procedure values ('aa');
select count(*) into iter from test_procedure;
END;
$$ LANGUAGE plpgsql;
--IN, INOUT
CREATE FUNCTION hw_insertion5 (IN flag int, INOUT iter int) returns integer AS $$
BEGIN
if flag=1 then
forall i in 1..iter
insert into test_procedure values ('aa');
select count(*) into iter from test_procedure;
end if;
END;
$$ LANGUAGE plpgsql;
--INOUT INOUT
CREATE FUNCTION hw_insertion6 (INOUT flag int, INOUT iter int) AS $$
BEGIN
if flag=1 then
forall i in 1..iter
insert into test_procedure values ('aa');
select count(*) into iter from test_procedure;
end if;
END;
$$ LANGUAGE plpgsql;
--OUT OUT
CREATE FUNCTION hw_insertion7 (OUT flag int, OUT iter int) AS $$
DECLARE
flag int := 1;
iter int := 10;
BEGIN
if flag=1 then
forall i in 1..iter
insert into test_procedure values ('aa');
select count(*) into iter from test_procedure;
end if;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION hw_insertion8 (IN flag int, IN iter int) RETURNS void AS $$
BEGIN
if flag=1 then
forall i in 1..iter
insert into test_procedure values ('aa');
select count(*) into iter from test_procedure;
end if;
END;
$$ LANGUAGE plpgsql;
CREATE table test_procedure (a char(10));
-------------------------function invoke--------------------------------
--
--
--
---------------------------------normal case---------------------------
CREATE FUNCTION testfunc7() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
r int := 4;
s int := 4;
t int;
BEGIN
hw_insertion(); --NO ARGUMENT
hw_insertion1(q); --IN
hw_insertion2(t); --OUT
hw_insertion3(p, t); --IN, OUT
hw_insertion4(p); --INOUT
hw_insertion5(q, p); --IN, INOUT
hw_insertion6(q, p); --INOUT INOUT
hw_insertion7(q, p); --OUT OUT
hw_insertion8(q, p); --IN IN
select count(*) into p from test_procedure;
return p;
END;
$$ LANGUAGE plpgsql;
SELECT testfunc7();
---------------superflous arguments, error----------------------
--
--
--
CREATE FUNCTION test_func_call_more_arg() RETURNS integer AS $$
DECLARE
p int := 10;
BEGIN
hw_insertion(p);
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg1() RETURNS integer AS $$
DECLARE
p int :=10;
t int;
BEGIN
hw_insertion2(p, t); --OUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg2() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
t int;
BEGIN
hw_insertion3(p, q, t); --IN, OUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg3() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
hw_insertion4(p, q); --INOUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg4() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
t int;
BEGIN
hw_insertion5(q, p, t); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg5() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
hw_insertion5(q, p, 1); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg6() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
hw_insertion5(q, p, 'abc'); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg7() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
hw_insertion5(q, p 'abc'); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
call test_func_call_more_arg7();
CREATE FUNCTION test_func_call_more_arg8() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
select hw_insertion5(q, p 'abc'); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
call test_func_call_more_arg8();
CREATE FUNCTION test_func_call_more_arg9() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
hw_insertion5(q, p, x); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg10() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
r varchar2 := 'abc';
BEGIN
hw_insertion5(q, p, r); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg11() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
hw_insertion5(q, p,); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg12() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 1;
BEGIN
select hw_insertion5(q, q, 1); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION hw_insertion_no_argmodes(p int, q int) RETURNS integer AS $$
DECLARE
BEGIN
if q > 10 then
forall i in 1..p
insert into test_procedure values ('aa');
end if;
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg13() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 11;
BEGIN
hw_insertion_no_argmodes(p, q, 1); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg14() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 11;
BEGIN
hw_insertion_no_argmodes(p, q)abc; --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_more_arg15() RETURNS integer AS $$
DECLARE
p int := 10;
q int := 11;
BEGIN
hw_insertion1(p, length('abc'))abc; --IN
return q;
END;
$$ LANGUAGE plpgsql;
BEGIN
hw_insertion1(1);
END;
/
BEGIN
hw_insertion1(2,'abc');
END;
/
BEGIN
hw_insertion1(3,4);
END;
/
------------------less arguments, error-------------------------
--
--
--
CREATE FUNCTION test_func_call_less_arg1() RETURNS integer AS $$
DECLARE
BEGIN
hw_insertion2(); --OUT
return 0;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_less_arg2() RETURNS integer AS $$
DECLARE
p int := 10;
BEGIN
hw_insertion3(p); --IN, OUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_less_arg3() RETURNS integer AS $$
DECLARE
BEGIN
hw_insertion4(); --INOUT
return 0;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_less_arg4() RETURNS integer AS $$
DECLARE
q int := 1;
BEGIN
hw_insertion5(q); --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_less_arg5() RETURNS integer AS $$
DECLARE
q int := 1;
BEGIN
hw_insertion5; --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_less_arg6() RETURNS integer AS $$
DECLARE
q int := 1;
BEGIN
hw_insertion5[]; --IN, INOUT
return q;
END;
$$ LANGUAGE plpgsql;
------------------------------------argument type not match---------------------------
--
--
--
CREATE FUNCTION test_func_call_argtype1() RETURNS integer AS $$
DECLARE
q char := 'a';
BEGIN
hw_insertion1(q); --IN
return q;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype2() RETURNS integer AS $$
DECLARE
t float := 1.5;
BEGIN
hw_insertion2(t); --OUT
return t;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype3() RETURNS integer AS $$
DECLARE
p varchar := 'a';
t float := 1.5;
BEGIN
hw_insertion3(p,t); --IN, OUT
return t;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype4() RETURNS integer AS $$
DECLARE
p real := 10.6;
BEGIN
hw_insertion4(p); --INOUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype5() RETURNS integer AS $$
DECLARE
p text := 10;
q char := 'a';
BEGIN
hw_insertion5(q,p); --IN, INOUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype6() RETURNS integer AS $$
DECLARE
q char := 'a';
BEGIN
hw_insertion5(q, 'abc'); --IN, INOUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype7() RETURNS integer AS $$
DECLARE
p text := 10;
q char := 'a';
BEGIN
hw_insertion5(q, 'abc'); --IN, INOUT
return p;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_argtype8() RETURNS integer AS $$
DECLARE
p text := 10;
q int := 10;
BEGIN
hw_insertion5(q, 1); --IN, INOUT
return p;
END;
$$ LANGUAGE plpgsql;
SELECT test_func_call_argtype1();
SELECT test_func_call_argtype2();
SELECT test_func_call_argtype3();
SELECT test_func_call_argtype4();
SELECT test_func_call_argtype5();
SELECT test_func_call_argtype6();
SELECT test_func_call_argtype7();
SELECT test_func_call_argtype8();
-------------------keyword as function name, error-------------------
--
--
--
CREATE FUNCTION test_func_call_keyword() RETURNS integer AS $$
DECLARE
p int :=10;
q int :=1;
r int :=4;
BEGIN
to(p,q,r); -- to is a keyword. error
return r;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_keyword1() RETURNS integer AS $$
DECLARE
p int :=10;
q int :=1;
r int :=4;
BEGIN
close(p,q,r); --close is a keyword
return r;
END;
$$ LANGUAGE plpgsql;
---------------------------overloaded function-------------------
--
--
--
CREATE FUNCTION hw_insertion_overload () returns integer AS $$
BEGIN
insert into test_procedure values ('aa');
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION hw_insertion_overload (in flag INT) returns integer AS $$
BEGIN
if flag>0 then
insert into test_procedure values ('aa');
end if;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION hw_insertion_overload (in flag INT, INOUT arg INT) returns integer AS $$
BEGIN
if flag>0 then
insert into test_procedure values ('aa');
select count(*) into arg from test_procedure;
end if;
END;
$$ LANGUAGE plpgsql;
---------------------------overloaded function, error-------------------
--
--
--
CREATE FUNCTION test_func_call_overload() RETURNS integer AS $$
DECLARE
p int :=10;
q int :=1;
r int :=4;
BEGIN
hw_insertion_overload(); --overloaded
return r;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION test_func_call_overload1() RETURNS integer AS $$
DECLARE
p int :=10;
q int :=1;
r int :=4;
BEGIN
hw_insertion_overload(p); --overloaded
return r;
END;
$$ LANGUAGE plpgsql;
DROP TABLE test_procedure;
DROP FUNCTION hw_insertion();
DROP FUNCTION hw_insertion1(int);
DROP FUNCTION hw_insertion2();
DROP FUNCTION hw_insertion3(int);
DROP FUNCTION hw_insertion4(int);
DROP FUNCTION hw_insertion5(int, int);
DROP FUNCTION hw_insertion6(int, int);
DROP FUNCTION hw_insertion7();
DROP FUNCTION hw_insertion8(int, int);
DROP FUNCTION test_func_call_more_arg7();
DROP FUNCTION testfunc7();
DROP FUNCTION test_func_call_argtype1();
DROP FUNCTION test_func_call_argtype2();
DROP FUNCTION test_func_call_argtype3();
DROP FUNCTION test_func_call_argtype4();
DROP FUNCTION test_func_call_argtype5();
DROP FUNCTION test_func_call_argtype6();
DROP FUNCTION test_func_call_argtype7();
DROP FUNCTION test_func_call_argtype8();
DROP FUNCTION hw_insertion_overload();
DROP FUNCTION hw_insertion_overload(int);
DROP FUNCTION hw_insertion_overload(int, int);
create function sp_testsp
(
RETURNCODE INTEGER,
testvalue1 varchar(10),
testvalue2 INTEGER
)
returns integer
AS $$
DECLARE
mynumber integer :=0;
BEGIN
if testvalue2 > 0 then
insert into test_procedure values ('aa');
end if;
mynumber :=2;
RETURN 0;
END;
$$ LANGUAGE plpgsql;
create function sp_testsp1
(
RETURNCODE INTEGER,
testvalue1 varchar(10),
testvalue2 INTEGER DEFAULT 1
)
returns integer
AS $$
DECLARE
mynumber integer :=0;
BEGIN
if testvalue2 > 0 then
insert into test_procedure values ('aa');
mynumber :=2;
end if;
RETURN 0;
END;
$$ LANGUAGE plpgsql;
create table test_procedure (a char(10));
create function sp_callfunc(a int, b varchar(10), c int)
returns INTEGER
AS $$
DECLARE
BEGIN
sp_testsp(1+1, $2, $3);
RETURN 0;
END;
$$ LANGUAGE plpgsql;
create function sp_callfunc1()
returns INTEGER
AS $$
DECLARE
a int:=1;
b varchar:='abd';
c int:=1;
BEGIN
sp_testsp1(length('a'),'abd',1);
RETURN 0;
END;
$$ LANGUAGE plpgsql;
create function sp_callfunc2(a int, b varchar(10), c int)
returns INTEGER
AS $$
DECLARE
BEGIN
sp_testsp1($1, $2);
RETURN 0;
END;
$$ LANGUAGE plpgsql;
create function sp_callfunc3()
returns INTEGER
AS $$
DECLARE
a int:=1;
b varchar:='abd';
c int:=1;
BEGIN
sp_testsp1(1,'abd');
RETURN 0;
END;
$$ LANGUAGE plpgsql;
select sp_callfunc(1, 'abd', 1);
select sp_callfunc1();
select sp_callfunc2(1, 'abd', 1);
select sp_callfunc3();
select * from test_procedure;
drop table test_procedure;
drop function sp_testsp(int, varchar(10), int);
drop function sp_testsp1(int, varchar(10), int);
drop function sp_callfunc(int, varchar(10), int);
drop function sp_callfunc1();
drop function sp_callfunc2(int, varchar(10), int);
drop function sp_callfunc3();
--support ':' out argument.
CREATE OR REPLACE PROCEDURE sp_test_1
(
param1 in INTEGER,
param2 out INTEGER,
param3 in INTEGER
)
AS
BEGIN
param2:= param1 + param3;
END;
/
DECLARE
input1 INTEGER:=1;
input2 INTEGER:=2;
l_param2 INTEGER;
BEGIN
EXECUTE IMMEDIATE 'begin sp_test_1(:col_1, :col_2, :col_3);end;'
USING IN input1, OUT l_param2, IN input2;
END;
/
DECLARE
l_param2 INTEGER;
BEGIN
EXECUTE IMMEDIATE 'begin sp_test_1(1, :col_2, 2);end;'
USING OUT l_param2;
END;
/
DECLARE
l_param2 INTEGER;
BEGIN
EXECUTE IMMEDIATE 'begin sp_test_1(1, :col_2, 2.5);end;'
USING OUT l_param2;
END;
/
DECLARE
l_param2 INTEGER;
BEGIN
EXECUTE IMMEDIATE 'begin sp_test_1('a', :col_2, 2.5);end;'
USING OUT l_param2;
END;
/
--deterministic clause
--custom script
CREATE OR REPLACE FUNCTION FN_HW_IP2LONG
(
IP_STRING IN VARCHAR2
) RETURN NUMBER DETERMINISTIC
IS
BEGIN
RETURN
TO_NUMBER(REGEXP_SUBSTR(IP_STRING, '\d+', 1, 1)) * 16777216 + -- 2^24
TO_NUMBER(REGEXP_SUBSTR(IP_STRING, '\d+', 1, 2)) * 65536 + -- 2^16
TO_NUMBER(REGEXP_SUBSTR(IP_STRING, '\d+', 1, 3)) * 256 + -- 2^8
TO_NUMBER(REGEXP_SUBSTR(IP_STRING, '\d+', 1, 4)); -- 2^0
END;
/
SELECT PRONAME FROM PG_PROC WHERE PRONAME = 'fn_hw_ip2long';
DROP FUNCTION FN_HW_IP2LONG;
--create function with deterministic clause
CREATE OR REPLACE FUNCTION TEST_FUNC(NUM IN INTEGER) RETURN NUMBER DETERMINISTIC
IS
DIVIDE INTEGER;
LOOK NUMBER;
BEGIN
DIVIDE := 3;
RETURN NUM/DIVIDE;
END;
/
SELECT PRONAME FROM PG_PROC WHERE PRONAME = 'test_func';
SELECT TEST_FUNC(99) FROM DUAL;
SELECT TEST_FUNC(35678) FROM DUAL;
SELECT TEST_FUNC(8934) FROM DUAL;
DROP FUNCTION TEST_FUNC;
CREATE OR REPLACE FUNCTION TEST_FUNC(NUM IN INTEGER) RETURN NUMBER DETERMINISTIC
AS
BEGIN
RETURN NUM/99;
END;
/
SELECT PRONAME FROM PG_PROC WHERE PRONAME = 'test_func';
SELECT TEST_FUNC(99) FROM DUAL;
SELECT TEST_FUNC(35678) FROM DUAL;
SELECT TEST_FUNC(89234) FROM DUAL;
DROP FUNCTION TEST_FUNC;
CREATE OR REPLACE PROCEDURE test_direct_call
(
param1 IN INTEGER,
result OUT INTEGER,
param3 IN INTEGER
)
AS
BEGIN
result := param1 + param3;
END;
/
CREATE OR REPLACE PROCEDURE test_direct_call2()
AS
a int;
BEGIN
test_direct_call(1,a;);
END;
/
--------------------------------------------------------------------------
-- support return the two-string-composed type, like "CHARACTER VARYING"
--------------------------------------------------------------------------
CREATE FUNCTION test_func_define(v1 CHARACTER VARYING)
RETURN CHARACTER VARYING
AS
v2 varchar2(100);
BEGIN
v2 := 'Function ';
RETURN v2 || v1;
END;
/
SELECT TEST_FUNC_DEFINE('test_func_define called') from dual;
DROP FUNCTION test_func_define;
--procedure name contain $
CREATE OR REPLACE PROCEDURE "$TEST$"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"$TEST$"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
DROP PROCEDURE "$TEST$";
--procedure name contain special ident, "." could not support.
CREATE OR REPLACE PROCEDURE "~!@#$%^&*()`,/<>:;'{}[]|\-_+="
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"~!@#$%^&*()`,/<>:;'{}[]|\-_+="();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
DROP PROCEDURE "~!@#$%^&*()`,/<>:;'{}[]|\-_+=";
--other test
CREATE OR REPLACE PROCEDURE "$TEST"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"$TEST"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
-- with schema
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
public."$TEST"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
DROP PROCEDURE "$TEST";
-- with uppercase schema
CREATE SCHEMA "AAA";
CREATE SCHEMA SQL_BASE_SYNTAX;
CREATE OR REPLACE PROCEDURE "AAA"."$TEST$"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE SQL_BASE_SYNTAX.FUNCTION_018
AS
BEGIN
"AAA"."$TEST$"();
END;
/
CALL SQL_BASE_SYNTAX.FUNCTION_018();
-- with quoted keyword
CREATE OR REPLACE PROCEDURE "create"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE SQL_BASE_SYNTAX.FUNCTION_018
AS
BEGIN
public."create"();
END;
/
CALL SQL_BASE_SYNTAX.FUNCTION_018();
DROP PROCEDURE SQL_BASE_SYNTAX.FUNCTION_018;
DROP PROCEDURE "AAA"."$TEST$";
DROP PROCEDURE "create";
DROP SCHEMA "AAA";
DROP SCHEMA SQL_BASE_SYNTAX;
CREATE OR REPLACE PROCEDURE "!@#TEST!@#"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"!@#TEST!@#"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
DROP PROCEDURE "!@#TEST!@#";
--uppercase and lowercase
CREATE OR REPLACE PROCEDURE test_uppercase
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
--uppercase
test_uppercase();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE test_uppercase;
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
CREATE OR REPLACE PROCEDURE test_lowercase
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
--lowercase
test_lowercase();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE test_lowercase;
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
--create uppercase, call use lowercase, failed!
CREATE OR REPLACE PROCEDURE test_0004
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"test_0004"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE test_0004;
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
--create uppercase, call use uppercase
CREATE OR REPLACE PROCEDURE test_0005
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"TEST_0005"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE test_0005;
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
--create lowercase, call use lowercase
CREATE OR REPLACE PROCEDURE "test_0006"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"test_0006"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE test_0006;
DROP PROCEDURE "test_0006";
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
--create lowercase, call use uppercase, failed!
CREATE OR REPLACE PROCEDURE "test_0007"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"TEST_0007"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE test_0007;
DROP PROCEDURE "test_0007";
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
CREATE OR REPLACE PROCEDURE "$TEst$"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
"$TEst$"();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
DROP PROCEDURE "$TEST$";
DROP PROCEDURE "$TEst$";
CREATE OR REPLACE PROCEDURE "TEST_0008"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
test_0008();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE "test_0008";
DROP PROCEDURE test_0008;
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
CREATE OR REPLACE PROCEDURE "test_0009"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
test_0009();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE "test_0009";
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
CREATE OR REPLACE PROCEDURE "test_00010"
AS
BEGIN
RETURN;
END;
/
CREATE OR REPLACE PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018
AS
BEGIN
TEST_00010();
END;
/
CALL FVT_GAUSSDB_ADAPT_FUNCTION_018();
DROP PROCEDURE "test_00010";
DROP PROCEDURE FVT_GAUSSDB_ADAPT_FUNCTION_018;
--test select into behavior
drop table if exists tbl_into;
create table tbl_into(s1 integer,s2 varchar2,s3 numeric);
insert into tbl_into values(3,'a',4);
insert into tbl_into values(2,'a',4);
create or replace procedure proc_into_gs1
as
tmp integer;
begin
select s1 into tmp from tbl_into where s3=5;
end;
/
call proc_into_gs1();
create or replace procedure proc_into_gs2
as
tmp integer;
begin
select s1 into tmp from tbl_into where s3=4;
end;
/
call proc_into_gs2();
drop table tbl_into;
CREATE OR REPLACE PROCEDURE SP_TEST( I IN INTEGER)
AS
ERROR HERE; -- ERROR OCCURED HERE
BEGIN
RETURN I;
END;
/
SELECT PG_GET_FUNCTIONDEF(OID) FROM PG_PROC WHERE PRONAME='sp_test';
SELECT PROSRC FROM PG_PROC WHERE PRONAME='sp_test';
CALL SP_TEST(8);
DROP PROCEDURE SP_TEST;
create table alt_partnm_tbl_003(c_integer integer, c_varchar varchar)
partition by range(c_integer)
(partition p_10 values less than(10),
partition p_20 values less than(20),
partition p_30 values less than(30)
);
create table alt_partnm_tbl_003_1(
c_integer integer,
c_varchar varchar
)with(orientation=column);
create or replace procedure pro_alt_partnm_tbl_003()
as
begin
insert into alt_partnm_tbl_003_1 select * from alt_partnm_tbl_003 partition (p_10);
end;
/
select pro_alt_partnm_tbl_003();
alter table alt_partnm_tbl_003 rename partition p_10 to _10;
select pro_alt_partnm_tbl_003();
--add to check set command
set check_function_bodies = off;
show current_schema;
create or replace procedure expbeg_call_noexpbeg_5() as
declare
count_num int;
begin
create schema expbeg_call_noexpbeg_5;
set current_schema = expbeg_call_noexpbeg_5;
create table expbeg_call_noexpbeg_5(id int,info text);
insert into expbeg_call_noexpbeg values(1,'hello');
end;
/
call expbeg_call_noexpbeg_5();
show current_schema;
create table pro_schema(id int);
------------------------------------------------------
------------------------------------------------------
------------------------------------------------------plpgsql_exec_function PLPGSQL_DTYPE_ROW
create type ct_int as (col1 int,col2 int);
drop function if exists test_prc_pram(x int, y ct_int, out z ct_int);
create or replace function test_prc_pram(x int, y ct_int, out z ct_int) as $$
begin
z.col1 := x;
z.col2 := y.col2;
end;
$$ LANGUAGE plpgsql;
select *from test_prc_pram(1,row(2,3));
------------------------------------------------------stmt_execsql
CREATE TYPE u_country AS ENUM ('Brazil', 'England', 'Germany');
CREATE TYPE u_street_type AS (
street VARCHAR(100),
no VARCHAR(30)
);
CREATE TYPE u_address_type AS (
street u_street_type,
zip VARCHAR(50),
city VARCHAR(50),
country u_country,
since DATE,
code INTEGER
);
drop table if exists t_author;
CREATE TABLE t_author (
id INTEGER NOT NULL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50) NOT NULL,
date_of_birth DATE,
year_of_birth INTEGER,
address u_address_type
);
INSERT INTO t_author VALUES (1, 'George', 'Orwell',
TO_DATE('1903-06-25', 'YYYY-MM-DD'), 1903, ROW(ROW('Parliament Hill',
'77'), 'NW31A9', 'Hampstead', 'England', '1980-01-01', null));
INSERT INTO t_author VALUES (2, 'Paulo', 'Coelho',
TO_DATE('1947-08-24', 'YYYY-MM-DD'), 1947, ROW(ROW('Caixa Postal',
'43.003'), null, 'Rio de Janeiro', 'Brazil', '1940-01-01', 2));
drop function if exists p_enhance_address2();
CREATE FUNCTION p_enhance_address2 (address OUT u_address_type)
AS $$
BEGIN
SELECT t_author.address
INTO address
FROM t_author
WHERE first_name = 'George';
END;
$$ LANGUAGE plpgsql;
select *from p_enhance_address2();
------------------------------------------------------dynexecute
drop table if exists tt_proc;
create table tt_proc(col1 ct_int, col2 int);
insert into tt_proc values(row(1,2),3);
drop function if exists test_prc_into1();
create or replace function test_prc_into1() returns ct_int as $$
declare
res ct_int;
begin
execute 'select col1 from tt_proc' into res;
return res;
end;
$$ LANGUAGE plpgsql;
select *from test_prc_into1();
drop function if exists test_prc_into2();
create or replace function test_prc_into2() returns int as $$
declare
res int;
begin
execute 'select col2 from tt_proc' into res;
return res;
end;
$$ LANGUAGE plpgsql;
select *from test_prc_into2();
------------------------------------------------------cursor
drop table if exists tt_staff;
create table tt_staff(section_id int,first_name VARCHAR2(20), phone_number VARCHAR2(20), salary NUMBER(8,2));
insert into tt_staff values(30, 'hlc','11111', 123);
DECLARE
name VARCHAR2(20);
phone_number VARCHAR2(20);
salary NUMBER(8,2);
sqlstr VARCHAR2(1024);
TYPE app_ref_cur_type IS REF CURSOR; --定义游标类型
my_cur app_ref_cur_type; --定义游标变量
BEGIN
sqlstr := 'select first_name,phone_number,salary from tt_staff
where section_id = :1';
OPEN my_cur FOR sqlstr USING '30'; --打开游标, using是可选的
FETCH my_cur INTO name, phone_number, salary; --获取数据
WHILE my_cur%FOUND LOOP
FETCH my_cur INTO name, phone_number, salary;
END LOOP;
CLOSE my_cur; --关闭游标
END;
/
------------------------------------------------------一个成员的composite变量
create type cpt_1 as (ct int);
drop table if exists tt_cpt;
create table tt_cpt(id int, ct cpt_1);
insert into tt_cpt values(1,row(2));
drop function if exists test_ct1();
create or replace function test_ct1() returns setof cpt_1 as $$
declare
cpt cpt_1;
begin
for cpt in select ct from tt_cpt
loop
return next cpt;
end loop;
return;
end;
$$LANGUAGE plpgsql;
select *from test_ct1();
drop function if exists test_ct2();
create or replace function test_ct2() returns setof tt_cpt as $$
declare
cpt tt_cpt%rowtype;
begin
for cpt in select * from tt_cpt
loop
return next cpt;
end loop;
return;
end;
$$LANGUAGE plpgsql;
select *from test_ct2();
CREATE TYPE dt_text AS
(col1 text,
col2 text,
col3 text
);
CREATE TYPE dt_int AS
(col1 int,
col2 int,
col3 int
);
DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table (
id INT,
val dt_text
) ;
DROP TABLE IF EXISTS test_table2;
CREATE TABLE test_table2 (
id INT,
val1 dt_text,
val2 dt_int
) ;
INSERT INTO test_table VALUES (1, ('a','b','c'));
INSERT INTO test_table2 VALUES (1, ('a','b','c'), (1,2,3));
drop function if exists get_row0();
CREATE OR REPLACE FUNCTION get_row0() RETURNS setof dt_text AS
$$
DECLARE
r dt_text;
BEGIN
FOR r IN SELECT val FROM test_table LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_row0();
drop function if exists get_row1();
CREATE OR REPLACE FUNCTION get_row1() RETURNS setof test_table AS
$$
DECLARE
r test_table%rowtype;
BEGIN
FOR r IN SELECT * FROM test_table LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_row1();
------------------------------------------------------列组合
drop function if exists get_row1();
CREATE OR REPLACE FUNCTION get_row1() RETURNS setof dt_text AS
$$
DECLARE
r dt_text;
id int;
BEGIN
FOR id, r IN SELECT * FROM test_table LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_row1();
drop function if exists get_row2();
CREATE OR REPLACE FUNCTION get_row2() RETURNS void AS
$$
DECLARE
c1 text;
c2 text;
BEGIN
FOR c1, c2 IN SELECT val FROM test_table LOOP
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_row2();
-----------------------------------------------------匿名块
DECLARE
r dt_text;
BEGIN
SELECT val FROM test_table into r;
END;
/
drop table test_table;