将你的程序从sqlserver改为PostgreSQL--1
作者:运飞扬
来自: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