mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved oralce sql parser pl/sql support.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+31
-6
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+19
-3
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user