improved oralce sql parser pl/sql support.

This commit is contained in:
wenshao
2017-05-11 21:09:58 +08:00
parent 9a931e45d5
commit bee259a0b4
5 changed files with 180 additions and 19 deletions
@@ -28,6 +28,7 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
private SQLName definer;
private boolean create = true;
private boolean orReplace;
private SQLName name;
private SQLStatement block;
@@ -79,10 +80,16 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
public SQLName getDefiner() {
return definer;
}
public void setDefiner(SQLName definer) {
this.definer = definer;
}
public boolean isCreate() {
return create;
}
public void setCreate(boolean create) {
this.create = create;
}
}
@@ -433,6 +433,12 @@ public class OracleStatementParser extends SQLStatementParser {
continue;
}
if (lexer.token() == Token.PROCEDURE) {
SQLStatement stmt = this.parseCreateProcedure();
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.ELSIF && parent instanceof SQLIfStatement) {
break;
}
@@ -1091,6 +1097,11 @@ public class OracleStatementParser extends SQLStatementParser {
parameter.setDefaultValue(new SQLQueryExpr(select));
} else {
parameter.setName(this.exprParser.name());
if (lexer.token() == Token.IN) {
lexer.nextToken();
parameter.setParamType(SQLParameter.ParameterType.IN);
}
parameter.setDataType(this.exprParser.parseDataType());
if (lexer.token() == Token.COLONEQ) {
@@ -1544,16 +1555,22 @@ public class OracleStatementParser extends SQLStatementParser {
public SQLCreateProcedureStatement parseCreateProcedure() {
SQLCreateProcedureStatement stmt = new SQLCreateProcedureStatement();
accept(Token.CREATE);
if (lexer.token() == Token.OR) {
if (lexer.token() == Token.CREATE) {
lexer.nextToken();
accept(Token.REPLACE);
stmt.setOrReplace(true);
if (lexer.token() == Token.OR) {
lexer.nextToken();
accept(Token.REPLACE);
stmt.setOrReplace(true);
}
} else {
stmt.setCreate(false);
}
accept(Token.PROCEDURE);
stmt.setName(this.exprParser.name());
SQLName procedureName = this.exprParser.name();
stmt.setName(procedureName);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
@@ -1561,12 +1578,20 @@ public class OracleStatementParser extends SQLStatementParser {
accept(Token.RPAREN);
}
accept(Token.AS);
if (lexer.token() == Token.IS) {
lexer.nextToken();
} else {
accept(Token.AS);
}
SQLBlockStatement block = this.parseBlock();
stmt.setBlock(block);
if (identifierEquals(procedureName.getSimpleName())) {
lexer.nextToken();
}
return stmt;
}
@@ -1864,7 +1864,15 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
incrementIndent();
println();
printlnAndAccept(x.getStatements(), ";");
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
SQLStatement stmt = x.getStatements().get(i);
stmt.accept(this);
if (i != size - 1) {
println(";");
} else {
print(';');
}
}
decrementIndent();
println();
@@ -2503,7 +2511,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
@Override
public boolean visit(SQLCreateProcedureStatement x) {
if (x.isOrReplace()) {
boolean create = x.isCreate();
if (!create) {
print0(ucase ? "PROCEDURE " : "procedure ");
} else if (x.isOrReplace()) {
print0(ucase ? "CREATE OR REPLACE PROCEDURE " : "create or replace procedure ");
} else {
print0(ucase ? "CREATE PROCEDURE " : "create procedure ");
@@ -2531,7 +2542,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print(')');
}
println();
if (!create) {
println();
println("IS");
} else {
println();
}
x.getBlock().setParent(x);
x.getBlock().accept(this);
return false;
@@ -3337,16 +3337,28 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
decrementIndent();
} else {
if (x.getParamType() == SQLParameter.ParameterType.IN) {
print0(ucase ? "IN " : "in ");
} else if (x.getParamType() == SQLParameter.ParameterType.OUT) {
print0(ucase ? "OUT " : "out ");
} else if (x.getParamType() == SQLParameter.ParameterType.INOUT) {
print0(ucase ? "INOUT " : "inout ");
if (JdbcConstants.ORACLE.equals(dbType)) {
x.getName().accept(this);
if (x.getParamType() == SQLParameter.ParameterType.IN) {
print0(ucase ? " IN " : " in ");
} else if (x.getParamType() == SQLParameter.ParameterType.OUT) {
print0(ucase ? " OUT " : " out ");
} else if (x.getParamType() == SQLParameter.ParameterType.INOUT) {
print0(ucase ? " INOUT " : " inout ");
} else {
print(' ');
}
} else {
if (x.getParamType() == SQLParameter.ParameterType.IN) {
print0(ucase ? "IN " : "in ");
} else if (x.getParamType() == SQLParameter.ParameterType.OUT) {
print0(ucase ? "OUT " : "out ");
} else if (x.getParamType() == SQLParameter.ParameterType.INOUT) {
print0(ucase ? "INOUT " : "inout ");
}
x.getName().accept(this);
print(' ');
}
x.getName().accept(this);
print(' ');
x.getDataType().accept(this);