如何在不同的数据库中执行sql查询

本文关键字:执行 sql 查询 数据库 | 更新日期: 2023-09-27 18:16:30

我正在编写插件到EA,我想在存储库中创建新表,但我不想向每种数据库类型编写查询,我也不知道如何编写一个查询,因为eq. AUTO_INCREMENT存在于MySQL中,但在PostgreSQL中没有。那你有什么建议?我应该用nHibernate还是别的?

这是PostgreSQL的查询,我需要重写到其他数据库:

CREATE OR REPLACE FUNCTION create_history ()
  RETURNS void AS
$_$
BEGIN
IF EXISTS (
    SELECT *
    FROM   pg_catalog.pg_tables 
    WHERE  schemaname = 'public'
    AND    tablename  = 't_history'
    ) THEN
   RAISE NOTICE ' ';
ELSE
   CREATE TABLE t_history
(
  id integer NOT NULL DEFAULT nextval(('"object_id_seq"'::text)::regclass),
  object_id integer NOT NULL,
  object_type character varying(255),
  diagram_id integer DEFAULT 0,
  name character varying(255),
  alias character varying(255),
  author character varying(255),
  ch_author character varying(255),
  version character varying(50) DEFAULT '1.0'::character varying,
  note text,
  package_id integer DEFAULT 0,
  stereotype character varying(255),
  ntype integer DEFAULT 0,
  createddate timestamp without time zone DEFAULT now(),
  status character varying(50),
  abstract character(1),
  tagged integer DEFAULT 0,
  pdata1 character varying(255),
  pdata2 text,
  pdata3 text,
  pdata4 text,
  pdata5 character varying(255),
  concurrency character varying(50),
  visibility character varying(50),
  persistence character varying(50),
  cardinality character varying(50),
  gentype character varying(50),
  genfile character varying(255),
  header1 text,
  header2 text,
  phase character varying(50),
  scope character varying(25),
  genoption text,
  genlinks text,
  classifier integer,
  ea_guid character varying(40),
  parentid integer,
  runstate text,
  classifier_guid character varying(40),
  tpos integer,
  isroot integer DEFAULT 0,
  isleaf integer DEFAULT 0,
  isspec integer DEFAULT 0,
  isactive integer DEFAULT 0,
  stateflags character varying(255),
  packageflags character varying(255),
  multiplicity character varying(50),
  styleex text,
  actionflags character varying(255),
  eventflags character varying(255),
  CONSTRAINT t_history_pkey PRIMARY KEY (id)
);
END IF;
END;
$_$ LANGUAGE plpgsql;
SELECT create_history();

编辑

修改查询MySQL

CREATE TABLE IF NOT EXISTS t_history
(
  id integer NOT NULL AUTO_INCREMENT,
  object_id integer NOT NULL,
  name character varying(255),
  author character varying(255),
  ch_author character varying(255),
  version character varying(50) DEFAULT '1.0',
  note text,
  package_id integer DEFAULT 0,
  stereotype character varying(255),
  createddate timestamp DEFAULT now(),
  pdata1 character varying(255),
  pdata2 text,
  pdata3 text,
  pdata4 text,
  phase character varying(50),
  CONSTRAINT t_history_pkey PRIMARY KEY (id)
);

if not exists (select * from sys.tables where name = 't_history' and type = 'U')
CREATE TABLE t_history
(
  id integer NOT NULL IDENTITY PRIMARY KEY,
  object_id integer NOT NULL,
  name character varying(255),
  author character varying(255),
  ch_author character varying(255),
  version character varying(50) DEFAULT '1.0',
  note text,
  package_id integer DEFAULT 0,
  stereotype character varying(255),
  createddate datetime DEFAULT getdate(),
  pdata1 character varying(255),
  pdata2 text,
  pdata3 text,
  pdata4 text,
  phase character varying(50)
);

如何在不同的数据库中执行sql查询

考虑到脚本的小尺寸,它可能是最好的方法,只是手动"翻译"它到Oracle/MySQL/任何你需要的数据库系统。它应该不会超过几分钟,你可以很好地利用查找/替换功能。

。这样的:

Find: character varying
Replace with: VARCHAR2 
Find: text
Replace with: CLOB

除非你已经有了一个大型c#应用程序。在这种情况下,你可以使用nHibernate(我假设它类似于Java的Hibernate)并实现适当的类、函数和注释/配置。如果您计划在将来使用更多的SQL脚本,这种方法也很有意义。

如果这是您将要使用的唯一脚本,那么Hibernate就太过分了。与简单地将脚本"翻译"成各种其他SQL方言相比,它将产生巨大的开销,并花费更多的时间进行设置。只有当你要处理大量的数据库事务时,才有意义。