Fixes #1520 [plsql] Missing PL/SQL language constructs in parser: Is Of Type, Using

This commit is contained in:
Andreas Dangel
2016-11-04 16:10:07 +01:00
parent a9d0de9450
commit 4ab1d0cbee
7 changed files with 83 additions and 2 deletions

View File

@ -690,4 +690,8 @@ public class PLSQLParserVisitorAdapter implements PLSQLParserVisitor {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTIsOfTypeCondition node, Object data) {
return visit((PLSQLNode) node, data);
}
}

View File

@ -784,6 +784,10 @@ public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLPar
public Object visit(ASTAccessibleByClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTIsOfTypeCondition node, Object data) {
return visit((PLSQLNode) node, data);
}
/*
* Treat all Executable Code

View File

@ -50,4 +50,14 @@ public class PLSQLParserTest extends AbstractPLSQLParserTst {
public void testBug1527() throws Exception {
parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/InlinePragmaProcError.pls")));
}
@Test
public void testBug1520IsOfType() throws Exception {
parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/IsOfType.pls")));
}
@Test
public void testBug1520Using() throws Exception {
parsePLSQL(IOUtils.toString(PLSQLParserTest.class.getResourceAsStream("ast/Using.pls")));
}
}

View File

@ -0,0 +1,23 @@
PROCEDURE IsOfType (
inChannelID IN number,
inOperID IN number,
inClientId IN number,
ioFPOobj IN FPO_OBJ,
inPackageIDout IN number,
inStatusId IN number)
is
loFPOGE_OBJ FPOGE_OBJ;
BEGIN
IF ioFPOobj IS OF (FPOGE_OBJ) THEN
loFPOGE_OBJ:=treat(ioFPOobj AS FPOGE_OBJ);
end if;
IF ioFPOobj IS NOT OF TYPE (ONLY FPOGE_OBJ) THEN
loFPOGE_OBJ:=treat(ioFPOobj AS FPOGE_OBJ);
end if;
loFPOGE_OBJ:=SELECT A FROM persons p WHERE IS OF TYPE (employee_t);
loFPOGE_OBJ:=SELECT A FROM persons p WHERE IS NOT OF TYPE (ONLY employee_t, other_t);
end;

View File

@ -0,0 +1,16 @@
/*
* From: https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems034.htm
*/
DECLARE
TYPE EmpCurTyp IS REF CURSOR; -- define weak REF CURSOR type
emp_cv EmpCurTyp; -- declare cursor variable
my_ename VARCHAR2(15);
my_sal NUMBER := 1000;
BEGIN
OPEN emp_cv FOR -- open cursor variable
'SELECT ename, sal FROM emp WHERE sal > :s' USING my_sal;
open cursor for 'query' USING variable;
open cursor for 'query' USING IN variable;
open cursor for 'query' USING OUT variable, IN othervariable;
open cursor for 'query' USING IN_OUT variable;
END;