准备好的查询结果不一致,无法找到最后的插入ID

时间:2018-07-10 15:49:00

标签: sql db2 phpunit db2-400

我正在测试查询以从IBM DB2数据库中找到最后一个插入ID。 (我发现插入然后选择与插入值匹配的记录的困难方法根本不是获取最后一个插入ID的可靠方法!)

通常,插入将是使用自动递增字段id的类型,而我想获取最后一个值;但是,一个表使用SSN(显然不会自动递增),这就是我正在测试的方案。 (所有表都使用相同的插入方法)

查询如下:

SELECT id FROM FINAL TABLE (INSERT INTO {table} ({fields}) VALUES (?,? ... ?))

我的问题是,有时我从选择中得到结果,有时却没有结果!

真正奇怪的是,如果我不使用占位符,而只输入原始值,它就会起作用!

测试

<?php
print "Loading 001_crudClassTest\n";
use PHPUnit\Framework\TestCase;

require_once('testConfigSetup.php');
if(ENVIRONMENT != 'TEST') { die('YOU ARE NOT IN TEST ENVIRONMENT!  PROGRAM STOPPED!'); }


/**
 * Test basic CRUD functions using SelMaster
 */
class crudClassTest extends TestCase {


  public function __construct() {
    // construct is executed with EVERY test.
  }

  public function setUp() {
    // setUp is executed with Every test.  
    $this->m = new SelMaster(new TestDatabase);

  }


  public function testNewInsert() {

    $this->m->db->prepare("DELETE FROM {$this->m->db->library}.SelMaster");
    $this->m->db->execute();

    $data = array(
      array('id'=>'001110001','firstName'=>'Billy','lastName'=>'Batson','fullName'=>'Billy Batson'),
      array('id'=>'001110002','firstName'=>'Steve','lastName'=>'Rogers','fullName'=>'Steve Rogers'),
      array('id'=>'111110003','firstName'=>'Hank','lastName'=>'McCoy','fullName'=>'Hank McCoy'),
      array('id'=>'111110004','firstName'=>'Bruce','lastName'=>'Wayne','fullName'=>'Bruce Wayne'),
      array('id'=>'111110005','firstName'=>'Selina','lastName'=>'Kyle','fullName'=>'Selina Kyle'),
      array('id'=>'111110006','firstName'=>'Scott','lastName'=>'Summers','fullName'=>'Scott Summers'),
      array('id'=>'111110007','firstName'=>'Matthew','lastName'=>'Murdock','fullName'=>'Matthew Murdock'),
      array('id'=>'111110008','firstName'=>'Slade','lastName'=>'Wilson','fullName'=>'Slade Wilson'),
      array('id'=>'111110009','firstName'=>'Emma','lastName'=>'Frost','fullName'=>'Emma Frost'),
      array('id'=>'111110010','firstName'=>'Alan','lastName'=>'Scott','fullName'=>'Alan Scott'),
      array('id'=>'111110011','firstName'=>'Bruce','lastName'=>'Banner','fullName'=>'Bruce Banner'),
      array('id'=>'111110012','firstName'=>'Wally','lastName'=>'West','fullName'=>'Wally West'),
      array('id'=>'111110013','firstName'=>'Richard','lastName'=>'Reeds','fullName'=>'Richard Reeds','spouseId' => '3'),
      array('id'=>'111110014','firstName'=>'Barry','lastName'=>'Allen','fullName'=>'Barry Allen'),
      array('id'=>'111110015','firstName'=>'Ben','lastName'=>'Grimm','fullName'=>'Ben Grimm'),
      array('id'=>'111110016','firstName'=>'Peter','lastName'=>'Parker','fullName'=>'Peter Parker','spouseId' => '2'),
      array('id'=>'111110017','firstName'=>'Clark','lastName'=>'Kent','fullName'=>'Clark Kent','spouseId' => '1'),
      array('id'=>'111110018','firstName'=>'Carter','lastName'=>'Hall','fullName'=>'Carter Hall'),
      array('id'=>'111110019','firstName'=>'Martin','lastName'=>'Stein','fullName'=>'Martin Stein'),
      array('id'=>'111110020','firstName'=>'Dick','lastName'=>'Grayson','fullName'=>'Dick Grayson'),
      array('id'=>'111110021','firstName'=>'Luke','lastName'=>'Cage','fullName'=>'Luke Cage','spouseId' => '4'),
      array('id'=>'111110022','firstName'=>'Tony','lastName'=>'Stark','fullName'=>'Tony Stark','spouseId' => '5','contactId'=>'1')

    );

    foreach($data as $record) {
      list($keys,$placeholders,$vals) = $this->m->parametersForInsert($record);
      $query = sprintf(
        "SELECT %s FROM FINAL TABLE (INSERT INTO {$this->m->db->library}.selmaster (%s) VALUES(%s))",
        $this->m->map['id'],         // maps 'id' to 'SSN' 
        implode(',',$keys),          // fields, mapped to db field names in $this->m
        implode(',',$placeholders)   // ? for each field/value pair
        );
      print "\n$query  " . implode(',',$vals);
      $this->m->db->prepare($query); // PDO-like wrapper for ODBC
      $this->m->db->execute($vals);

      if($row = $this->m->nextRecord()) {  // fetchObject wrapper
        print "\n";
        print_r($row);  // => should yield results for both 'id' and 'ssn'
      }
    }

    print "\n\n########################################################################################################\n\n";
    // now, try it without prepared statements

    $this->m->db->prepare("DELETE FROM {$this->m->db->library}.SelMaster");
    $this->m->db->execute();

    foreach($data as $record) {
      list($keys,$placeholders,$vals) = $this->m->parametersForInsert($record);
      $query = sprintf(
        "SELECT %s FROM FINAL TABLE (INSERT INTO {$this->m->db->library}.selmaster (%s) VALUES('%s'))",
        $this->m->map['id'],
        implode(',',$keys),
        implode("','",$vals)
        );
      print "\n$query  " . implode(',',$vals);
      $this->m->db->prepare($query);
      $this->m->db->execute();

      if($row = $this->m->nextRecord()) {
        print "\n";
        print_r($row);
      }
    }




  }

结果

请注意,参数化查询在Bruce Wayne,Ben Grimm,Carter Hall,Martin Stein和Luke Cage上均未得到结果;但未参数化的版本会为所有结果:

Loading 001_crudClassTest
PHPUnit 6.0.10 by Sebastian Bergmann and contributors.

R                                                                  1 / 1 (100%)
SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  001110001,Billy,Batson,Billy Batson
stdClass Object
(
    [id] => 1110001
    [ssn] => 1110001
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  001110002,Steve,Rogers,Steve Rogers
stdClass Object
(
    [id] => 1110002
    [ssn] => 1110002
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110003,Hank,McCoy,Hank McCoy
stdClass Object
(
    [id] => 111110003
    [ssn] => 111110003
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110004,Bruce,Wayne,Bruce Wayne
SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110005,Selina,Kyle,Selina Kyle
stdClass Object
(
    [id] => 111110005
    [ssn] => 111110005
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110006,Scott,Summers,Scott Summers
stdClass Object
(
    [id] => 111110006
    [ssn] => 111110006
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110007,Matthew,Murdock,Matthew Murdock
stdClass Object
(
    [id] => 111110007
    [ssn] => 111110007
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110008,Slade,Wilson,Slade Wilson
stdClass Object
(
    [id] => 111110008
    [ssn] => 111110008
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110009,Emma,Frost,Emma Frost
stdClass Object
(
    [id] => 111110009
    [ssn] => 111110009
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110010,Alan,Scott,Alan Scott
stdClass Object
(
    [id] => 111110010
    [ssn] => 111110010
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110011,Bruce,Banner,Bruce Banner
stdClass Object
(
    [id] => 111110011
    [ssn] => 111110011
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110012,Wally,West,Wally West
stdClass Object
(
    [id] => 111110012
    [ssn] => 111110012
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES(?,?,?,?,?))  111110013,Richard,Reeds,Richard Reeds,3
stdClass Object
(
    [id] => 111110013
    [ssn] => 111110013
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110014,Barry,Allen,Barry Allen
stdClass Object
(
    [id] => 111110014
    [ssn] => 111110014
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110015,Ben,Grimm,Ben Grimm
SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES(?,?,?,?,?))  111110016,Peter,Parker,Peter Parker,2
stdClass Object
(
    [id] => 111110016
    [ssn] => 111110016
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES(?,?,?,?,?))  111110017,Clark,Kent,Clark Kent,1
stdClass Object
(
    [id] => 111110017
    [ssn] => 111110017
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110018,Carter,Hall,Carter Hall
SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110019,Martin,Stein,Martin Stein
SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES(?,?,?,?))  111110020,Dick,Grayson,Dick Grayson
stdClass Object
(
    [id] => 111110020
    [ssn] => 111110020
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES(?,?,?,?,?))  111110021,Luke,Cage,Luke Cage,4
SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID,CONTCTID) VALUES(?,?,?,?,?,?))  111110022,Tony,Stark,Tony Stark,5,1
stdClass Object
(
    [id] => 111110022
    [ssn] => 111110022
)


########################################################################################################


SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('001110001','Billy','Batson','Billy Batson'))  001110001,Billy,Batson,Billy Batson
stdClass Object
(
    [id] => 1110001
    [ssn] => 1110001
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('001110002','Steve','Rogers','Steve Rogers'))  001110002,Steve,Rogers,Steve Rogers
stdClass Object
(
    [id] => 1110002
    [ssn] => 1110002
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110003','Hank','McCoy','Hank McCoy'))  111110003,Hank,McCoy,Hank McCoy
stdClass Object
(
    [id] => 111110003
    [ssn] => 111110003
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110004','Bruce','Wayne','Bruce Wayne'))  111110004,Bruce,Wayne,Bruce Wayne
stdClass Object
(
    [id] => 111110004
    [ssn] => 111110004
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110005','Selina','Kyle','Selina Kyle'))  111110005,Selina,Kyle,Selina Kyle
stdClass Object
(
    [id] => 111110005
    [ssn] => 111110005
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110006','Scott','Summers','Scott Summers'))  111110006,Scott,Summers,Scott Summers
stdClass Object
(
    [id] => 111110006
    [ssn] => 111110006
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110007','Matthew','Murdock','Matthew Murdock'))  111110007,Matthew,Murdock,Matthew Murdock
stdClass Object
(
    [id] => 111110007
    [ssn] => 111110007
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110008','Slade','Wilson','Slade Wilson'))  111110008,Slade,Wilson,Slade Wilson
stdClass Object
(
    [id] => 111110008
    [ssn] => 111110008
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110009','Emma','Frost','Emma Frost'))  111110009,Emma,Frost,Emma Frost
stdClass Object
(
    [id] => 111110009
    [ssn] => 111110009
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110010','Alan','Scott','Alan Scott'))  111110010,Alan,Scott,Alan Scott
stdClass Object
(
    [id] => 111110010
    [ssn] => 111110010
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110011','Bruce','Banner','Bruce Banner'))  111110011,Bruce,Banner,Bruce Banner
stdClass Object
(
    [id] => 111110011
    [ssn] => 111110011
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110012','Wally','West','Wally West'))  111110012,Wally,West,Wally West
stdClass Object
(
    [id] => 111110012
    [ssn] => 111110012
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES('111110013','Richard','Reeds','Richard Reeds','3'))  111110013,Richard,Reeds,Richard Reeds,3
stdClass Object
(
    [id] => 111110013
    [ssn] => 111110013
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110014','Barry','Allen','Barry Allen'))  111110014,Barry,Allen,Barry Allen
stdClass Object
(
    [id] => 111110014
    [ssn] => 111110014
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110015','Ben','Grimm','Ben Grimm'))  111110015,Ben,Grimm,Ben Grimm
stdClass Object
(
    [id] => 111110015
    [ssn] => 111110015
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES('111110016','Peter','Parker','Peter Parker','2'))  111110016,Peter,Parker,Peter Parker,2
stdClass Object
(
    [id] => 111110016
    [ssn] => 111110016
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES('111110017','Clark','Kent','Clark Kent','1'))  111110017,Clark,Kent,Clark Kent,1
stdClass Object
(
    [id] => 111110017
    [ssn] => 111110017
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110018','Carter','Hall','Carter Hall'))  111110018,Carter,Hall,Carter Hall
stdClass Object
(
    [id] => 111110018
    [ssn] => 111110018
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110019','Martin','Stein','Martin Stein'))  111110019,Martin,Stein,Martin Stein
stdClass Object
(
    [id] => 111110019
    [ssn] => 111110019
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME) VALUES('111110020','Dick','Grayson','Dick Grayson'))  111110020,Dick,Grayson,Dick Grayson
stdClass Object
(
    [id] => 111110020
    [ssn] => 111110020
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID) VALUES('111110021','Luke','Cage','Luke Cage','4'))  111110021,Luke,Cage,Luke Cage,4
stdClass Object
(
    [id] => 111110021
    [ssn] => 111110021
)

SELECT SSN FROM FINAL TABLE (INSERT INTO test.selmaster (SSN,FNAME,LNAME,FULLNAME,SPOUSEID,CONTCTID) VALUES('111110022','Tony','Stark','Tony Stark','5','1'))  111110022,Tony,Stark,Tony Stark,5,1
stdClass Object
(
    [id] => 111110022
    [ssn] => 111110022
)


Time: 1.94 seconds, Memory: 10.00MB

OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Risky: 1.

每次运行都会产生相同的故障。更改插入顺序会导致其他记录无法返回id(插入记录后不会失败)

为什么我在参数化查询中无法获得一致的结果?


更新

根据http://www-01.ibm.com/support/docview.wss?uid=nas8N1019633,我尝试删除SQL包,该包或多或少是已准备好的语句的缓存。

删除软件包后,测试可以一次进行。然后,它返回到奇怪的结果。每次删除软件包时,测试都会运行一次。

0 个答案:

没有答案