001package gudusoft.gsqlparser.stmt; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.compiler.TFrame; 005import gudusoft.gsqlparser.nodes.TBlockSqlNode; 006import gudusoft.gsqlparser.nodes.TCompoundSqlNode; 007import gudusoft.gsqlparser.nodes.TParseTreeVisitor; 008 009/** 010 * sql block may have label name. 011 * <br> This class is just a wrapper of {@link TBlockSqlNode}, so please use {@link #getBlockBody()} to get further information. 012 * <br> 013 * Groups related declarations and statements, is the basic unit of a PL/SQL source program. 014 * 015 * @see gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement#declareStatements 016 * @see gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement#bodyStatements 017 */ 018public class TCommonBlock extends TCommonStoredProcedureSqlStatement { 019 public TCommonBlock(EDbVendor dbvendor){ 020 super(dbvendor); 021 sqlstatementtype = ESqlStatementType.sst_plsql_block; 022 } 023 024 public int doParseStatement(TCustomSqlStatement psql) { 025 switch (dbvendor){ 026 case dbvdb2: 027 if (rootNode instanceof TCompoundSqlNode){ 028 TCompoundSqlNode db2CompoundSqlNode = (TCompoundSqlNode) rootNode; 029 this.blockBody = new TBlockSqlNode(); 030 this.blockBody.init(db2CompoundSqlNode.getStmts()); 031 this.blockBody.setDeclareStmts(db2CompoundSqlNode.getDeclareStmts()); 032 this.blockBody.setStartToken(db2CompoundSqlNode.getStartToken()); 033 this.blockBody.setEndToken(db2CompoundSqlNode.getEndToken()); 034 }else { 035 this.blockBody = (TBlockSqlNode)rootNode; 036 } 037 break; 038 default: 039 this.blockBody = (TBlockSqlNode)rootNode; 040 if (this.blockBody.getLabelName() == null){ 041 this.blockBody.setLabelName(this.getLabelName()); 042 } 043 break; 044 } 045 046 047 super.doParseStatement(psql); 048 TFrame currentFrame = new TFrame(this.stmtScope); 049 TFrame upFrame = getFrameStack().peek(); 050 if (upFrame.getScope().isRoutine()){ 051 this.stmtScope.setEnclosingScope(upFrame.getScope()); 052 } 053 currentFrame.pushMeToStack(getFrameStack()); 054 055 this.blockBody.doParse(this,ESqlClause.unknown); 056 057 currentFrame.popMeFromStack(getFrameStack()); 058 return 0; 059 060 061 } 062 063 064 public void accept(TParseTreeVisitor v){ 065 v.preVisit(this); 066 v.postVisit(this); 067 } 068 069 public void acceptChildren(TParseTreeVisitor v){ 070 v.preVisit(this); 071 blockBody.acceptChildren(v); 072// if (getDeclareStatements().size() > 0) getDeclareStatements().acceptChildren(v); 073// if (getBodyStatements().size() > 0 ) getBodyStatements().acceptChildren(v); 074 v.postVisit(this); 075 } 076 077}