• 关于

    隐式游标

    的搜索结果

回答

使用函数和隐式SQL游标确定删除的行数 create or replace FUNCTION Testing ( iKey IN VARCHAR2 ) RETURN INTEGER AS BEGIN delete from MyTable WHERE TheKey = iKey; RETURN SQL%ROWCOUNT; END Testing; 那应该工作

保持可爱mmm 2019-12-02 03:17:18 0 浏览量 回答数 0

回答

MySQL客户端协议不允许进行多个查询。也就是说,您已经执行了查询,并且已经获取了一些结果,但不是全部—然后尝试执行第二个查询。如果第一个查询仍有要返回的行,则第二个查询将收到错误。 客户端库通过在首次获取时隐式获取第一个查询的所有行来解决此问题,然后后续获取仅对内部缓存的结果进行迭代。这给他们提供了关闭游标的机会(就MySQL服务器而言)。这就是“缓冲查询”。这与使用fetchAll()相同,这两种情况都必须在PHP客户端中分配足够的内存以容纳完整的结果集。 不同之处在于,缓冲的查询将结果保存在MySQL客户端库中,因此,只有在依次提取(fetch())每行之后,PHP才能访问这些行。而fetchAll()立即为所有结果填充一个PHP数组,从而允许您访问任何随机行。 不使用fetchAll()的主要原因是结果可能太大而无法容纳在您的PHP memory_limit中。但是看来您的查询结果仍然只有一行,所以这应该不是问题。 您可以先关闭closeCursor()以“放弃”结果,然后再获取最后一行。MySQL服务器收到通知,可以在服务器端放弃该结果,然后可以执行另一个查询。在完成获取给定结果集之前,您不应该关闭closeCursor()。 另外:我注意到您在循环内一遍又一遍地执行$ stmt2,但是每次都会返回相同的结果。根据将循环不变代码移出循环的原理,您应该在开始循环之前执行一次,并将结果保存在PHP变量中。因此,无论使用缓冲查询还是fetchAll(),都无需嵌套查询。 因此,我建议您以这种方式编写代码: $sql ='SELECT temp_id FROM temp1'; $stmt2 = db::db()->prepare($sql); $stmt2->execute(); $rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); $stmt2->closeCursor(); $sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id'; $stmt1 = db::db()->prepare($sql); foreach($data AS $row) { try { $stmt1->execute($row); $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $stmt1->closeCursor(); syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand()); syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand()); } catch(PDOException $e){echo(sql_error($e));} } 注意我还使用了命名参数而不是位置参数,这使得将$ row作为参数值数组进行传递更加简单。如果数组的键与参数名称匹配,则只需传递数组即可。在旧版本的PHP中,您必须:在数组键中包含前缀,但是您不再需要该前缀。 无论如何,您应该使用mysqlnd。它具有更多功能,具有更高的内存效率,并且其许可证与PHP兼容。来源:stack overflow

保持可爱mmm 2020-05-13 13:47:25 0 浏览量 回答数 0

回答

我想知道是否可以使用JDBC执行类似的操作。 "SELECT FROM * TABLE;INSERT INTO TABLE;" 是的,有可能。据我所知,有两种方法。他们是 通过设置数据库连接属性以允许多个查询,默认情况下用分号分隔。 通过调用返回隐式游标的存储过程。 以下示例演示了上述两种可能性。 示例1:(允许多个查询): 发送连接请求时,您需要将连接属性附加allowMultiQueries=true到数据库URL。这是额外的连接属性,如果那些已经存在的一些,比如autoReConnect=true,对等。可接受的值allowMultiQueries属性是true,false,yes,和no。其他任何值在运行时都会被拒绝SQLException。 String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true"; 除非通过了此类指令,否则SQLException将引发an 。 您必须使用execute( String sql )或其其他变体来获取查询执行的结果。 boolean hasMoreResultSets = stmt.execute( multiQuerySqlString ); 要遍历和处理结果,您需要执行以下步骤: READING_QUERY_RESULTS: // label while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) { if ( hasMoreResultSets ) { Resultset rs = stmt.getResultSet(); // handle your rs here } // if has rs else { // if ddl/dml/... int queryResult = stmt.getUpdateCount(); if ( queryResult == -1 ) { // no more queries processed break READING_QUERY_RESULTS; } // no more queries processed // handle success, failure, generated keys, etc here } // if ddl/dml/... // check to continue in the loop hasMoreResultSets = stmt.getMoreResults(); } // while results 示例2:要遵循的步骤: 创建一个或多个过程select,并进行DML查询。 使用从Java调用它CallableStatement。 您可以捕获ResultSet在过程中执行的多个。 DML结果无法捕获,但可以发出另一个结果select 来查找表中行的影响方式。 样品表和程序: mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) ); Query OK, 0 rows affected (0.16 sec) mysql> delimiter // mysql> create procedure multi_query() -> begin -> select count(*) as name_count from tbl_mq; -> insert into tbl_mq( names ) values ( 'ravi' ); -> select last_insert_id(); -> select * from tbl_mq; -> end; -> // Query OK, 0 rows affected (0.02 sec) mysql> delimiter ; mysql> call multi_query(); +------------+ | name_count | +------------+ | 0 | +------------+ 1 row in set (0.00 sec) +------------------+ | last_insert_id() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec) +---+------+ | i | name | +---+------+ | 1 | ravi | +---+------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) 从Java调用过程: CallableStatement cstmt = con.prepareCall( "call multi_query()" ); boolean hasMoreResultSets = cstmt.execute(); READING_QUERY_RESULTS: while ( hasMoreResultSets ) { Resultset rs = stmt.getResultSet(); // handle your rs here } // while has more rs来源:stack overflow

保持可爱mmm 2020-05-10 17:49:36 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站