服务端:PHP+postgreSQLfunction a(){
  $l_sql="begin work;
          declare test_cur scroll cursor with hold for select * from aa_file;
          fetch first from test_cur; ";
  $sql_conn->query($l_sql);//事先已封装好的方法,运行sql语句 
}function b(){
  $l_sql="fetch next from test_cur ";
  $sql_conn->query($l_sql);
}
============================================
在a()中定义了一个游标test_cur,程序中调用a()执行时没有错误,能得到正确的数据,即能取得第一条记录并能正确返回.
可是在调用b()时(调用b之前程序先调用过a),却报错:Query failed: ERROR: cursor "test_cur" does not exist
疑问:
在postgresql中游标难道要在pl/pgsql中才能用?不能以此种方式定义和使用吗?如果不行,为何a()中的又能正确执行?
还是我哪里搞错了?
望知道的朋友指点一下。先谢了!

解决方案 »

  1.   

    经反复测试才明白一点,确定是这个提交动作造成的。
    弄不明白,为什么一提交后,之前定义的游标就用不了呢?提交对服务器内存中的变量有影响?还是提交后之前定义的begin work的环境不存在了,还是此时与数据库的连接是断开的?如果不用pl/pgsql来处理,还有什么办法可以解决这个问题?
    自己也是一知半解,说不到点上去,哪位朋友能说得明白点啊?
      

  2.   

    仔细看了PHP手册后,终于明白了。。这和 WEB 服务器工作的方式有关。WEB 服务器可以用三种方法来利用 PHP 生成 WEB 页面。 其中一种方法是将 PHP 用作一个“外壳”。以这种方法运行,PHP 会为向您的 WEB 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL 数据库服务器的连接)都会随线程的结束而关闭。