移植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 界面效果42】如何自定义字体
项目里要统一用设计师的字体,android:typeface只支持系统三种字体.有什么比较好的做法? 你需要为整个应用替换自定义字体. 解决方案 1)Android默认方法 #1 你可以通过ID查找到 ...
- (五)u-boot2013.01.01 for TQ210:《移植前的准备及u-boot初编译》
移植前的准备 移植前,要做的事情是搭建开发环境以及对U-boot源码的获取.首先说一下开发环境: 1.此次U-boot移植的硬件平台是天嵌的TQ210开发板: CPU:板载核心是S5PV210(Cor ...
- MySQL中/*!40100注释
MySQL中的注释 MySQL中的注释有三种: # 注释内容 -- 注释内容 /* 注释内容*/ 但是,在导出的SQL文件中,也会看到类似如下内容的注释: CREATE DATABASE `blog` ...
- POJ 1751 Highways (最小生成树)
Highways Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- 初识 Asp.Net内置对象之Application对象
Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...
- 【转】利用MVC模式开发Java应用程序[组图]
Java是一种面向对象的语言,是实现面向对象编程的强大工具.我们在实际编程中,应该运用并发挥其最大效能.但是,要利用面向对象编程思想,自己独立开 发出好的Java应用程序,非凡是大.中型程序,并不是一 ...
- 删除utorrent广告栏
自从utorrent附带广告栏后整个页面很难看,特别是右面下载详细列表变得支离破碎,今天实在是忍不了,网络搜索关键字“remove utorrent ads”,有效解决了问题. 具体如下:打开设置,选 ...
- Android webkit 事件传递流程详解
前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...
- jquery与checkbox的checked属性的问题
1.页面加载成功后,点击选中或取消选中该checkbox,checkbox属性里的checked属性不会根据该checkbox是否选中而变化 2.checkbox里的onchange或onclick方 ...
- 读书笔记-UIView与控件
1.UIView 在Objective-C中,NSObject是所有类的“根”类.同样,在UIKit框架中,也存在一个如此神奇的类UIView.从继承关系上看,UIView是所有视图的根. 1.1.U ...