免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3149 | 回复: 2

postgresql中这种查询有没有简单的方法把结果返回 [复制链接]

论坛徽章:
0
发表于 2012-06-25 10:13 |显示全部楼层
想把查询的结果返回,一个是int 型,后两个是varchar类型的值:
可不可以用记录类型返回?
        if EXISTS(select * from ADInfo where ADID=v_ADID) then
                select v_Ver as Ver ,Url, LinkUrl from ADInfo where ADID=V_ADID;
        else  
        BEGIN
                SELECT v_Ver as Ver ,'' as Url ,'' as LinkUrl;
        END;
           end if;

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2012-06-26 18:49 |显示全部楼层
回复 1# oracle_1010
在PostgreSQL可以很简单的做到,具体见下面:

create table ADInfo(Adid INT,v_Ver int, Url text, LinkUrl text);
insert into adinfo values(1,1,'www.baidu.com','http://www.baidu.com');
insert into adinfo values(2,2,'www.google.com','http://www.google.com');

你可以创建一个返回类型:
CREATE TYPE ret_my_type AS
(
   Ver INT,
   Url VARCHAR,
   LinkUrl VARCHAR
);

CREATE OR REPLACE FUNCTION my_function(v_adid int) RETURNS SETOF ret_my_type AS 
$$
DECLARE
     v_rec ret_my_type;
BEGIN
    IF EXISTS(select * from ADInfo where ADID=v_ADID) then
        FOR v_rec IN select v_Ver as Ver ,Url, LinkUrl from ADInfo where ADID=V_ADID LOOP
            RETURN NEXT v_rec;
        END LOOP;
    ELSE
        FOR v_rec IN SELECT v_Ver as Ver ,'' as Url ,'' as LinkUrl LOOP
            RETURN NEXT v_rec;
        END LOOP;
    END IF;
END;
$$
LANGUAGE PLPGSQL;

postgres=# select * from my_function(2);
 ver |      url       |        linkurl        
-----+----------------+-----------------------
   2 | www.google.com | http://www.google.com
(1 row)

如果你不创建类型ret_my_type,可以使用RECORD这种通用类型返回数据,但调用的时候就得指定返回的数据类型:
CREATE OR REPLACE FUNCTION my_function2(v_adid int) RETURNS SETOF RECORD AS 
$$
DECLARE
     v_rec RECORD;
BEGIN
    IF EXISTS(select * from ADInfo where ADID=v_ADID) then
        FOR v_rec IN select v_Ver as Ver ,Url, LinkUrl from ADInfo where ADID=V_ADID LOOP
            RETURN NEXT v_rec;
        END LOOP;
    ELSE
        FOR v_rec IN SELECT v_Ver as Ver ,'' as Url ,'' as LinkUrl LOOP
            RETURN NEXT v_rec;
        END LOOP;
    END IF;
END;
$$
LANGUAGE PLPGSQL;

postgres=# select * from my_function(2);
ERROR:  function my_function(integer) does not exist
LINE 1: select * from my_function(2);
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
因为没有指定返回的具体类型,所以报错了,指定类型:

postgres=# select * from my_function2(2) as (Ver int, Url text, Linkurl text);
 ver |      url       |        linkurl        
-----+----------------+-----------------------
   2 | www.google.com | http://www.google.com
(1 row)

论坛徽章:
0
发表于 2012-06-28 16:40 |显示全部楼层
谢谢你,其实我后来做出来了,用的方法就是你写的其中一种,本来里面有三条查询语句的,不过第一个查询语句主要是用来赋值的,所以当时就在那里纠结的!
虽然这个问题已经解决了,不过还是要谢谢你)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP