postgresql 参数替换 游标_请教个关于postgresql游标取数据集的问题,请大家帮帮忙...

我用.net npgsql连postgresql数据库,想在前台程序中得到一个postgresql函数的输出参数返回的内容,我有两个输出参数,一个是数字型的,一个是游标,数字型的可以得到,但是游标取出来是个字符型的值(游标的名字),我想通过这个游标得到一个数据集应该怎么处理啊?postgresql文档上说取游标数据要放在一个事务里面,但是我不知道具体前台代码和后台要做些什么处理才可以得到这个游标数据,从而在前台程序中取到这个数据集。

下面是我测试用的函数:

CREATE OR REPLACE FUNCTION fun_test(IN mid integer, OUT mcount bigint, OUT mycur refcursor)

RETURNS record AS

$BODY$

begin

select count(*) into mcount from tb_test;

open mycur for select * from tb_test limit 10 offset 100;

end;

$BODY$

LANGUAGE 'plpgsql' VOLATILE

COST 100;

ALTER FUNCTION fun_test(integer) OWNER TO postgres;

下面是我现在的.net测试代码:

protected void TestProcedure(double id)

{

double mcount = 0;

NpgsqlConnection conn = new NpgsqlConnection("Server=localhost;Port=5432;UserId=postgres;Password=485925;Database=DemoPgsql;");

conn.Open();

NpgsqlTransaction trans=conn.BeginTransaction();

NpgsqlCommand command = new NpgsqlCommand();

command.Connection = conn;

command.CommandText = "fun_test";

command.CommandType = CommandType.StoredProcedure;

NpgsqlParameter pid = new NpgsqlParameter("mid", NpgsqlTypes.NpgsqlDbType.Integer, 64);

NpgsqlParameter pmcount = new NpgsqlParameter("mcount", NpgsqlTypes.NpgsqlDbType.Integer, 64);

NpgsqlParameter mycur = new NpgsqlParameter("mycur",NpgsqlTypes.NpgsqlDbType.Refcursor);

pid.Value = id;

pmcount.Direction = ParameterDirection.Output;

mycur.Direction = ParameterDirection.Output;

command.Parameters.Add(pid);

command.Parameters.Add(pmcount);

command.Parameters.Add(mycur);

NpgsqlDataAdapter adt = new NpgsqlDataAdapter(command);

DataSet ds = new DataSet();

command.ExecuteNonQuery();

trans.Commit();

adt.Fill(ds);

mcount = double.Parse((adt.SelectCommand).Parameters["mcount"].Value.ToString());

conn.Close();

command.Dispose();

adt.Dispose();

}

作者: tonghu008

发布时间: 2009-09-23

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQLPostgreSQL 在存储过程中使用游标的差异主要体现在语法上。 MySQL 中使用游标需要先声明游标,再打开游标,最后关闭游标。示例如下: ``` DECLARE cursor_name CURSOR FOR SELECT * FROM table_name; OPEN cursor_name; CLOSE cursor_name; ``` PostgreSQL 中使用游标不需要先声明游标,直接打开游标即可。示例如下: ``` DECLARE cursor_name CURSOR FOR SELECT * FROM table_name; ``` 还有就是PostgreSQL有FOR UPDATE 和 FOR NO KEY UPDATE 来锁定行或表,MySQL 中没有这样的概念。 另外,MySQL 中的游标只能用于存储过程中,而 PostgreSQL 中的游标可以用于存储过程和函数中。 ### 回答2: MySQLPostgreSQL是两种流行的关系型数据库管理系统,它们在存储过程中游标的使用上存在一些差异。 MySQL中的游标使用相对简单,只有循环游标(CURSOR LOOP)一种类型。该类型的游标可以用于在存储过程中遍历查询结果集,并进行相应操作。以下是一个使用MySQL游标的示例: DELIMITER $$ CREATE PROCEDURE exampleProcedure() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE id INT; DECLARE name VARCHAR(255); DECLARE cur CURSOR FOR SELECT id, name FROM table_name; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO id, name; IF done THEN LEAVE read_loop; END IF; -- 在此处进行相应的操作 END LOOP; CLOSE cur; END$$ DELIMITER ; 而PostgreSQL则提供了更多灵活的游标选项,包括无限游标(NO SCROLL)和可滚动游标(SCROLL)。以下是一个使用PostgreSQL游标的示例: CREATE OR REPLACE FUNCTION exampleProcedure() RETURNS VOID AS $$ DECLARE id INT; name VARCHAR(255); cur CURSOR FOR SELECT id, name FROM table_name; BEGIN OPEN cur; LOOP FETCH cur INTO id, name; EXIT WHEN NOT FOUND; -- 在此处进行相应的操作 END LOOP; CLOSE cur; END; $$ LANGUAGE plpgsql; 总结而言,MySQLPostgreSQL在存储过程中游标的使用上的主要差异在于可选的游标类型。MySQL只提供了循环游标,而PostgreSQL提供了更多选项,使得开发者能够更灵活地处理游标操作。 ### 回答3: MySQLPostgreSQL是两种常用的关系型数据库管理系统,它们在存储过程中游标使用上存在一些差异。 1. 游标定义和使用方式: - MySQL:MySQL中的游标定义和使用较为简单。游标可以通过DECLARE语句来定义,然后使用OPEN、FETCH和CLOSE语句来执行游标操作。 - PostgreSQLPostgreSQL游标使用较为复杂一些。游标定义需要使用DECLARE语句,并且需要指定游标类型,如INSENSITIVE、SCROLL等。游标的操作需要使用FETCH语句,并且需要将结果保存到变量中。 2. 游标参数: - MySQL:MySQL中的游标可以有参数,可以在游标定义时指定参数的名称和类型。在游标使用过程中,可以通过SET语句为参数赋值。 - PostgreSQLPostgreSQL中的游标不支持参数。 示例: 假设有两个表,一个是学生表(student),包含学生的姓名和成绩;另一个是成绩汇总表(summary),用于按照不同科目计算各科成绩的平均分和总分。 MySQL示例代码: ```sql -- 创建存储过程,计算各科成绩的总分和平均分 DELIMITER // CREATE PROCEDURE calculate_summary() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE student_name VARCHAR(255); DECLARE student_score INT; DECLARE cur CURSOR FOR SELECT name, score FROM student; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO student_name, student_score; IF done THEN LEAVE read_loop; END IF; -- 具体的计算逻辑 -- ... END LOOP; CLOSE cur; END // -- 调用存储过程 CALL calculate_summary(); ``` PostgreSQL示例代码: ```sql -- 创建存储过程,计算各科成绩的总分和平均分 CREATE OR REPLACE FUNCTION calculate_summary() RETURNS VOID AS $$ DECLARE student_name VARCHAR; student_score INT; cur CURSOR FOR SELECT name, score FROM student; BEGIN OPEN cur; LOOP FETCH cur INTO student_name, student_score; EXIT WHEN NOT FOUND; -- 具体的计算逻辑 -- ... END LOOP; CLOSE cur; END; $$ LANGUAGE plpgsql; -- 调用存储过程 SELECT calculate_summary(); ``` 以上示例仅为简单的演示,实际的存储过程中可能还会涉及到更复杂的操作和逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值