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的更多相关文章

  1. Ways to access Oracle Database in PostgreSQL

    Today, organizations stores information(data) in different database systems. Each database system ha ...

  2. 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 ...

  3. Linux下通过JDBC连接Oracle,SqlServer和PostgreSQL

    今天正好需要统计三个网站栏目信息更新情况,而这三个网站的后台采用了不同的数据库管理系统.初步想法是通过建立一个小的Tomcat webapp,进而通过JDBC访问这三个后台数据库,并根据返回的数据生成 ...

  4. Oracle procedure 基本语法

    转自:http://lorry1113.javaeye.com/blog/513851 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程 ...

  5. Oracle procedure存储过程/function函数

    --函数的创建 create function func1(dno number) return NUMBER--必须带有返回值 is v_max number;--定义返回值 begin selec ...

  6. (转载)Oracle procedure 基本语法

    转自:http://www.cnblogs.com/wolfplan/p/4004624.html 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDUR ...

  7. Oracle迁移至PostgreSQL工具之Ora2Pg

    1. 描述 Ora2Pg是一个免费的工具,用于将Oracle数据库迁移到PostgreSQL兼容的模式.它连接您的Oracle数据库,自动扫描并提取它的结构或数据,然后生成可以装载到PostgreSQ ...

  8. Oracle Procedure记录

    1.定义 所谓存储过程(Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过 编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储 ...

  9. Oracle,mysql,sqlserver,postgresql语句几点比較

    1.分页 Oracle: SELECT * FROM(SELECT A.*, ROWNUM RN FROM (select T.* from sj_receiptinfo t WHERE t.TAXN ...

随机推荐

  1. Android(java)学习笔记67:多线程程序练习

    需求: 某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票. 两种方式实现 A:继承Thread类 B:实现Runnable接 1. 首先我们利用方式 ...

  2. Linq中使用Left Join

    use Test Create table Student( ID ,) primary key, ) not null ) Create Table Book( ID ,) primary key, ...

  3. leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)

    题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would t ...

  4. Java Script基础(九) 下拉列表对象

    Select下拉列表 属性: options[]:返回包含下拉列表中的所有选项的一个数组. selectedIndex:设置返回下拉列表中被选项目的索引号. length:返回下拉列表框中选项的数目. ...

  5. POJ 1502 MPI Maelstrom (最短路)

    MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6044   Accepted: 3761 Des ...

  6. ASP.NET 状态的传递和保存

    1,HTTP协议是无状态的.服务器不会记住上次给浏览器的处理结果,如果需要上次处理结果(上次状态)就需要浏览器把处理结果值(上次状态)再次给服务器. 2,URL传值:通过URL参数或者通过Form表单 ...

  7. html使用空格对齐文本(   )

    字符以及HTML实体 描述以及说明   这是我们使用最多的空格,也就是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个).要使用html实体表示才可累加. ...

  8. jquery简单的图片切换效果,支持pc端、移动端的banner图片切换开发

    详细内容请点击 无意中看见了两年前写的一个图片切换,那会儿刚刚学习网页制作,可以说是我的第一个处女座的jquery图片切换效果.无聊之余对它的宽度稍稍做了一下修改,变成了支持pc端.手机端全屏的ban ...

  9. 学习Slim Framework for PHP v3 (五)--route怎么被调用的?

    上一篇中分析了get()如何加入新的route的,这篇来分析route是如何被调用的. 首先,route是在routers里保存,router有在container中存放.container提供了ge ...

  10. 干货:Android 源码使用心得分享

          我相信很多初学者会和我一样经常在网上去找Android开发源码,但是往往因为运行不起来非常的懊恼!在做爱开发网站的时候,收集App代码时就遇到了这种困难,我相信网络上面的源码大部分在发布前 ...