- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/db/oraclesqlhelper.php
- Класс: BitrixMainDBOracleSqlHelper
- Вызов: OracleSqlHelper::prepareMerge
public function prepareMerge($tableName, array $primaryFields, array $insertFields, array $updateFields)
{
$insert = $this->prepareInsert($tableName, $insertFields);
$updateColumns = array();
$sourceSelectColumns = array();
$targetConnectColumns = array();
$tableFields = $this->connection->getTableFields($tableName);
foreach($tableFields as $columnName => $tableField)
{
$quotedName = $this->quote($columnName);
if (in_array($columnName, $primaryFields))
{
$sourceSelectColumns[] = $this->convertToDb($insertFields[$columnName], $tableField)." AS ".$quotedName;
if($insertFields[$columnName] === null)
{
//can't just compare NULLs
$targetConnectColumns[] = "(source.".$quotedName." IS NULL AND target.".$quotedName." IS NULL)";
}
else
{
$targetConnectColumns[] = "(source.".$quotedName." = target.".$quotedName.")";
}
}
if (isset($updateFields[$columnName]) || array_key_exists($columnName, $updateFields))
{
$updateColumns[] = "target.".$quotedName.' = '.$this->convertToDb($updateFields[$columnName], $tableField);
}
}
if (
$insert && $insert[0] != "" && $insert[1] != ""
&& $updateColumns
&& $sourceSelectColumns && $targetConnectColumns
)
{
$sql = "
MERGE INTO ".$this->quote($tableName)." target USING (
SELECT ".implode(", ", $sourceSelectColumns)." FROM dual
)
source ON
(
".implode(" AND ", $targetConnectColumns)."
)
WHEN MATCHED THEN
UPDATE SET ".implode(", ", $updateColumns)."
WHEN NOT MATCHED THEN
INSERT (".$insert[0].")
VALUES (".$insert[1].")
";
}
else
{
$sql = "";
}
return array(
$sql
);
}