Php 统计受plpgsql函数影响的行数

Php 统计受plpgsql函数影响的行数,php,postgresql,pdo,count,plpgsql,Php,Postgresql,Pdo,Count,Plpgsql,我有以下功能: 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 FR

我有以下功能:

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;
我将其用于PHP PDO:

$stmt = $pdo->prepare('SELECT * FROM user_delete(?)');
$stmt->execute(array($user['id']));
结果现在包含

array(
    array('user_delete' => '')
)
因此

$stmt->rowCount();
总是一个

是否可以解决此问题:通过函数不返回任何内容(因为它是空的),通过rowCount返回受影响行的计数

解决方案:

php:

sql:

我可以使用
setof void
返回类型实现返回零长度结果,但如果我在未找到资源时强制它抛出
PDOException
,则不需要这样做…

您可以使用:

GET DIAGNOSTICS integer_var = ROW_COUNT;
。。并让函数返回计数

例如:

CREATE OR REPLACE FUNCTION user_delete(id int, OUT del_ct int) AS
$func$
DECLARE
   i int;  -- helper var
BEGIN
   DELETE FROM user_role WHERE user_id = $1;
   GET DIAGNOSTICS del_ct = ROW_COUNT;  -- init

   DELETE FROM user_permission WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;

   DELETE FROM permission_cache WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;

   DELETE FROM access WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;

   DELETE FROM "user" WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;
END
$func$  LANGUAGE plpgsql;
您将此作为第一个声明:

SELECT * FROM "user" WHERE user_id = $1 FOR UPDATE;
但是随后的
DELETE
语句也会锁定该行。没有必要一开始就这么做

添加的
OUT del_ct int
声明了一个
OUT
参数,该参数可以像任何变量一样赋值,并在函数结束时自动返回。它还不需要显式的
返回
声明

CREATE OR REPLACE FUNCTION user_delete(id int, OUT del_ct int) AS
$func$
DECLARE
   i int;  -- helper var
BEGIN
   DELETE FROM user_role WHERE user_id = $1;
   GET DIAGNOSTICS del_ct = ROW_COUNT;  -- init

   DELETE FROM user_permission WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;

   DELETE FROM permission_cache WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;

   DELETE FROM access WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;

   DELETE FROM "user" WHERE user_id = $1;
   GET DIAGNOSTICS i = ROW_COUNT;  del_ct := del_ct + i;
END
$func$  LANGUAGE plpgsql;
SELECT * FROM "user" WHERE user_id = $1 FOR UPDATE;
PERFORM * FROM "user" WHERE user_id = $1 FOR UPDATE;