mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved oracle sql parser. for pl/sql in_out parameter.
This commit is contained in:
@@ -23,6 +23,7 @@ public class SQLParameter extends SQLObjectImpl {
|
||||
private SQLDataType dataType;
|
||||
private SQLExpr defaultValue;
|
||||
private ParameterType paramType;
|
||||
private boolean noCopy = false;
|
||||
|
||||
public SQLExpr getDefaultValue() {
|
||||
return defaultValue;
|
||||
@@ -72,4 +73,12 @@ public class SQLParameter extends SQLObjectImpl {
|
||||
OUT, // out
|
||||
INOUT// inout
|
||||
}
|
||||
|
||||
public boolean isNoCopy() {
|
||||
return noCopy;
|
||||
}
|
||||
|
||||
public void setNoCopy(boolean noCopy) {
|
||||
this.noCopy = noCopy;
|
||||
}
|
||||
}
|
||||
|
||||
+18
-1
@@ -1095,13 +1095,30 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
parameter.setDataType(dataType);
|
||||
|
||||
parameter.setDefaultValue(new SQLQueryExpr(select));
|
||||
} else if (lexer.token() == Token.PROCEDURE) {
|
||||
break;
|
||||
} else {
|
||||
parameter.setName(this.exprParser.name());
|
||||
|
||||
if (lexer.token() == Token.IN) {
|
||||
lexer.nextToken();
|
||||
parameter.setParamType(SQLParameter.ParameterType.IN);
|
||||
|
||||
if (lexer.token() == Token.OUT) {
|
||||
lexer.nextToken();
|
||||
parameter.setParamType(SQLParameter.ParameterType.INOUT);
|
||||
} else {
|
||||
parameter.setParamType(SQLParameter.ParameterType.IN);
|
||||
}
|
||||
} else if (lexer.token() == Token.OUT) {
|
||||
lexer.nextToken();
|
||||
parameter.setParamType(SQLParameter.ParameterType.OUT);
|
||||
}
|
||||
|
||||
if (identifierEquals("NOCOPY")) {
|
||||
lexer.nextToken();
|
||||
parameter.setNoCopy(true);
|
||||
}
|
||||
|
||||
parameter.setDataType(this.exprParser.parseDataType());
|
||||
|
||||
if (lexer.token() == Token.COLONEQ) {
|
||||
|
||||
@@ -1022,7 +1022,7 @@ public class SQLExprParser extends SQLParser {
|
||||
lexer.nextToken();
|
||||
break;
|
||||
default:
|
||||
throw new ParserException("error " + lexer.token());
|
||||
throw new ParserException("error " + lexer.info());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3344,10 +3344,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
} else if (x.getParamType() == SQLParameter.ParameterType.OUT) {
|
||||
print0(ucase ? " OUT " : " out ");
|
||||
} else if (x.getParamType() == SQLParameter.ParameterType.INOUT) {
|
||||
print0(ucase ? " INOUT " : " inout ");
|
||||
print0(ucase ? " IN OUT " : " in out ");
|
||||
} else {
|
||||
print(' ');
|
||||
}
|
||||
|
||||
if (x.isNoCopy()) {
|
||||
print0(ucase ? "NOCOPY " : "nocopy ");
|
||||
}
|
||||
} else {
|
||||
if (x.getParamType() == SQLParameter.ParameterType.IN) {
|
||||
print0(ucase ? "IN " : "in ");
|
||||
|
||||
Reference in New Issue
Block a user