• Модуль: 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
	);
}