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}