@Override
	public Usuario inserir(Usuario usuario) throws PSTException {

		StringBuilder sql = new StringBuilder();
		sql.append("BEGIN INSERT INTO S_USUARIO ");
		sql.append("(USUARIO, SENHA, OBS, FLG_ATIVO, FLG_PROFISSIONAL, FLG_ADM, DATA_BAIXA, PES_NRO) ");
		sql.append("VALUES (UPPER(?), ?, ?, ?, ?, ?, ?, ?) RETURNING NRO into ?; END; ");

		Connection conexao = null;
		CallableStatement comando = null;
		Pessoa pessoa = null;
		Boolean retorno = null;

		try {
			conexao = ConnectionFactory.getConnection();
			comando = conexao.prepareCall(sql.toString());
			comando.setString(1, usuario.getUsuario());
			comando.setString(2, usuario.getSenha());
			comando.setString(3, usuario.getObs());
			comando.setString(4, "S"); // flgAtivo
			comando.setString(5, usuario.getFlgProfissional() ? "S" : "N");

			if (usuario.getFlgAdm()) {
				Usuario adm = buscaADM();
				if (adm == null) {
					comando.setString(6, "S");
				} else {
					throw new PSTException(
							"O sistema já possui um administrador, contate: "
									+ adm.getPessoa().getNome());
				}
			} else {
				comando.setString(6, "N");
			}

			comando.setDate(7, null);

			// verifica se o cpf já está cadastrado na tabela pessoa
			pessoa = buscaPessoa(usuario.getPessoa().getCpf());

			if (pessoa == null) {
				Integer nroPessoa = inserirPessoa(usuario.getPessoa());
				comando.setLong(8, nroPessoa);
				retorno = Boolean.FALSE;
			} else {
				comando.setLong(8, pessoa.getNro());
				retorno = Boolean.TRUE;
			}

			comando.registerOutParameter(9, java.sql.Types.INTEGER);

			comando.executeUpdate();

			Long idUsuario = comando.getLong(9);

			logger.info("Usuário inserido com sucesso");

			if (retorno) {
				usuario.setNro(idUsuario);
				usuario.setPessoa(pessoa);
				return usuario;
			} else {
				return null;
			}

		} catch (SQLException ex) {

			if (ex.getMessage().contains("ORA-00001")) {
				throw new PSTException(
						"Este usuário já existe ou este CPF já está sendo usado por outro usuário"
								+ ex.getMessage(), ex);
			} else {
				throw new PSTException(
						"Ocorreu um erro ao tentar inserir um usuário "
								+ ex.getMessage(), ex);
			}

		} finally {
			PSTUtil.fechar(comando);
			PSTUtil.fechar(conexao);
		}
	}