移植Oracle procedure 到 postgresql
1.登录postgresql
psql -h 192.168.137.131 -p 5432 postgres sa
tusc@6789#JKL
2.创建用户
CREATE USER name thunisoft createdb; --(equal CREATE ROLE name LOGIN createdb);
3.创建数据库
create database test_database owner = thunisoft;
4.查看帮助 psql 下敲help
[thunisoft@localhost ~]$ psql test_database
psql (9.3.6)
Type "help" for help. test_database=> help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
test_database=>
5.与其他数据库的类比
a.支持大多数的标准SQL.
b.支持复杂查询、外键、多版本并发控制、事务....
c.数据类型和函数十分丰富.
6.连接方式可以用Navicate Premium,当然还有自带的psql类似Oracle的sqlplus.

7.将Oracle存储过程迁移到PostgreSql 上.
PostgreSQL 支持多种过程语言,PostgreSQL原生的过程语言是pl/pgsql,还支持PL/Python,PL/perl等.
这里我们演示PL/pgsql(对原始脚本进行了删减和重命名)
Porcedure in Oracle:
--抽数到结果表
procedure scheme_test_etl(in_scheme_id varchar2,
in_bbq varchar2,
table_Prefix varchar2) is
v_error_rows number;
v_row_cnt number;
v_bbq varchar2(10);
v_model varchar2(30);
v_table varchar2(32);
v_sql varchar2(3000); begin
v_bbq := in_bbq;
v_model := table_Prefix; /*临时表数据清理*/
execute immediate 'truncate table TEMP_EDQ10_DIM_LEVEL_ANAYS'; /*抽数到临时表*/
v_sql := 'insert into TEMP_EDQ10_DIM_LEVEL_ANAYS select * from ' ||
v_model || '_DIM_LEVEL_ANAYS';
execute immediate v_sql; --被检测表信息
v_table := v_model || '_checkedtb';
execute immediate 'delete from ' || v_table ||
' t where t.schemeid_ = ' || chr(39) || in_scheme_id ||
chr(39) || ' and t.bbq =' || v_bbq;
for c in (select t.PERIOD_ BBQ_,
t.SCHEMEID_,
t.HIERARCHY_, --数据级次
t2.facttableid_, --表名
100 - sum(nvl(DUETABLESCORE_, 0) - nvl(TABLESCORE_, 0)) table_score, --表分数
sum(nvl(t.TOTALCNT_, 0)) TOTALCNT_, --此期此户此规则全部数据行数 ==> 规则检查次数
sum(nvl(t.ERRORCNT_, 0)) ERRORCNT_ --错误数 ==>错误次数
from temp_EDQ10_STATISTICS t, EDQ10_RULES t2
where t.ruleid_ = t2.id_
group by t.PERIOD_,
t.SCHEMEID_,
t.HIERARCHY_,
t2.facttableid_) loop v_error_rows := get_scheme_error_rows(c.hierarchy_, c.facttableid_); --得到方案错误行数
v_row_cnt := get_scheme_total_rows(c.hierarchy_, c.facttableid_); --得到方案总数据行数 v_sql := 'insert into ' || v_table || '
(bbq,
SCHEMEID_,
hierarchy_,
checkedtable_score,
checkedtable_id,
checkedtable_rows,
error_rows,
checked_times,
error_times)
select :1,:2,:3,:4,:5,:6,:7,:8,:9 from dual';
execute immediate v_sql
using c.BBQ_, c.SCHEMEID_, c.HIERARCHY_, c.table_score, c.facttableid_, v_row_cnt, v_error_rows, c.TOTALCNT_, c.ERRORCNT_;
end loop; commit; exception
when others then
dbms_output.put_line(sqlcode || '--' || sqlerrm);
rollback;
end;
oracle procedure
function in PostgreSQL:
create or replace function DataClaen_ETL.scheme_test_etl(in_scheme_id in varchar,in_bbq in varchar,table_Prefix in varchar)
returns void as $func$
declare
--抽数到结果表
v_error_rows numeric;
v_row_cnt numeric;
v_bbq varchar(10);
v_model varchar(30);
v_table varchar(32);
v_sql text; referrer_keys CURSOR IS
select t.period_ bbq,
t.SCHEMEID_,
t.hierarchy_, --数据级次
100 -
sum(t.DUERULESCORE_ - t.RULESCORE_) scheme_score, -- ==>方案得分
sum(t.TOTALCNT_) TOTALCNT_, --此期此户此规则全部数据行数 ==> 规则检查次数
sum(t.ERRORCNT_) error_times, --错误数 ==>错误次数
count(distinct t.ruleid_) scheme_rule_cnt, --方案规则总数
sum(case
when t.ERRORCNT_ = 0 then
0
else
1
end) error_rule_cnt --错误规则数
from temp_EDQ10_STATISTICS t
group by t.period_, t.SCHEMEID_, t.hierarchy_
order by t.period_, t.SCHEMEID_, t.hierarchy_; begin
v_bbq := in_bbq;
v_model := table_Prefix; /*临时表数据清理*/
execute 'truncate table TEMP_EDQ10_DIM_LEVEL_ANAYS';
/*抽数到临时表*/
v_sql := 'insert into TEMP_EDQ10_DIM_LEVEL_ANAYS select * from ' ||
v_model || '_DIM_LEVEL_ANAYS';
execute v_sql; --模型方案总览表
v_table := v_model || '_scheme_vi';
v_sql := 'delete from ' || v_table || ' t where t.schemeid_ = ' ||
chr(39) || in_scheme_id || chr(39) || ' and t.PERIOD_ =' ||chr(39)||v_bbq||chr(39); execute v_sql; for c in referrer_keys loop
v_error_rows := dataclaen_etl.get_scheme_error_rows(c.hierarchy_, 'AA'); --得到方案错误行数
v_row_cnt := dataclaen_etl.get_scheme_total_rows(c.hierarchy_, 'AA'); --得到方案总数据行数 execute '
insert into ' || v_table || '
(PERIOD_,
SCHEMEID_,
hierarchy_,
scheme_score,
row_cnt,
ERR_ROW_CNT,
ruler_checked_times,
error_times,
scheme_rule_cnt,
error_rule_cnt)
values ('||chr(39)||c.bbq||chr(39)||' , '||chr(39)||c.SCHEMEID_||chr(39)||' , '||c.hierarchy_||' , '||c.scheme_score||' ,'|| v_row_cnt||' ,'|| v_error_rows||' , '||c.totalcnt_||' , '||c.error_times||' ,'|| c.scheme_rule_cnt||' , '||c.error_rule_cnt||')';
end loop; $func$ language plpgsql;
PostgreSQL function
实现方式的差异性:
a.plpgsql没有package的概念(在oracle 中是用package来组织procedure和function的),用schema代替(即创建Schema DataClaen_ETL 而不是package DataClaen_ETL)。
b.PostgreSQL 没有Procedure,但是支持函数,与Oracle的function的功能相同,更厉害的是PostgreSQL的function支持 returns void,这个角度看来function与procedure无异。
c.PLpgsql 中游标必须先声明再使用,不支持Oracle For 循环直接定义的方式。
d.PLpgsql 必须指定函数开始和结束的标识符,且需要指定函数的实现语言(如此示例中 language plpgsql)
e.PostgreSQL 中没有dual伪表。
d.plpgsql 不支持自制事务,不能添加commit
移植Oracle procedure 到 postgresql的更多相关文章
- Ways to access Oracle Database in PostgreSQL
Today, organizations stores information(data) in different database systems. Each database system ha ...
- Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
Installing and setting up Oracle GoldenGate connecting to an Oracle database Also please make sure t ...
- Linux下通过JDBC连接Oracle,SqlServer和PostgreSQL
今天正好需要统计三个网站栏目信息更新情况,而这三个网站的后台采用了不同的数据库管理系统.初步想法是通过建立一个小的Tomcat webapp,进而通过JDBC访问这三个后台数据库,并根据返回的数据生成 ...
- Oracle procedure 基本语法
转自:http://lorry1113.javaeye.com/blog/513851 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程 ...
- Oracle procedure存储过程/function函数
--函数的创建 create function func1(dno number) return NUMBER--必须带有返回值 is v_max number;--定义返回值 begin selec ...
- (转载)Oracle procedure 基本语法
转自:http://www.cnblogs.com/wolfplan/p/4004624.html 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDUR ...
- Oracle迁移至PostgreSQL工具之Ora2Pg
1. 描述 Ora2Pg是一个免费的工具,用于将Oracle数据库迁移到PostgreSQL兼容的模式.它连接您的Oracle数据库,自动扫描并提取它的结构或数据,然后生成可以装载到PostgreSQ ...
- Oracle Procedure记录
1.定义 所谓存储过程(Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过 编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储 ...
- Oracle,mysql,sqlserver,postgresql语句几点比較
1.分页 Oracle: SELECT * FROM(SELECT A.*, ROWNUM RN FROM (select T.* from sj_receiptinfo t WHERE t.TAXN ...
随机推荐
- 【Android Studio使用教程 7】AndroidStudio问题汇总
FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因 And ...
- 【Android车载系统 News | Tech 2】News 谷歌开发新车载系统!安卓Auto不是终点 2014-12-20
Google在今年推出了车载安卓系统Android Auto,旨在为汽车提供娱乐.导航等功能.不过,Android Auto并不是终点,现在有消息报道,Google正在开发一个能够彻底取代汽车底层控制 ...
- 重构7-Rename(method,class,parameter)
这是我最常用也是最有用的重构之一.我们对方法/类/参数的命名往往不那么合适,以至于误导阅读者对于方法/类/参数功能的理解.这会造成阅读者的主观臆断,甚至引入bug.这个重构看起来简单,但却十分重要. ...
- 不错的jQuery图表插件 .
很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,更好地帮助决策分析.今天就给大家分享几个个人觉得好用的jQuery图表插件,这几个图表插件使用起来非常方便,而且挺灵活的,相信大 ...
- HDU 2571 命运 (DP)
命运 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pr ...
- centos下使用nohup
Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序后台运行.比如我们要运行mysql在后台:/usr/local/mysql/bin/mysqld_sa ...
- hdu 3663 DLX
思路:把每个点拆成(d+1)*n列,行数为可拆分区间数.对所有的有i号点拆分出来的行都要建一条该行到i列的边,那么就能确保有i号点拆出来的行只能选择一行. #include<set> #i ...
- bind() to 0.0.0.0:80 failed (98: Address already in use)
You can kill it using: sudo fuser -k 80/tcp And then try restarting nginx again: service nginx start
- Java开发从零开始填坑
开始学习Java,感觉较.NET知识更零碎一些,所以开个帖子把自己踩过的坑记录下来,都是边边角角网上不容易找到的东西. 1.java命令格式:>cd %parent-of-pakadgePath ...
- “尝试加载 Oracle 客户端库时引发 BadImageFormatException”的解决方案
今天要写个程序,环境是win8.1+ vs2012+ oracle,可是却出现了一个意想不到的问题: 异常!以下为数据库提示详细错误信息:尝试加载 Oracle 客户端库时引发 BadImageFor ...