Postgres vs MySQL函数返回行集

nuypyhwy  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(106)

我们正在将一个项目从MySQL迁移到Posterre。
在MySQL中,我们有以下存储过程代码:

CREATE OR REPLACE PROCEDURE getData()
BEGIN
   SELECT t1.*,
          t2.*,
          t3.*,
          t4.*
   FROM  t1
   JOIN  t2 ON t1.t1_id = t2.t2_t1_id
   JOIN  t3 ON t1.t1_id = t3.t3_t1_id
   JOIN  t4 ON t1.t1_id = t4.t4_t1_id;

END //

字符串
当从使用CALL getData)_的NodeJS应用程序调用时,它返回数组或行和列形式的数据,例如row[0]['t2_t1_id']以访问行1列t2_t1_id。
我们得到的以可用格式(JSON)返回数据的Posterre版本如下所示:

RETURNS TABLE( j JSON )  
LANGUAGE plpgsql AS $$
BEGIN
   RETURN QUERY 
   WITH rd AS (
   SELECT t1.*,
          t2.*,
          t3.*,
          t4.*
   FROM  t1
   JOIN  t2 ON t1.t1_id = t2.t2_t1_id
   JOIN  t3 ON t1.t1_id = t3.t3_t1_id
   JOIN  t4 ON t1.t1_id = t4.t4_t1_id
   )
   SELECT row_to_json(rd) FROM rd;
END;


但这会以JSON的形式返回:

[
  {
    getdata: {
      t1_id: 62,
      t1_name: 'xx',
      t2_id: 67,
      t2_t1_id: 62, ... },
    getdata: {
      t1_id: 63,
      t1_name: 'yy',
      t2_id: 69,
      t2_t1_id: 63, ... }, ...


我想让PostGres函数返回数据对象,就像它返回MySQL等价对象一样?

zu0ti5jz

zu0ti5jz1#

尝试以下操作我修改了PostgreSQL函数,使其返回一组记录而不是JSON,使其输出格式与MySQL存储过程更接近。

CREATE OR REPLACE FUNCTION getData()
RETURNS SETOF RECORD
LANGUAGE plpgsql AS $$
BEGIN
   RETURN QUERY 
   SELECT t1.*,
          t2.*,
          t3.*,
          t4.*
   FROM  t1
   JOIN  t2 ON t1.t1_id = t2.t2_t1_id
   JOIN  t3 ON t1.t1_id = t3.t3_t1_id
   JOIN  t4 ON t1.t1_id = t4.t4_t1_id;
END;
$$;

字符串
你可以这样调用函数

SELECT * FROM getData() AS (column1 type1, column2 type2, ...);

相关问题