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

本文介绍了在Postgres数据库中通过存储过程返回多行记录集的三种方式:游标、自定义类型和返回表。详细讲解了如何创建自定义类型并应用于存储过程,以及在不同场景下的适用性和调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《原创文章,如需转载请注明作者及出处》 在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方式调用返回游标的存储过程,目前还不知道如何使用,先记录下

PostgreSQL中,调用存储过程(Stored Procedures)通常有两种方法:通过SQL命令行工具(如psql)直接执行,或者在应用程序中通过数据库连接库间接执行。以下是常见的调用方法: 1. **使用SQL命令行工具**(psql或其他客户端) - 使用`\do`命令:PostgreSQL允许在psql的交互模式下直接运行存储过程。例如: ```sql \do $$ CREATE OR REPLACE PROCEDURE example_procedure(p_param1 integer) AS $$ BEGIN SELECT 'Hello from procedure!' WHERE p_param1 > 0; END; $$ LANGUAGE plpgsql; -- 调用存储过程 SELECT * FROM example_procedure(5); ``` 这里创建了一个名为`example_procedure`的存储过程,然后通过`SELECT`语句调用它。 2. **通过应用程序连接库** - 使用数据库驱动(如Python的psycopg2、Java的JDBC等): ```python import psycopg2 conn = psycopg2.connect(database="your_database", user="your_user", password="your_password", host="localhost", port=5432) cursor = conn.cursor() # 调用存储过程 cursor.execute("CALL example_procedure(%s)", (5,)) result = cursor.fetchone() # 获取结果 print(result) ``` 在这里,通过数据库连接库的`execute`方法调用存储过程,并传递参数。 含义: 调用存储过程的意义在于封装复杂操作或业务逻辑,可以减少代码重复,提高程序的复用性和安全性。用户可以通过传递参数控制流程,而不需要暴露底层实现细节。同时,存储过程可以在服务器端执行,减少网络传输的数据量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值