code: public QueryParameters getProcedureParameters(Connection conn, String catalogName, String schemaName, String procedureName,
                                                    boolean useCache) throws SQLException {
          DatabaseMetaData metaData = conn.getMetaData();
  
          String userName = metaData.getUserName();
          String dbProductName = MetadataUtils.processDatabaseProductName(metaData.getDatabaseProductName());
  
          String catalogNameProcessed = processCatalogName(dbProductName, userName, catalogName);
          String schemaNameProcessed = processSchemaName(dbProductName, userName, schemaName);
          String procedureNameProcessed = processProcedureName(dbProductName, procedureName);
  
          StoredProcedure requiredStoredProcedure = new StoredProcedure(catalogName, schemaName, procedureName);
  
          if (useCache == false || this.procedureParameters.containsKey(requiredStoredProcedure) == false) {
              updateCache(metaData, catalogNameProcessed, schemaNameProcessed, procedureNameProcessed);
          }
  
          List<StoredProcedure> foundStoredProcedures = new ArrayList<StoredProcedure>();
  
          // TODO Optimize
          for (StoredProcedure storedProcedure : this.procedureParameters.keySet()) {
              if (requiredStoredProcedure.equals(storedProcedure) == true) {
                  foundStoredProcedures.add(storedProcedure);
              }
          }
  
          if (foundStoredProcedures.size() == 0) {
              throw new MjdbcSQLException("Haven't found procedure matching required parameters: " + requiredStoredProcedure);
          } else if (foundStoredProcedures.size() > 1) {
              throw new MjdbcSQLException("Found more than one procedure matching required parameters. Searched: " + requiredStoredProcedure + "\nGot: " + foundStoredProcedures.toString());
          }
  
          return this.procedureParameters.get(foundStoredProcedures.get(0));
      }
docs: {@inheritDoc}