Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgresQL中的MySQL处理程序_Mysql_Sql_Postgresql_Handler_Database Cursor - Fatal编程技术网

PostgresQL中的MySQL处理程序

PostgresQL中的MySQL处理程序,mysql,sql,postgresql,handler,database-cursor,Mysql,Sql,Postgresql,Handler,Database Cursor,有可能在PostgreSQL中实现“MySQL处理程序”吗 使用光标几乎是我搜索的工具。 它允许快速前进和后退,一排一排。没有获取一个大的结果集 DECLARE mycursor CURSOR FOR SELECT * FROM mytable ORDER BY "name"; 但是如何在某一行的开头设置光标呢? 例如,从第一个“M”名称开始列表 如果我使用此光标: DECLARE mycursor CURSOR FOR SELECT * FROM mytable WHERE "name

有可能在PostgreSQL中实现“MySQL处理程序”吗

使用光标几乎是我搜索的工具。 它允许快速前进和后退,一排一排。没有获取一个大的结果集

DECLARE mycursor CURSOR FOR SELECT * FROM mytable ORDER BY "name";
但是如何在某一行的开头设置光标呢? 例如,从第一个“M”名称开始列表

如果我使用此光标:

DECLARE mycursor CURSOR FOR 
SELECT * 
FROM mytable 
WHERE "name" LIKE 'M%' ORDER BY "name";
我只能通过“M”记录前后移动,但不能再向后移动到“A”或向前移动到“Z”记录

我只找到了一个解决方案,通过整个排序结果集的row_number()和OVER()获得带有绝对行号的“第一个M记录”。 然后在整个结果集(A到Z)上创建光标,并使用

MOVE FORWARD nr_of_first_m FROM mycursor;
有更好的解决办法吗?因为执行这些查询需要超过1000毫秒。

每个链接。过去,我在旧的直接访问共享文件ISAM数据库产品中使用过类似的接口,在客户机/服务器SQL数据库中看到它,我感到非常惊喜。(如果我四年前就知道这一点的话,那么为1983年的4GL编写替代intepreter将使我以前用于商业应用程序的工作变得容易得多)

PostgreSQL没有在SQL级别公开任何等效功能。最接近的是-但由于可见性规则和事务隔离,这可能需要具体化数据集的已排序副本(虽然通常不适用于从没有聚合、窗口等的单个表中选择
,也不适用于按住
)。但是,正如您已经注意到的,PostgreSQL的
FETCH
MOVE
不支持基于值的滚动,只支持基于行数的滚动,这似乎使它们不适合您的要求

PostgreSQL中“获取前一行”或“获取下一行”的常用解决方案是在
SNAPSHOT
SERIALIZABLE
隔离中工作,并使用如下查询:

SELECT * FROM my_table WHERE the_key > 'last_seen_key_value' ORDER BY the_key ASC LIMIT 1;
e、 g.如果您上次看到“Matthew”并想知道下一个名字:

SELECT * FROM my_table WHERE "name" > 'Matthew' ORDER BY "name" ASC LIMIT 1;
或以前的名字:

SELECT * FROM my_table WHERE "name" < 'Matthew' ORDER BY "name" DESC LIMIT 1;
从my_表中选择*,其中“name”<'Matthew'顺序按“name”描述限制1;
只要在键上有一个合适的索引,这个策略就可以很好地工作——对于utf-8 db,在这种情况下,您需要在
“name”
上有一个
text\u pattern\u ops
b树索引。它仍然远没有原始访问ISAM表(如MyISAM)的速度快,但它可能与MySQL在内部使用InnoDB表句柄时的操作非常相似,因为它必须解决与PostgreSQL类似的问题。有一些解析和规划开销,但您可以通过保留一对准备好的语句并重新使用它们来消除其中的一些开销

您可以在PostgreSQL中使用低级C代码来访问堆和索引,实现类似于
HANDLE
的功能,但要在并发活动、真空等情况下正确实现它将是一项挑战。需要在PostgreSQL内部有丰富的经验,尤其是在使用索引访问方法方面。如果您准备投入学习和实现它所需的几个月的工作,您可以研究源代码,然后发布关于pgsql黑客的初步建议。或者,如果这是业务关键型功能,并且您需要PostgreSQL用于其他目的,您可以这样做,但不要期望这样的报价很低


否则,如果您需要这种直接的、低级的访问,最好还是坚持使用直接支持您需要的数据库产品。

到底什么是“处理程序”?您的问题似乎是关于可滚动/可搜索的光标。MySQL和它有什么关系/confusedHi,MySQL处理程序似乎是一个非SQL特性:在客户表中有多个名称,例如Jackson April Jackson Michael Jackson Peter,使用WHERE子句很难解决这个定位问题。因为WHERE子句限制了在语句
WHERE name>“Jackson”和firstname>“Peter”