fixed and turned on Execute Immediate

This commit is contained in:
Piotr Szymanski
2020-03-05 17:47:45 +01:00
parent f698a2e7aa
commit 8ae59231a2
3 changed files with 18 additions and 6 deletions

View File

@@ -1161,7 +1161,7 @@ ASTReadPastNextOccurrence ReadPastNextOccurrence(String target) :
ASTSqlStatement SqlStatement(String initiator, String terminator) :
{}
{
(<SELECT>|<UPDATE>|<INSERT>|<DELETE>|<COMMIT>|<ROLLBACK>|<SAVEPOINT>|<EXECUTE>|<SET><TRANSACTION>|<LOCK><TABLE>|<MERGE>|<WITH>)
(<SELECT>|<UPDATE>|<INSERT>|<DELETE>|<COMMIT>|<ROLLBACK>|<SAVEPOINT>|<SET><TRANSACTION>|<LOCK><TABLE>|<MERGE>|<WITH>)
Skip2NextTerminator(initiator,terminator)
{
return jjtThis ;
@@ -2220,7 +2220,7 @@ ASTUnlabelledStatement UnlabelledStatement() :
UpdateStatement() ";" |
DeleteStatement() ";" |
InsertStatement() ";" |
LOOKAHEAD(["("] <SELECT>|<UPDATE>|<INSERT>|<DELETE>|<COMMIT>|<ROLLBACK>|<SAVEPOINT>|<EXECUTE>|<SET><TRANSACTION>|<LOCK><TABLE>|<MERGE>|<WITH>) SqlStatement(null,";") [";"]
LOOKAHEAD(["("] <SELECT>|<UPDATE>|<INSERT>|<DELETE>|<COMMIT>|<ROLLBACK>|<SAVEPOINT>|<SET><TRANSACTION>|<LOCK><TABLE>|<MERGE>|<WITH>) SqlStatement(null,";") [";"]
| LOOKAHEAD(3) ContinueStatement() ";" // CONTINUE keyword was added in 11G, so Oracle compilation supports CONTINUE as a variable name
| CaseStatement() ";"
| IfStatement() ";"
@@ -2237,7 +2237,7 @@ ASTUnlabelledStatement UnlabelledStatement() :
| OpenStatement() ";"
| FetchStatement() ";"
| Block() ";"
| EmbeddedSqlStatement() ";"
| LOOKAHEAD(2) EmbeddedSqlStatement()
| PipelineStatement() ";"
| ConditionalCompilationStatement() // Conditional Compilation works outside the normal parsing rules
| InlinePragma() ";"
@@ -2660,9 +2660,7 @@ ASTFetchStatement FetchStatement() :
ASTEmbeddedSqlStatement EmbeddedSqlStatement() :
{}
{
<EXECUTE> <IMMEDIATE> Expression() // StringLiteral() /* <STRING_LITERAL> */
//SRT 20110429 | <EXECUTE> <IMMEDIATE> StringExpression() [<USING> Expression() ("," Expression())*] ";"
//SRT 20121126 | <EXECUTE> <IMMEDIATE> StringExpression()
<EXECUTE> <IMMEDIATE> (StringLiteral() | Expression())
[ <INTO> Name() ("," Name())* ]
[ <USING> [ <IN> [ <OUT> ] | <OUT> ] Expression() ("," [ <IN> [ <OUT> ] | <OUT> ] Expression())* ]
[ ( <RETURN> | <RETURNING> ) <INTO> Expression() ("," Expression())*] ";"

View File

@@ -19,4 +19,9 @@ public class ExecuteImmediateTest extends AbstractPLSQLParserTst {
public void parseExecuteImmediate1047b() {
plsql.parseResource("ExecuteImmediate1047b.pls");
}
@Test
public void parseExecuteImmediateString() {
plsql.parseResource("ExecuteImmediateString.pls");
}
}

View File

@@ -0,0 +1,9 @@
--
-- BSD-style license; for more info see http://pmd.sourceforge.net/license.html
--
CREATE OR REPLACE PROCEDURE test ( p_num_reg OUT number )
AS
BEGIN
execute immediate 'select count(1) from test_tbl where id =:param' into p_num_reg USING 'P';
END test;