📄 oracle8builder.java
字号:
package org.apache.ddlutils.platform.oracle;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.IOException;
import java.sql.Types;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.ddlutils.DdlUtilsException;
import org.apache.ddlutils.Platform;
import org.apache.ddlutils.alteration.AddColumnChange;
import org.apache.ddlutils.alteration.AddPrimaryKeyChange;
import org.apache.ddlutils.alteration.PrimaryKeyChange;
import org.apache.ddlutils.alteration.RemoveColumnChange;
import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;
import org.apache.ddlutils.alteration.TableChange;
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Database;
import org.apache.ddlutils.model.Index;
import org.apache.ddlutils.model.Table;
import org.apache.ddlutils.model.TypeMap;
import org.apache.ddlutils.platform.SqlBuilder;
import org.apache.ddlutils.util.Jdbc3Utils;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
/**
* The SQL Builder for Oracle.
*
* @version $Revision: 509097 $
*/
public class Oracle8Builder extends SqlBuilder
{
/** The regular expression pattern for ISO dates, i.e. 'YYYY-MM-DD'. */
private Pattern _isoDatePattern;
/** The regular expression pattern for ISO times, i.e. 'HH:MI:SS'. */
private Pattern _isoTimePattern;
/** The regular expression pattern for ISO timestamps, i.e. 'YYYY-MM-DD HH:MI:SS.fffffffff'. */
private Pattern _isoTimestampPattern;
/**
* Creates a new builder application.
*
* @param platform The plaftform this builder belongs to
*/
public Oracle8Builder(Platform platform)
{
super(platform);
addEscapedCharSequence("'", "''");
PatternCompiler compiler = new Perl5Compiler();
try
{
_isoDatePattern = compiler.compile("\\d{4}\\-\\d{2}\\-\\d{2}");
_isoTimePattern = compiler.compile("\\d{2}:\\d{2}:\\d{2}");
_isoTimestampPattern = compiler.compile("\\d{4}\\-\\d{2}\\-\\d{2} \\d{2}:\\d{2}:\\d{2}[\\.\\d{1,8}]?");
}
catch (MalformedPatternException ex)
{
throw new DdlUtilsException(ex);
}
}
/**
* {@inheritDoc}
*/
public void createTable(Database database, Table table, Map parameters) throws IOException
{
// lets create any sequences
Column[] columns = table.getAutoIncrementColumns();
for (int idx = 0; idx < columns.length; idx++)
{
createAutoIncrementSequence(table, columns[idx]);
}
super.createTable(database, table, parameters);
for (int idx = 0; idx < columns.length; idx++)
{
createAutoIncrementTrigger(table, columns[idx]);
}
}
/**
* {@inheritDoc}
*/
public void dropTable(Table table) throws IOException
{
Column[] columns = table.getAutoIncrementColumns();
for (int idx = 0; idx < columns.length; idx++)
{
dropAutoIncrementTrigger(table, columns[idx]);
dropAutoIncrementSequence(table, columns[idx]);
}
print("DROP TABLE ");
printIdentifier(getTableName(table));
print(" CASCADE CONSTRAINTS");
printEndOfStatement();
}
/**
* Creates the sequence necessary for the auto-increment of the given column.
*
* @param table The table
* @param column The column
*/
protected void createAutoIncrementSequence(Table table,
Column column) throws IOException
{
print("CREATE SEQUENCE ");
printIdentifier(getConstraintName("seq", table, column.getName(), null));
printEndOfStatement();
}
/**
* Creates the trigger necessary for the auto-increment of the given column.
*
* @param table The table
* @param column The column
*/
protected void createAutoIncrementTrigger(Table table,
Column column) throws IOException
{
String columnName = getColumnName(column);
String triggerName = getConstraintName("trg", table, column.getName(), null);
if (getPlatform().isScriptModeOn())
{
// For the script, we output a more nicely formatted version
print("CREATE OR REPLACE TRIGGER ");
printlnIdentifier(triggerName);
print("BEFORE INSERT ON ");
printlnIdentifier(getTableName(table));
print("FOR EACH ROW WHEN (new.");
printIdentifier(columnName);
println(" IS NULL)");
println("BEGIN");
print(" SELECT ");
printIdentifier(getConstraintName("seq", table, column.getName(), null));
print(".nextval INTO :new.");
printIdentifier(columnName);
print(" FROM dual");
println(getPlatformInfo().getSqlCommandDelimiter());
print("END");
println(getPlatformInfo().getSqlCommandDelimiter());
println("/");
println();
}
else
{
// note that the BEGIN ... SELECT ... END; is all in one line and does
// not contain a semicolon except for the END-one
// this way, the tokenizer will not split the statement before the END
print("CREATE OR REPLACE TRIGGER ");
printIdentifier(triggerName);
print(" BEFORE INSERT ON ");
printIdentifier(getTableName(table));
print(" FOR EACH ROW WHEN (new.");
printIdentifier(columnName);
println(" IS NULL)");
print("BEGIN SELECT ");
printIdentifier(getConstraintName("seq", table, column.getName(), null));
print(".nextval INTO :new.");
printIdentifier(columnName);
print(" FROM dual");
print(getPlatformInfo().getSqlCommandDelimiter());
print(" END");
// It is important that there is a semicolon at the end of the statement (or more
// precisely, at the end of the PL/SQL block), and thus we put two semicolons here
// because the tokenizer will remove the one at the end
print(getPlatformInfo().getSqlCommandDelimiter());
printEndOfStatement();
}
}
/**
* Drops the sequence used for the auto-increment of the given column.
*
* @param table The table
* @param column The column
*/
protected void dropAutoIncrementSequence(Table table,
Column column) throws IOException
{
print("DROP SEQUENCE ");
printIdentifier(getConstraintName("seq", table, column.getName(), null));
printEndOfStatement();
}
/**
* Drops the trigger used for the auto-increment of the given column.
*
* @param table The table
* @param column The column
*/
protected void dropAutoIncrementTrigger(Table table,
Column column) throws IOException
{
print("DROP TRIGGER ");
printIdentifier(getConstraintName("trg", table, column.getName(), null));
printEndOfStatement();
}
/**
* {@inheritDoc}
*/
protected void createTemporaryTable(Database database, Table table, Map parameters) throws IOException
{
createTable(database, table, parameters);
}
/**
* {@inheritDoc}
*/
protected void dropTemporaryTable(Database database, Table table) throws IOException
{
dropTable(table);
}
/**
* {@inheritDoc}
*/
public void dropExternalForeignKeys(Table table) throws IOException
{
// no need to as we drop the table with CASCASE CONSTRAINTS
}
/**
* {@inheritDoc}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -