您的位置:首页 > 数据库

MFC调用postgres数据库返回游标存储过程的疑惑

2008-07-03 15:44 483 查看
《原创文章,如需转载请注明作者及出处》
在postgres数据库的存储过程中,据我所知,有3种方式可以返回多行记录集

(1)存储过程返回游标。

(2)存储过程返回一个自定义类型。

(3)存储过程返回表。

以上3种方式:游标方式是灵活的,但在MFC中用ADO或ODBC调用返回游标形式的存储过程时,获得不到存储过程返回的游标结果(有很大可能是我不知道调用的方法,再者就是不支持返回游标的存储过程),针对以上问题,若存储过程是动态传递表的名称或字段的名称,那么(2)和(3)的固定返回形式是用不了的,必须用游标的形式返回,但游标存储过程在MFC中的调用问题(目前没有解决),在JAVA里,用JDBC的方式,很容易或者存储过程返回的游标。

对于需要返回多行固定列的结果集,就可以用(2)和(3)的方式了,有时由于不想获取表中的所有字段,而只是选择所需要的某2个或几个字段时,就可以用(2)方式,自定义返回的类型。如下所示:

CREATE TYPE Select_Scenario_Type AS ("Sid" INT,"Sno" VARCHAR(20),"Sname" VARCHAR(25),"Sdescription" VARCHAR(200),"Sflag" INT,"Uname" VARCHAR(20),"Suname" VARCHAR(25),"Sfilename" VARCHAR(50),"Ssheetname" VARCHAR(100),"Stime" VARCHAR(10),"StrRTname" TEXT);

创建返回类型后,存储过程可以返回该类型的结果集,如下:

CREATE OR REPLACE FUNCTION "funSearchScenarioInfo"(Sname VARCHAR(25),Uid INT,Suname VARCHAR(25),Stime VARCHAR(10),Sdescription VARCHAR(200))RETURNS SETOF Select_Scenario_Type AS

$$

DECLARE r Select_Scenario_Type;

strSname TEXT DEFAULT '';

strUid TEXT DEFAULT '';

strSuname TEXT DEFAULT '';

strStime TEXT DEFAULT '';

strSdescription TEXT DEFAULT '';

strSQL TEXT DEFAULT '';

BEGIN

strSQL := 'SELECT S."Sid",S."Sno",S."Sname",S."Sdescription",S."Sflag",U."Uname",S."Suname",S."Sfilename",S."Ssheetname",TO_CHAR(S."Stime",'||''''||'YYYY/MM/DD'||''''||') AS "Stime","funSelectAllRTnameBySid"(S."Sid") AS "StrRTname" FROM ';

strSQL := strSQL||'"Scenario" AS S,"Users" AS U WHERE S."Uid" = U."Uid"';

IF Sname IS NOT NULL AND Sname <> '' THEN

strSname := ' AND S."Sname" = '||''''||Sname||'''';

strSQL := strSQL||strSname;

END IF;

IF Uid <> 0 THEN strUid := ' AND U."Uid" = '||Uid;

strSQL := strSQL||strUid;

END IF;

IF Suname IS NOT NULL AND Suname <> '' THEN

strSuname := ' AND S."Suname" = '||''''||Suname||'''';

strSQL := strSQL||strSuname;

END IF;

IF Stime IS NOT NULL AND Stime <> '' THEN

strStime := ' AND TO_CHAR(S."Stime",'||''''||'YYYY/MM/DD'||''''||') = '||''''||Stime||'''';

strSQL := strSQL||strStime;

END IF;

IF Sdescription IS NOT NULL AND Sdescription <> '' THEN

strSdescription := ' AND S."Sdescription" LIKE '||''''||'%'||Sdescription||'%'||'''';

strSQL := strSQL||strSdescription;

END IF;

FOR r IN

EXECUTE strSQL

LOOP

RETURN NEXT r;

END LOOP;

END

$$LANGUAGE PLPGSQL;

对于返回该样式的存储过程,调用时需要形式为:

SELECT * FROM "funSearchScenarioInfo"('',0,'','','')

MFC中ADO或ODBC方式调用返回游标的存储过程,目前还不知道如何使用,先记录下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: