Postgres存储过程中的传递表值参数

问题描述 投票:0回答:2

我应该将存储过程从SQL Server迁移到Postgres。

这是SQL Server中的过程代码:

ALTER proc [dbo].[_GetUsers]
(
    @tblUsersSelected       typParameter READONLY
)
as
SELECT
    Users.*
FROM
    Users
JOIN
    @tblUsersSelected UsersSelected
ON
    Users.iUserID = UsersSelected.IntValue;

我正在尝试实现类似于Postgres中“表值参数”的方法,但是失败了。有人可以帮忙吗?

postgresql stored-procedures table-valued-parameters
2个回答
2
投票

使用integer的数组:

CREATE FUNCTION getusers(p_userids integer[]) RETURNS SETOF users
   LANGUAGE sql AS
'SELECT * FROM users WHERE iuserid = ANY (p_userids)';

0
投票

将其创建为postgres函数,然后将其简单地连接到数据表中。

这里是一个例子:

CREATE TEMPORARY TABLE _users
(
user_id serial
, user_name varchar
); 

INSERT INTO _users
(user_name)
VALUES 
  ('aaa')
 ,('beb')
 ,('caa')
 ,('fff');


CREATE FUNCTION pg_temp._test_table_values (_user_id int)
RETURNS TABLE 
(
 user_id int
,user_name varchar
)
SECURITY DEFINER AS $$

  SELECT user_id, user_name 
  FROM _users
  WHERE user_name LIKE '%a%'
  AND user_id = _user_id;

$$ LANGUAGE SQL; 

--join table and function
SELECT val.* 
FROM _users AS u
JOIN pg_temp._test_table_values(u.user_id) AS val (user_id, user_name)
ON u.user_id = val.user_id;

当我从SQL Server迁移到PostgreSQL时,花了一段时间习惯了使用所有功能,祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.