最近做7代产品的国际化功能,需要批量创建表与索引,这里总结了一下用法,大家可以参考一下,有更好的写法也可一起探讨下:
--可惜一个create table 语句中并不能包含创建普通索引的语句,所以只能采用这种写法
<update id="createMultiLangTableSql" databaseId="oracle">
<![CDATA[
DECLARE lsql varchar2(4000);
BEGIN lsql := '
CREATE TABLE ${tableName} (
LANG_NO NUMBER(22) not null,
LANG_ID VARCHAR2(10),
${lnkFieldName}
]]>
<if test='lnkFieldType != null and lnkFieldType == "S"'>
<![CDATA[
VARCHAR2(${lnkFieldLength}),
]]>
</if>
<if test='lnkFieldType != null and lnkFieldType == "N"'>
<![CDATA[
NUMBER(22),
]]>
</if>
<foreach collection="multiLangFields" item="Field" separator=",">
${Field} VARCHAR2(1000)
</foreach>
<![CDATA[
, ORG_NO NUMBER(22),
, CONSTRAINT ${PRIMARY_KEY} PRIMARY KEY (LANG_NO) USING INDEX)';
EXECUTE IMMEDIATE lsql;
lsql := 'create index ${INDEX_NAME} on ${tableName} (${lnkFieldName})';
EXECUTE IMMEDIATE lsql; END; ]]>
</update>
<update id="createMultiLangTableSql" databaseId="postgresql">
<![CDATA[
DO $DO$ DECLARE lsql VARCHAR (4000);
BEGIN lsql := '
CREATE TABLE ${tableName}(
LANG_NO NUMERIC(22) not null,
LANG_ID VARCHAR(10),
${lnkFieldName}
]]>
<if test='lnkFieldType != null and lnkFieldType == "S"'>
<![CDATA[
VARCHAR(${lnkFieldLength}),
]]>
</if>
<if test='lnkFieldType != null and lnkFieldType == "N"'>
<![CDATA[
NUMERIC(22),
]]>
</if>
<foreach collection="multiLangFields" item="Field" separator=",">
${Field} VARCHAR(1000)
</foreach>
, ORG_NO NUMERIC(22),
FSTUSR_ID VARCHAR(20));
ALTER TABLE ${tableName} ADD PRIMARY KEY (LNK_NO);';
EXECUTE (lsql);
lsql := 'CREATE INDEX ${INDEX_NAME} ON ${tableName} (${lnkFieldName});';
EXECUTE (lsql); END $DO$;
</update>