Policz wiersze, których dotyczy funkcja plpgsql

Mam następującą funkcję:

CREATE FUNCTION user_delete(IN id INT4)
  RETURNS VOID
AS
  $BODY$
  BEGIN
    SELECT * FROM "user" WHERE user_id = id FOR UPDATE;
    DELETE FROM user_role WHERE user_id = id;
    DELETE FROM user_permission WHERE user_id = id;
    DELETE FROM permission_cache WHERE user_id = id;
    DELETE FROM access WHERE user_id = id;
    DELETE FROM "user" WHERE user_id = id;
  END;
  $BODY$
LANGUAGE plpgsql VOLATILE;

Używam tego z PHP PDO:

$stmt = $pdo->prepare('SELECT * FROM user_delete(?)');
$stmt->execute(array($user['id']));

Wynik zawiera teraz

array(
    array('user_delete' => '')
)

i tak

$stmt->rowCount();

jest zawsze jeden.

Czy można to naprawić: funkcja nie zwraca niczego (ponieważ jest pusta), a przez rowCount zwraca liczbę wierszy, których dotyczy problem?

Rozwiązanie:

php:

public function delete($id)
{
    try {
        $this->__call('user_delete', array($id));
    } catch (\PDOException $e) {
        if ($e->getCode() === 'UE404')
            throw new NotFoundException();
        else
            throw $e;
    }
}

sql:

CREATE FUNCTION user_delete(IN id INT4)
  RETURNS VOID
AS
  $BODY$
  BEGIN
    DELETE FROM user_role WHERE user_id = id;
    DELETE FROM user_permission WHERE user_id = id;
    DELETE FROM permission_cache WHERE user_id = id;
    DELETE FROM access WHERE user_id = id;
    DELETE FROM "user" WHERE user_id = id;
    IF NOT FOUND THEN
      RAISE SQLSTATE 'UE404' USING MESSAGE = 'not found for delete';
    END IF;
  END;
  $BODY$
LANGUAGE plpgsql VOLATILE;

Mogę osiągnąć wynik o zerowej długości zsetof void typ powrotu, ale nie jest to konieczne, jeśli zmuszę go do rzuceniaPDOException gdy zasób nie zostanie znaleziony ...

questionAnswers(1)

yourAnswerToTheQuestion