美文网首页
PostgreSQL Oracle 兼容性之存储过程

PostgreSQL Oracle 兼容性之存储过程

作者: 宅家学算法 | 来源:发表于2018-05-08 16:07 被阅读0次

 在oracle中,函数和存储过程是经常使用到的,并且有所区别;而postgresql中函数和存储过程都是相同定义的。

Oracle

(存储过程)

 1.定义:定义存储过程的关键字为procedure。
 2.创建存储过程

create or replace procedure 存储过程名(参数1 类型,参数2 out 类型……)                                     
  as
    变量名  类型;
  begin
    程序代码体
  end;

例:
(无参数)

create or replace procedure p1
--or replace代表创建该存储过程时,若存储名存在,则替换原存储过程,重新创建
--无参数列表时,不需要写()
as
begin
    dbms_output.put_line('hello world');
end;

(有参有返)

create or replace procedure p2 (name in varchar2,age int,msg out varchar2)
--参数列表中,声明变量类型时切记不能写大小,只写类型名即可,例如参数列表中的name变量的声明
--参数列表中,输入参数用in表示,输出参数用out表示,不写时默认为输入参数。
--输入参数不能携带值出去,输出参数不能携带值进来,当既想携带值进来,又想携带值出去,可以用in out
as
begin
    msg:='姓名'||name||',年龄'||age;
end;

总结
 1.创建存储过程的关键字为procedure。
 2.传参列表中的参数可以用in,out,in out修饰,参数类型一定不能写大小。列表中可以有多个输入输出参数。
 3.存储过程中定义的参数列表不需要用declare声明,声明参数类型时需要写大小的一定要带上大小。
 4.as可以用is替换。
 5.调用带输出参数的过程必须要声明变量来接收输出参数值。
 6.执行存储过程有两种方式,一种是使用execute,另一种是用begin和end包住。

(函数)

 1.定义:定义函数的关键字为function。
 2.创建函数

create or replace function f1
returnvarchar
--必须有返回值,且声明返回值类型时不需要加大小
as
    msg varchar(50);
begin
     msg :='hello world';
     returnmsg;
end;

总结
 1.定义函数的关键字为function 。
 2.必须有返回值,且声明返回值类型时不需要加大小。
 3.函数中定义的参数列表不需要用declare声明,声明参数类型时需要写大小的一定要带上大小。
 4.as可以用is替换。
  5.执行存储过程有两种方式,一种是使用select,另一种是用begin和end包住。

(Oracle存储过程与存储函数的区别)

不同点:
 1.存储过程定义关键字用procedure,函数定义用function。
 2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。
 3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。


Postgresql

 postgresql则将函数和存储过程合为一体,不再明确区分存储过程与函数。
 1.定义:定义函数(存储过程 )的关键字为function。
 2.创建

Create or replace function 过程名(参数名 参数类型,…..)
returns 返回值类型
as
  $body$
Declare
       变量名变量类型;
Begin                                   
        return 变量名; //存储过程中的返回语句
End;
 $body$
 Language plpgsql;

例:

CREATE OR REPLACE FUNCTION public.udf_station_in_step5_new()
  RETURNS void AS
$BODY$
DECLARE
    i integer := 0;
    tmp_reportdate timestamp ARRAY[100];
    res_slno integer ARRAY[100];
    res_reportdate timestamp ARRAY[100];
    v_cur_slno integer;
    v_cur_reportdate timestamp;
    v_sql varchar(500);
    cur_list cursor for select slno, reportdate from ods_t_station_in_single order by reportdate;
begin
    open cur_list;
    fetch cur_list into v_cur_slno, v_cur_reportdate;
    while found loop
        i := i+1;
        tmp_slno := v_cur_slno;
        tmp_reportdate[i] := v_cur_reportdate;
        fetch cur_list into v_cur_slno, v_cur_reportdate;
        while found loop
            if v_cur_slno > tmp_slno and v_cur_slno < tmp_slno+10 then
                i := i+1;
                tmp_slno := v_cur_slno;
                tmp_reportdate[i] := v_cur_reportdate;
                fetch cur_list into v_cur_slno, v_cur_reportdate;
            else
                if res_reportdate is null or array_length(tmp_reportdate,1) > array_length(res_reportdate,1) then
                    res_reportdate := tmp_reportdate;                   
                end if;
                i := 0;
                tmp_reportdate := null;
                exit;
            end if;
        end loop;
    end loop;
    close cur_list;
  --根据最长的序列挑选出最可能正确的数据
  execute  'delete from ods_t_station_in_single2';
  if(res_reportdate is not null) then
      for i in 1 .. array_length(res_reportdate,1) loop
        v_sql := 'insert into ods_t_station_in_single2 select * from ods_t_station_in_single where reportdate ='''||res_reportdate[i]||'''';
        execute v_sql;
      end loop;
  end if;
  execute 'delete from ods_t_station_in_single';
  insert into ods_t_station_in_single select * from ods_t_station_in_single2 order by reportdate;
  execute 'delete from ods_t_station_in_single2';
  exception
  when QUERY_CANCELED then
            raise 'udf_station_in_step5(0)';
  commit;
end;
$BODY$
  LANGUAGE plpgsql;

总结

 1.必须有有returns(注意是returns不是return)子句,无返回值时returns viod
 2.执行时,有返回值用select,无返回值时用perform
 3.必须指定语言LANGUAGE

相关文章

网友评论

      本文标题:PostgreSQL Oracle 兼容性之存储过程

      本文链接:https://www.haomeiwen.com/subject/xukwrftx.html