FileDocCategorySizeDatePackage
SQLUpdateAllStatementForOracleAnonymousBlock.javaAPI DocGlassfish v2 API10807Tue May 22 16:54:32 BST 2007oracle.toplink.essentials.internal.expressions

SQLUpdateAllStatementForOracleAnonymousBlock

public class SQLUpdateAllStatementForOracleAnonymousBlock extends SQLModifyStatement
author
Andrei Ilitchev
since
TOPLink/Java 1.0

Fields Summary
protected HashMap
tables_databaseFieldsToValues
protected HashMap
tablesToPrimaryKeyFields
protected SQLCall
selectCall
protected static final String
varSuffix
protected static final String
typeSuffix
protected static final String
tab
protected static final String
dbltab
protected static final String
trpltab
Constructors Summary
Methods Summary
public oracle.toplink.essentials.internal.databaseaccess.DatabaseCallbuildCall(oracle.toplink.essentials.internal.sessions.AbstractSession session)
Append the string containing the SQL insert string for the given table.

        SQLCall call = new SQLCall();
        call.returnNothing();
        
        Writer writer = new CharArrayWriter(100);
        
        Vector mainPrimaryKeys = new Vector();
        mainPrimaryKeys.addAll((Collection)tablesToPrimaryKeyFields.get(table));
        
        Vector allFields = (Vector)mainPrimaryKeys.clone();
        Iterator itDatabaseFieldsToValues = tables_databaseFieldsToValues.values().iterator();
        while(itDatabaseFieldsToValues.hasNext()) {
            Iterator itDatabaseFields = ((HashMap)itDatabaseFieldsToValues.next()).keySet().iterator();
            while(itDatabaseFields.hasNext()) {
                allFields.addElement(itDatabaseFields.next());
            }
        }
        
        try {
            //DECLARE
            writer.write("DECLARE\n");
            
            for(int i=0; i < allFields.size(); i++) {
                writeDeclareTypeAndVar(writer, (DatabaseField)allFields.elementAt(i));
            }

            //BEGIN
            writer.write("BEGIN\n");

            //  select t0.emp_id, concat('Even', t0.f_name), t1.salary + 1000 BULK COLLECT into EMPLOYEEE_EMP_ID_VAR, EMPLOYEEE_F_NAME_VAR, SALARY_SALARY_VAR from employee t0, salary t1 where t0.l_name like 'updateEmployeeTestUsingTempTable' and t0.f_name in ('0', '2') and t1.salary = 0 and t0.emp_id = t1.emp_id;
            String selectStr = selectCall.getSQLString();
            int index = selectStr.toUpperCase().indexOf(" FROM ");
            String firstPart = selectStr.substring(0, index);
            String secondPart = selectStr.substring(index, selectStr.length());
            
            writer.write(tab);
            writer.write(firstPart);
            writer.write(" BULK COLLECT INTO ");

            for(int i=0; i < allFields.size(); i++) {
                writeVar(writer, (DatabaseField)allFields.elementAt(i));
                if(i < allFields.size() - 1) {
                    writer.write(", ");
                }
            }
            writer.write(secondPart);
            writer.write(";\n");

            call.getParameters().addAll(selectCall.getParameters());
            call.getParameterTypes().addAll(selectCall.getParameterTypes());            

            DatabaseField firstMainPrimaryKey = (DatabaseField)mainPrimaryKeys.firstElement();
            writer.write(tab);
            writer.write("IF ");
            writeVar(writer, firstMainPrimaryKey);
            writer.write(".COUNT > 0 THEN\n");
            
            Iterator itEntries = tables_databaseFieldsToValues.entrySet().iterator();
            while(itEntries.hasNext()) {
                writeForAll(writer, firstMainPrimaryKey);
                writer.write(trpltab);
                writer.write("UPDATE ");
                Map.Entry entry = (Map.Entry)itEntries.next();
                DatabaseTable t = (DatabaseTable)entry.getKey();
                writer.write(t.getQualifiedName());
                writer.write(" SET ");
                HashMap databaseFieldsToValues = (HashMap)entry.getValue();
                int counter = 0;
                Iterator itDatabaseFields = databaseFieldsToValues.keySet().iterator();
                while(itDatabaseFields.hasNext()) {
                    counter++;
                    DatabaseField field = (DatabaseField)itDatabaseFields.next();
                    writer.write(field.getName());
                    writer.write(" = ");
                    writeVar(writer, field);
                    writer.write("(i)");
                    if(counter < databaseFieldsToValues.size()) {
                        writer.write(", ");
                    }
                }
                
                writer.write(" WHERE ");
                
                Vector tablePrimaryKeys = new Vector();
                tablePrimaryKeys.addAll((Collection)tablesToPrimaryKeyFields.get(t));
                for(int i=0; i < mainPrimaryKeys.size(); i++) {
                    DatabaseField tableField = (DatabaseField)tablePrimaryKeys.elementAt(i);
                    writer.write(tableField.getName());
                    writer.write(" = ");
                    DatabaseField mainField = (DatabaseField )mainPrimaryKeys.elementAt(i);
                    writeVar(writer, mainField);
                    writer.write("(i)");
                    if(i < mainPrimaryKeys.size()-1) {
                        writer.write(" AND ");
                    } else {
                        writer.write(";\n");
                    }
                }
            }

            writer.write(tab);
            writer.write("END IF;\n");
            
            writer.write(tab);
            DatabaseField outField = new DatabaseField("ROW_COUNT");
            outField.setType(Integer.class);
            call.appendOut(writer, outField);
            writer.write(" := ");
            writeVar(writer, firstMainPrimaryKey);
            writer.write(".COUNT;\n");
            
            writer.write("END;");

            call.setSQLString(writer.toString());
            
        } catch (IOException exception) {
            throw ValidationException.fileError(exception);
        }
                
        return call;
    
public oracle.toplink.essentials.queryframework.SQLCallgetSelectCall()

        return selectCall;
    
public java.util.HashMapgetTablesToPrimaryKeyFields()

        return tablesToPrimaryKeyFields;
    
public java.util.HashMapgetTables_databaseFieldsToValues()

        return tables_databaseFieldsToValues;
    
public voidsetSelectCall(oracle.toplink.essentials.queryframework.SQLCall selectCall)

    
        
        this.selectCall = selectCall;
    
public voidsetTablesToPrimaryKeyFields(java.util.HashMap tablesToPrimaryKeyFields)

        this.tablesToPrimaryKeyFields = tablesToPrimaryKeyFields;
    
public voidsetTables_databaseFieldsToValues(java.util.HashMap tables_databaseFieldsToValues)

        this.tables_databaseFieldsToValues = tables_databaseFieldsToValues;
    
protected static voidwriteDeclareTypeAndVar(java.io.Writer writer, oracle.toplink.essentials.internal.helper.DatabaseField field)

        //  TYPE EMPLOYEE_EMP_ID_TYPE IS TABLE OF EMPLOYEE.EMP_ID%TYPE;
        writer.write(tab);
        writer.write("TYPE ");
        writeType(writer, field);
        writer.write(" IS TABLE OF ");
        writer.write(field.getQualifiedName());
        writer.write("%TYPE;\n");
        
        //  EMPLOYEE_EMP_ID_VAR EMP_ID_TYPE;
        writer.write(tab);
        writeVar(writer, field);
        writer.write(" ");
        writeType(writer, field);
        writer.write(";\n");
    
protected static voidwriteForAll(java.io.Writer writer, oracle.toplink.essentials.internal.helper.DatabaseField field)

        //FORALL i IN EMPLOYEE_EMP_ID_VAR.FIRST..EMPLOYEE_EMP_ID_VAR.LAST
        writer.write(dbltab);
        writer.write("FORALL i IN ");
        writeVar(writer, field);
        writer.write(".FIRST..");
        writeVar(writer, field);
        writer.write(".LAST\n");
    
protected static voidwriteType(java.io.Writer writer, oracle.toplink.essentials.internal.helper.DatabaseField field)

        // EMPLOYEE_EMP_ID_TYPE
        writeUniqueFieldName(writer, field);
        writer.write(typeSuffix);
    
protected static voidwriteUniqueFieldName(java.io.Writer writer, oracle.toplink.essentials.internal.helper.DatabaseField field)

        // EMPLOYEE_EMP_ID
        writer.write(field.getTableName());
        writer.write("_");
        writer.write(field.getName());
    
protected static voidwriteVar(java.io.Writer writer, oracle.toplink.essentials.internal.helper.DatabaseField field)

        // EMPLOYEE_EMP_ID_VAR 
        writeUniqueFieldName(writer, field);
        writer.write(varSuffix);