LLiHengsync code
de223dd1创建于 2022年3月4日历史提交
CREATE USER test_create_any_function_role PASSWORD 'Gauss@1234';
GRANT create any function to test_create_any_function_role;
CREATE TABLESPACE pri_create_fun_tsp LOCATION '@testtablespace@/pri_create_fun_tsp'; 
CREATE SCHEMA pri_fun_schema;
set search_path=pri_fun_schema;

SET ROLE test_create_any_function_role PASSWORD 'Gauss@1234';
--定义函数为SQL查询。
CREATE FUNCTION pri_fun_schema.pri_func_add_sql(integer, integer) RETURNS integer
    AS 'select $1 + $2;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;
--利用参数名用 PL/pgSQL 自增一个整数。
CREATE OR REPLACE FUNCTION pri_fun_schema.pri_func_increment_plsql(i integer) RETURNS integer AS $$
        BEGIN
                RETURN i + 1;
        END;
$$ LANGUAGE plpgsql;
--返回RECORD类型
CREATE OR REPLACE FUNCTION pri_fun_schema.pri_compute(i int, out result_1 bigint, out result_2 bigint)
returns SETOF RECORD
as $$
begin
    result_1 = i + 1;
    result_2 = i * 10;
return next;
end;
$$language plpgsql;
--返回一个包含多个输出参数的记录。
CREATE FUNCTION pri_fun_schema.pri_func_dup_sql(in int, out f1 int, out f2 text)
    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
    LANGUAGE SQL;

--计算两个整数的和,并返回结果。若果输入为null,则返回null。
CREATE FUNCTION pri_fun_schema.pri_func_add_sql2(num1 integer, num2 integer) RETURN integer
AS
BEGIN 
RETURN num1 + num2;
END;
/
--创建package属性的重载函数
create or replace function pri_fun_schema.pri_get_sal(NAME VARCHAR2) RETURN NUMBER package
IS
  BEGIN
    RETURN 1;
  END;
  /

create or replace function pri_fun_schema.pri_get_sal(NAME int) RETURN NUMBER package
IS
  BEGIN
    RETURN 1;
  END;
  /
select pri_fun_schema.pri_func_add_sql(1,2);
select pri_fun_schema.pri_func_increment_plsql(1);
select pri_fun_schema.pri_func_dup_sql(1);
select pri_fun_schema.pri_func_add_sql2(1,2);
select pri_fun_schema.pri_compute(1);
select pri_fun_schema.pri_get_sal('name');
select pri_fun_schema.pri_get_sal(1);
--PROCEDURE
CREATE OR REPLACE PROCEDURE pri_fun_schema.pri_prc_add
(
    param1    IN   INTEGER,
    param2    IN OUT  INTEGER
)
AS
BEGIN
   param2:= param1 + param2;
END;
/

CREATE OR REPLACE PROCEDURE pri_fun_schema.pri_autonomous(out res int)  AS 
DECLARE 
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    res := 55;
END;
/
select pri_prc_add(1,2);
select pri_autonomous();
reset role;

CREATE TABLE pri_fun_schema.creditcard_info (id_number  int, name text, credit_card  varchar(19));
SET ROLE test_create_any_function_role PASSWORD 'Gauss@1234';
CREATE OR REPLACE PROCEDURE pri_fun_schema.pri_autonomous_1()  AS 
BEGIN
  insert into pri_fun_schema.creditcard_info values(66, 66,66);
  select * from pri_fun_schema.creditcard_info;
  commit;
  insert into pri_fun_schema.creditcard_info values(77, 77,77);
  rollback;
END;
/

call pri_fun_schema.pri_autonomous_1();

--  CREATE TABLE in procedure
create or replace procedure pri_fun_schema.pri_test_proc_create(i in integer)
as
begin
    create table pri_fun_schema.pri_t11(id int) tablespace pri_create_fun_tsp;
end;
/
select pri_fun_schema.pri_test_proc_create(1);

reset role;

--删除函数。
DROP FUNCTION  pri_fun_schema.pri_func_add_sql(integer, integer);
DROP FUNCTION  pri_fun_schema.pri_func_increment_plsql(integer);
DROP FUNCTION  pri_fun_schema.pri_func_dup_sql(int);
DROP FUNCTION  pri_fun_schema.pri_func_add_sql2(integer, integer);
DROP FUNCTION  pri_fun_schema.pri_compute(int);
DROP FUNCTION  pri_fun_schema.pri_get_sal(VARCHAR2);
DROP FUNCTION  pri_fun_schema.pri_get_sal(int);

DROP SCHEMA pri_fun_schema cascade;
DROP TABLESPACE pri_create_fun_tsp;
\! rm -rf '@testtablespace@/pri_create_fun_tsp'
DROP USER test_create_any_function_role cascade;