001package gudusoft.gsqlparser.stmt.oracle; 002 003import gudusoft.gsqlparser.*; 004import gudusoft.gsqlparser.nodes.*; 005import gudusoft.gsqlparser.nodes.oracle.TInvokerRightsClause; 006import gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement; 007 008/** 009 * This class represents 3 types of SQL statement: 010 * <ul> 011 * <li> Create procedure statement, creates or replaces a standalone stored procedure or a call specification. 012 * </li> 013 * <li> Declare a procedure inside a PL/SQL block or package. 014 * </li> 015 * <li> Define a procedure inside a PL/SQL block or package. 016 * </li> 017 * </ul> 018 * 019 * @see gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement#declareStatements 020 * @see gudusoft.gsqlparser.stmt.TCommonStoredProcedureSqlStatement#bodyStatements 021*/ 022public class TPlsqlCreateProcedure extends TCommonStoredProcedureSqlStatement { 023 024 private TInvokerRightsClause invokerRightsClause; 025 026 public void setInvokerRightsClause(TInvokerRightsClause invokerRightsClause) { 027 this.invokerRightsClause = invokerRightsClause; 028 } 029 030 public TInvokerRightsClause getInvokerRightsClause() { 031 032 return invokerRightsClause; 033 } 034 035 @Override 036 public TObjectName getStoredProcedureName(){ 037 return procedureName; 038 } 039 private int kind = TBaseType.kind_create; 040 041 public void setKind(int kind) { 042 this.kind = kind; 043 } 044 045 /** 046 * Indicates what's kind of SQL statement this class represents for, create proceure, declare a procudure or define a procedure. 047 * @return 048 */ 049 public int getKind() { 050 051 return kind; 052 } 053 054 055 /** 056 * The name that you give to the procedure that you are declaring or defining. 057 * @return 058 */ 059 public TObjectName getProcedureName() { 060 return procedureName; 061 } 062 063 private TObjectName procedureName = null; 064 065 066 public TPlsqlCreateProcedure(EDbVendor dbvendor){ 067 super(dbvendor); 068 sqlstatementtype = ESqlStatementType.sstplsql_createprocedure ; 069 } 070 071 /** 072 * 073 * @return Oracle plsql inner statements in declared section before IS keyword. 074 */ 075 public TStatementList getInnerStatements() { 076 if (innerStatements == null){ 077 innerStatements = new TStatementList(); 078 } 079 return innerStatements; 080 } 081 private TStatementList innerStatements = null; 082 083 084 void buildsql() { 085 } 086 087 void clear() { 088 } 089 090 String getasprettytext() { 091 return ""; 092 } 093 094 void iterate(TVisitorAbs pvisitor) { 095 } 096 097 private TCallSpec callSpec = null; 098 099 /** 100 * 101 * @return call specification 102 */ 103 public TCallSpec getCallSpec() { 104 return callSpec; 105 } 106 // private TStatementListSqlNode stmts = null; 107 108 public int doParseStatement(TCustomSqlStatement psql) { 109 if (rootNode == null) return -1; 110 if (super.doParseStatement(psql) != 0) return -1; 111 TCreateProcedureSqlNode createProcedureNode = (TCreateProcedureSqlNode)rootNode; 112 113 //super.doParseStatement(psql); 114 115 this.kind = createProcedureNode.getKind(); 116 this.callSpec = createProcedureNode.getCallSpec(); 117 setLabelName(createProcedureNode.getLabelName()); 118 setEndlabelName(createProcedureNode.getLabelName()); 119 120 procedureName = createProcedureNode.getProcedureName(); 121 this.setParameterDeclarations(createProcedureNode.getParameters()); 122 123 invokerRightsClause = createProcedureNode.getInvokerRightsClause(); 124 125 // push parameterDeclarations into symbolTable 126 if (this.getParameterDeclarations() != null){ 127 for(int i=0;i< this.getParameterDeclarations().size();i++){ 128 this.getTopStatement().getSymbolTable().push( new TSymbolTableItem(TObjectName.ttobjParameter,this, this.getParameterDeclarations().getParameterDeclarationItem(i))); 129 } 130 } 131 132 if (createProcedureNode.getInnerStmts() != null){ 133 createProcedureNode.getInnerStmts().doParse(this,ESqlClause.unknown); 134 135 for(int i= 0; i<createProcedureNode.getInnerStmts().size();i++){ 136 this.getInnerStatements().add(createProcedureNode.getInnerStmts().getStatementSqlNode(i).getStmt()); 137 } 138 } 139 140 if (createProcedureNode.getDeclareStmts() != null){ 141 createProcedureNode.getDeclareStmts().doParse(this,ESqlClause.unknown); 142 143 // push variable declare into symbolTable, and add to declareStatements 144 for(int i=0;i<createProcedureNode.getDeclareStmts().size();i++){ 145 this.getTopStatement().getSymbolTable().push( new TSymbolTableItem(TObjectName.ttobjVariable,this,createProcedureNode.getDeclareStmts().getStatementSqlNode(i).getStmt() )); 146 this.getDeclareStatements().add(createProcedureNode.getDeclareStmts().getStatementSqlNode(i).getStmt()); 147 } 148 149 } 150 151 if (createProcedureNode.getStmts() != null){ 152 createProcedureNode.getStmts().doParse(this,ESqlClause.unknown); 153 154 for(int i= 0; i<createProcedureNode.getStmts().size();i++){ 155 this.getBodyStatements().add(createProcedureNode.getStmts().getStatementSqlNode(i).getStmt()); 156 } 157 } 158 159 160 if (createProcedureNode.getExceptionClause() != null){ 161 createProcedureNode.getExceptionClause().doParse(this,ESqlClause.unknown); 162 this.setExceptionClause(createProcedureNode.getExceptionClause()); 163 } 164 165 if (createProcedureNode.getDeclareStmts() != null){ 166 167 // pop variable declare from symbolTable 168 for(int i=0;i<createProcedureNode.getDeclareStmts().size();i++){ 169 this.getTopStatement().getSymbolTable().pop(); 170 } 171 172 } 173 174 // pop parameterDeclarations from symbolTable 175 if (this.getParameterDeclarations() != null){ 176 for(int i=0;i< this.getParameterDeclarations().size();i++){ 177 this.getTopStatement().getSymbolTable().pop(); 178 } 179 } 180 181 return 0; 182 } 183 184 public void init(Object arg1) 185 { 186 // stmts = (TStatementListSqlNode)arg1; 187 } 188 189 190 191 public void accept(TParseTreeVisitor v){ 192 v.preVisit(this); 193 v.postVisit(this); 194 } 195 196 public void acceptChildren(TParseTreeVisitor v){ 197 v.preVisit(this); 198 199 if (this.getParameterDeclarations() != null) getParameterDeclarations().acceptChildren(v); 200 if (getInnerStatements().size() > 0) getInnerStatements().acceptChildren(v); 201 if (this.getDeclareStatements().size() > 0) this.getDeclareStatements().acceptChildren(v); 202 if ( this.getBodyStatements().size() > 0) getBodyStatements().acceptChildren(v); 203 if (getExceptionClause() != null) getExceptionClause().acceptChildren(v); 204 205 v.postVisit(this); 206 } 207 208 public void setProcedureName(TObjectName procedureName) { 209 this.procedureName = procedureName; 210 } 211 212 public void setInnerStatements(TStatementList innerStatements) { 213 this.innerStatements = innerStatements; 214 } 215 216 public void setCallSpec(TCallSpec callSpec) { 217 this.callSpec = callSpec; 218 } 219 220}