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;