diff --git a/framework/db/oci/QueryBuilder.php b/framework/db/oci/QueryBuilder.php index b334acf45f..f48ff496c1 100644 --- a/framework/db/oci/QueryBuilder.php +++ b/framework/db/oci/QueryBuilder.php @@ -155,4 +155,43 @@ EOD; return $sql; } + + /** + * @inheritdoc + */ + public function batchInsert($table, $columns, $rows) + { + $schema = $this->db->getSchema(); + if (($tableSchema = $schema->getTableSchema($table)) !== null) { + $columnSchemas = $tableSchema->columns; + } else { + $columnSchemas = []; + } + + $values = []; + foreach ($rows as $row) { + $vs = []; + foreach ($row as $i => $value) { + if (!is_array($value) && isset($columns[$i]) && isset($columnSchemas[$columns[$i]])) { + $value = $columnSchemas[$columns[$i]]->dbTypecast($value); + } + if (is_string($value)) { + $value = $schema->quoteValue($value); + } elseif ($value === false) { + $value = 0; + } elseif ($value === null) { + $value = 'NULL'; + } + $vs[] = $value; + } + $values[] = 'SELECT ' . implode(', ', $vs) . ' FROM DUAL'; + } + + foreach ($columns as $i => $name) { + $columns[$i] = $schema->quoteColumnName($name); + } + + return 'INSERT INTO ' . $schema->quoteTableName($table) + . ' (' . implode(', ', $columns) . ') ' . implode(' UNION ', $values); + } }