移植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 ...
随机推荐
- ORA-01034: 、ORA-01078: 和 LRM-00109: 的解决方法
环境:Linux 5.4 Oracle 11.2.0.3 在Linux上连接Oracle时遇到报错: SQL> show parameter sgaORA-01034: ORACLE not a ...
- Jquery Validate验证是否为图片格式
//验证是否为图片 jQuery.validator.addMethod("checkPic", function (value, element) { var filepath ...
- Ajax大文件切割传输
文件上传服务器的大小是一定的,所以大文件可以切割成小文件,依次 传输,然后再拼接切割文件上传,用同步方式传输,为了防止异步传输 中多个块同时传输,文件拼接错误,导致文件损坏 前端页面 <!doc ...
- JS 异常: Uncaught RangeError: Maximum call stack size exceeded
遇到了这个js异常, 总是吧浏览器搞崩溃,这是什么原因呢? 开始我也只能想到死循环, 也许是哪个条件判断写错了,其实不是.经过google,发现了一篇文章,内容请看: ================ ...
- shell语法基础
一.变量 1.linux大小写敏感,变量取名要注意大小写.可以通过变量名前面加$来访问变量的内容.可以通过使用read命令来将用户输入的值赋给一个变量. 2.给变量赋值时,如果字符串中包含空格,就必须 ...
- HTML+CSS学习总结:
1. 注释:<div> 是一个块级元素,也就是说,浏览器通常会在 div 元素前后放置一个换行符. 提示:请使用 <div> 元素来组合块级元素,这样就可以使用样式对它们进行格 ...
- Centos中安装PHP的PDO MySQL扩展的教程
PHP Data Objects(PDO)扩展为 PHP 访问数据库定义了一个轻量级的一致接口.实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能.注意利用 PDO 扩展自身并 ...
- 【原创】Oracle函数中对于NO_DATA_FOUND异常处理的研究
一直以来有一个困惑,一直没解决,昨天一哥们问我这个问题,决心弄清楚,终于得到了答案.先看下面这个函数: create or replace function fn_test(c_xm varchar) ...
- 【学习笔记】【C语言】选择结构-if
1.if的第1种结构 if(条件) { 语句1; 语句2; ...... } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句: 如果条件为假, ...
- [转]解决win8.1右键菜单出现在左边
1.在控制面板中找到“Tablet PC 设置”窗口,选择“其他”选项卡. 2.在“左右手使用习惯”下,点选“惯用左手”,确定. •如果win8.1的控制面板里找不到Tablet PC 设置 •可以在 ...