GreenPlum存储过程的源码导出

原创 2012年03月24日 10:04:31

版权所有,请勿转载,

GreenPlum存储过程的源码导出
发布时间:2012-03-23 来源:原创  作者:场之作坊

#!/bin/bash

source /usr/local/greenplum-db/greenplum_path.sh

USAGE ()
{
  echo "Usage: `basename $0` [-d database] [-p port] [-h hostip] [ -U username ] {-f procname} [-o output]";
  echo "ExpFunToFile Parameter Infomation:";
  echo "  Parameter -f must be specified                             [必须指定函数名 例如:public.test]";
  echo "  Parameter -d: Database Name,Default Value:PGDATABASE       [数据库名]";
  echo "  Parameter -p: Database Port,Default Value:5432             [数据库端口]";
  echo "  Parameter -h: Database Host,Defualt Value:PGHOST           [主机IP地址]";
  echo "  Parameter -U: User Name,Default Value:PGUSER               [连接数据库名]";
  echo "  Parameter -o: Output Path,Default Value: pwd               [目标目录]";
  echo ""
  exit 1;
}

if [ $# -lt 2 ]
  then
   USAGE
  fi
 


dbname=""
procname=""
dbport=""
dbhost=""
outpath=""
dbuser=""

#***************************Judge Parameter Begin
  while getopts :d:f:p:h:U:o: OPTION ;
  do
   case "$OPTION" in
     d) dbname="$OPTARG" ;;
     f) procname="$OPTARG" ;;
     p) dbport="$OPTARG" ;;
     h) dbhost="$OPTARG" ;;
     o) outpath="$OPTARG" ;;
     U) dbuser="$OPTARG" ;;
     \?) #usage statement
       USAGE;
       ;;
   esac
  done

  if [ "$procname" = "" ]
   then
     echo "Parameter -f must be specified "
     USAGE;
   else
   if [ `expr index $procname .` -le 0  ]
     then
       echo "The Function Name is the same as schema.funname."
       echo "Eg: public.test "
       exit 1
   fi
  fi
  strdb=""
  if [ "$dbname" != "" ]
   then
     strdb=" -d $dbname "
  fi
  if [ "$dbport" != "" ]
   then
     strdb=$strdb" -p $dbport "
  fi
  if [ "$dbhost" != "" ]
   then
     strdb=$strdb" -h $dbhost "
  fi
  if [ "$dbuser" != "" ]
   then
    strdb=$strdb" -U $dbuser "
  fi
  if [ "$outpath" != "" ]
   then
    outfile=$outpath/$procname.sql
   else
    outfile=$procname.sql
  fi

#获取函数名以及相关的参数
sqlstr="select nspname||'.'|| proname procname,usename,lanname,prorettype::regtype,proargtypes,proallargtypes,proargmodes,proargnames \
from  pg_catalog.pg_proc  a \
  left join pg_catalog.pg_namespace b on a.pronamespace=b.oid \
  left join pg_catalog.pg_user c on a.proowner=c.usesysid \
  left join pg_catalog.pg_language d on a.prolang=d.oid \
where nspname||'.'||proname=lower('$procname');"

#取出返回值
line=`psql -X -t -c "$sqlstr" -A -F#@# $strdb `
#echo $line,$strdb,$sqlstr
#分解返回值
vusername=`echo $line|awk -F#@# '{print $2}'`
vlanname=`echo $line|awk -F#@# '{print $3}'`
vretvalue=`echo $line|awk -F#@# '{print $4}'`
vargtypes=`echo $line|awk -F#@# '{print $5}'|sed 's/[{}]//g'`
vallargtypes=`echo $line|awk -F#@# '{print $6}'|sed 's/[{}]//g'`
vargmodes=`echo $line|awk -F#@# '{print $7}'|sed 's/[{}]//g'`
vargnames=`echo $line|awk -F#@# '{print $8}'|sed 's/[{}]//g'`
vfuntxt=`echo $line|awk -F#@# '{print $9}'`

#判断参数个数
fnum=`echo $vargnames|awk -F, '{print NF}'`

#echo $strarg
#重组函数的参数串
for((i=1;i<=$fnum;i++))
do
  typeid=`echo $vargtypes|cut -d' ' -f$i`
  atypeid=`echo $vallargtypes|cut -d, -f$i`
  amodes=`echo $vargmodes|cut -d, -f$i`
  argnames=`echo $vargnames|cut -d, -f$i`
  echo $typeid
  if [ "$atypeid" = "" ]
   then
      atypeid=$typeid
  fi
  atype=`psql -X -t -c "select $atypeid::regtype" $strdb `
 
  if [ "$amodes" != "o" ]
  then
   strarg="${strarg},in $argnames $atype"
  else
   strarg="${strarg},out $argnames $atype"
  fi 
done
  vstrarg=`echo $strarg|cut -c 2-`

#获取函数体
sqlstr=" select prosrc from  pg_catalog.pg_proc  a \
  left join pg_catalog.pg_namespace b on a.pronamespace=b.oid \
where nspname||'.'||proname=lower('$procname'); "

#生成文件
echo "CREATE OR REPLACE FUNCTION ${procname}($vstrarg)" >$outfile.sql
echo "RETURNS $vretvalue AS " >>$outfile.sql
echo "\$BODY\$" >>$outfile.sql
psql  -X -t -c "$sqlstr" $strdb >>$outfile.sql
echo "\$BODY\$" >>$outfile.sql
echo "LANGUAGE $vlanname VOLATILE;" >>$outfile.sql

#程序结束

 

 


 

Greenplum中查询数据

GP中查询数据
  • Fortyone41
  • Fortyone41
  • 2016年05月16日 00:11
  • 3212

GreenPlum存储过程的源码导出

版权所有,请勿转载, GreenPlum存储过程的源码导出 发布时间:2012-03-23 来源:原创  作者:场之作坊 #!/bin/bash source /usr/local/green...
  • myamor
  • myamor
  • 2012年03月24日 10:04
  • 1179

Greenplum优化--SQL调优篇

目录 数据库查询预准备 VACUUM ANALYZE EXPLAIN执行计划 两种聚合方式 关联 重分布 查询优化 explain参数 选择合适分布键 分区表 压缩表 分组扩展 窗口函数 列存储和...
  • u012948976
  • u012948976
  • 2016年09月28日 23:43
  • 14832

greenplum导出表、数据、模式的sql

/* 导入导出,切换用户 -a 数据,-s 模式 */ -- 导出schema pg_dump -U gpadmin -s -n portal -n public -n abnormal -n per...
  • yy8093
  • yy8093
  • 2017年08月29日 09:25
  • 875

《Greenplum5.0 最佳实践 》SQL 转换

原文链接:点击打开链接 摘要: 本文主要是Greenplum SQL 的优化 改变 SQL 查询 Greenplum 数据库是基于代价的查询优化,查询优化器会选择代价最小的作...
  • qq_40954115
  • qq_40954115
  • 2017年12月08日 14:46
  • 84

GreenPlum死锁问题定位手记

问题描述 GreenPlum 5.0版本,在使用 gpcrondump 做备份时,如果同时还在执行一个自己写的存储过程,就有很高概率导致数据库死锁 该存储过程中涉及到表的创建、删除、数据导入等动作...
  • icycode
  • icycode
  • 2017年12月17日 21:15
  • 159

GreenPlum

GreenPlum关系型数据库集群预研以及与Hadoop的比较 第二部分借鉴了网上的资料,感谢原作者!...
  • zx8167107
  • zx8167107
  • 2017年11月19日 15:43
  • 256

Greenplum 数据库查询导出csv文件

1.psql gp_db;进入数据库 2.\o /tmp/test.csv  设置要导出文件的目录  \o /tmp/test.csv     \o [ { filename | |command ...
  • wade5200
  • wade5200
  • 2017年03月03日 09:08
  • 1116

通过标准输入输出实现Greenplum文件导入导出

通过标准输入输出实现Greenplum文件导入导出方法: 导出: psql -h 192.168.0.1 -U test_user test_db -c "copy(select * from t...
  • sptoor
  • sptoor
  • 2014年01月06日 16:44
  • 1682

GreenPlum 集群中通过orafunc实现Oracle兼容函数

oracle数据迁移到greenplum有一个不得不面对的难题,那就是很多存储过程中调用的存储函数,一个个改起来太麻烦了,所以如果想迁移顺利,一个比较的办法是,在greenplum里面自己实现同名字同...
  • mchdba
  • mchdba
  • 2017年05月18日 16:57
  • 1472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GreenPlum存储过程的源码导出
举报原因:
原因补充:

(最多只允许输入30个字)