龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 操作系统 > LINUX系统 >

将你的程序从sqlserver改为PostgreSQL--1

时间:2011-03-20 22:37来源:未知 作者:admin 点击:
分享到:
作者:运飞扬 来自:yfy001.myetang.com 想把公司的程序从windows平台向linux平台移植,就要考虑到数据库的问题了,linux平台有两个非常好的数据库mysql和postgresql,考虑到产品的稳定性和数据库的

  作者:运飞扬

  来自:yfy001.myetang.com

  

  

  想把公司的程序从windows平台向linux平台移植,就要考虑到数据库的问题了,linux平台有两个非常好的数据库mysql和postgresql,考虑到产品的稳定性和数据库的稳定性,并且程序中想使用存储过程,所以我决定使用postgresql数据库作为后台数据库。

  我以前曾经写过一扁文章"将SQLSERVER的数据导入到postgresql中",为我这次的移植做好了基础,现在要掌握新的内容就是如何使用postgresql的存储过程和在qt程序中连接数据库的问题而已。

  

  

  

  在实际移植过程中,我发现了一个问题,我想用一个sql语句来创建我的数据库和表的结构,但是我发现, sqlserver中这样的一个语句:

  if exists (select * from sysobjects where id=object_id(N'[dbo].[DiaryPrice]) and OBJECTPROPERTY(id,N'IsUserTable') =1)

  drop table [dbo].[DiaryPrice]

  GO

  这句的作用就是判断如果数据库中存在这样一个表,就删除的作用。这样一句无法在postgresql中实现,我看了postgresql的文档,没有找到相关的实现语句,在sqlserver是可以的。

  

  正好学习postgresql的PL/pgSQL语言,从google上又搜索到这样一个小函数,可以用来删除一个已存在的表,好东西不敢独享,写篇文章做个纪录。

  

  首先,创建一个数据库(我的是fexdbmaster), 如果你要使用某种过程语言,那么你必须把它"安装"到要用它的数据库里.不过那些安装到 template1 数据库里的过程语言 会自动在随后创建的数据库中安装.因此数据库管理员可以决定哪个数据库可以使用哪门语言,以及可以决定缺省时可以使用哪些语言.

  对于那些随着标准版本发布的语言,你可以使用 createlang shell 脚本而不用自己事无巨细地 自己做.我要使用PL/pgSQL,所以安装PL/pgSQL到 template1 数据库中,使用

  createlang plpgsql template1

  

  以下是这段程序的代码:

  

  CREATE OR REPLACE FUNCTION drop_table_if_exists(text, bool) RETURNS bool AS '

  DECLARE

  opt text;

  rec record;

  BEGIN

  IF $2 THEN

  opt := '' CASCADE'';

  ELSE

  opt := '''';

  END IF;

  SELECT INTO rec oid FROM pg_class WHERE relname = $1::name;

  IF FOUND THEN

  EXECUTE ''DROP TABLE '' || $1 || opt;

  RETURN true;

  END IF;

  RETURN false;

  END;

  ' LANGUAGE 'plpgsql';

  

  你可以把这段代码保存为一个文件,如ifexites

  在控制台下使用psql -d fexdbmaster -f ifexites

  就在这个数据库里注册了这个函数。

  

  以后,创建这个数据库中的表的时候,可以直接使用这个函数了。两个创建表的脚本如下:

  SELECT drop_table_if_exists('fivemprice', false);

  CREATE TABLE FiveMPrice (

  FiveMPriceId SERIAL,

  ETypeId smallint NOT NULL,

  UpDateTime timestamp NOT NULL,

  OpenPrice varchar(50) NULL,

  ClosePrice varchar(50) NULL,

  MaxPrice varchar(50) NULL,

  MinPrice varchar(50) NULL,

  TrCurDateTime timestamp NULL

  );

  

  SELECT drop_table_if_exists('exchangetype', false);

  CREATE TABLE ExchangeType (

  ETypeId SERIAL,

  ETypeCode varchar(50) NOT NULL,

  EnglishName varchar(50) NOT NULL,

  ChineseName varchar(50) NULL,

  Desciption varchar(50) NULL,

  CreateDateTime timestamp NULL

  );

  

  此脚本可存储为test.sql

  控制台下运行psql -d fexdbmaster -f test.sql就可以了.本人水平有限,望大侠们多多指教!

  

  

  

  

  

  

  相关链接

  

  

   更多的有关 K-数据库-postgresql

   新闻提供 yfy002

  

  

  --------------------------------------------------------------------------------

  

  人气最高的文章在 K-数据库-postgresql:

  将你的程序从sqlserver改为PostgreSQL--1

  

  

  

  

  

精彩图集

赞助商链接