php-sqlsrv/test/functional/pdo_sqlsrv/pdo_278_lastinsertid_seq.phpt

76 lines
2.9 KiB
Plaintext
Raw Normal View History

2017-07-19 23:10:53 +02:00
--TEST--
Provide name in lastInsertId to retrieve the last sequence number
--SKIPIF--
<?php require('skipif_mid-refactor.inc'); ?>
2017-07-19 23:10:53 +02:00
--FILE--
<?php
require_once("MsCommon_mid-refactor.inc");
function getNextSeq($conn, $sequenceName)
{
$sql = "SELECT NEXT VALUE FOR $sequenceName";
$stmt = $conn->query($sql);
return $stmt->fetchColumn();
}
2017-07-19 23:43:28 +02:00
try {
2017-07-19 23:10:53 +02:00
$database = "tempdb";
$conn = connect();
2017-07-19 23:10:53 +02:00
// sequence is only supported in SQL server 2012 and up (or version 11 and up)
// Output Done once the server version is found to be < 11
$version_arr = explode(".", $conn->getAttribute(PDO::ATTR_SERVER_VERSION));
if ($version_arr[0] < 11) {
echo "Done\n";
} else {
$tableName1 = getTableName('tab1');
$tableName2 = getTableName('tab2');
2017-07-19 23:10:53 +02:00
$sequenceName = 'sequence1';
createTable($conn, $tableName1, array( new ColumnMeta("int", "seqnum", "NOT NULL PRIMARY KEY"), "SomeNumer" => "int"));
createTable($conn, $tableName2, array( new ColumnMeta("int", "ID", "IDENTITY(1,2)"), "SomeValue" => "char(10)"));
$conn->exec("IF OBJECT_ID('$sequenceName', 'SO') IS NOT NULL DROP SEQUENCE $sequenceName");
2017-07-19 23:10:53 +02:00
$sql = "CREATE SEQUENCE $sequenceName AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 100 CYCLE";
$conn->exec($sql);
if (!isColEncrypted()) {
$conn->exec("INSERT INTO $tableName1 VALUES( NEXT VALUE FOR $sequenceName, 20 )");
$conn->exec("INSERT INTO $tableName1 VALUES( NEXT VALUE FOR $sequenceName, 40 )");
$conn->exec("INSERT INTO $tableName1 VALUES( NEXT VALUE FOR $sequenceName, 60 )");
} else {
// if column seqnum is encrypted, need to get "NEXT VALUE FOR $sequenceName" separately first and then bind param
$sql = "INSERT INTO $tableName1 VALUES( ?, ? )";
$stmt = $conn->prepare($sql);
$nextSeq = getNextSeq($conn, $sequenceName);
$stmt->execute(array($nextSeq, 20));
$nextSeq = getNextSeq($conn, $sequenceName);
$stmt->execute(array($nextSeq, 40));
$nextSeq = getNextSeq($conn, $sequenceName);
$stmt->execute(array($nextSeq, 60));
}
insertRow($conn, $tableName2, array("SomeValue" => "20"));
2017-07-19 23:10:53 +02:00
// return the last sequence number is sequence name is provided
$lastSeq = $conn->lastInsertId($sequenceName);
// defaults to $tableName2 -- because it returns the last inserted row id value
2017-07-19 23:10:53 +02:00
$lastRow = $conn->lastInsertId();
2017-07-19 23:10:53 +02:00
if ($lastSeq == 3 && $lastRow == 1) {
echo "Done\n";
} else {
2017-07-19 23:10:53 +02:00
echo "sequence value or identity does not match as expected\n";
}
dropTable($conn, $tableName1);
dropTable($conn, $tableName2);
$conn->exec("DROP SEQUENCE $sequenceName");
unset($stmt);
2017-07-19 23:10:53 +02:00
}
unset($conn);
} catch (Exception $e) {
2017-07-19 23:10:53 +02:00
echo "Exception $e\n";
}
2017-07-19 23:10:53 +02:00
?>
--EXPECT--
Done