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方式调用返回游标的存储过程,目前还不知道如何使用,先记录下
在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方式调用返回游标的存储过程,目前还不知道如何使用,先记录下
相关文章推荐
- Java调用oracle存储过程通过游标返回临时表数据
- oracle 在一个存储过程中调用另一个返回游标的存储过程
- del调用返回游标的存储过程
- oracle 在一个存储过程中调用另一个返回游标的存储过程
- java 调用oracle 分页存储过程 返回游标数据集
- Java调用oracle存储过程通过游标返回临时表数据
- (转载)oracle 在一个存储过程中调用另一个返回游标的存储过程
- oracle 在一个存储过程中调用另一个返回游标的存储过程
- java调用存储过程(返回游标变量,利用索引表,临时表)
- 存储过程调用存储过程,存储过程调用函数,返回表表变量,游标使用
- JDBC调用SQL存储过程返回游标
- oracle如何在一个存储过程中调用另一个返回游标的存储过程
- vb调用oracle数据库返回游标的存储过程
- spring jdbctemplate或jdbc调用返回游标或复杂数据类型的存储过程
- c#调用数据库中的带返回(output参数形式)存储过程的demo
- Mybits调用存储过程和函数返回游标,parameterType值必须为java.util.Map,由于它会把返回的游标放在里面
- 在一个存储过程中调用返回一个游标的另一个存储过程
- Oracle 存储过程调用返回游标的另一个存储过程。
- Java调用oracle存储过程通过游标返回临时表数据
- oracle 在一个存储过程中调用另一个返回游标的存储过程