Хранимая процедура для создания операторов вставки в MySql - PullRequest
0 голосов
/ 04 мая 2010

Мне нужна хранимая процедура, чтобы получить записи таблицы и вернуть значение в виде вставки операторов для выбранные записи.

Для экземпляра хранимая процедура должна иметь три входных параметра ...

1- Название таблицы

2- Имя столбца

3- Значение столбца

Если

1- Название таблицы = "EMP"

2- Имя столбца = "EMPID"

3- Значение столбца = "15"

Тогда вывод должен быть, выберите все значения EMP, где EMPID равен 15 Как только значения выбраны для вышеуказанного условия, хранимая процедура должна вернуть скрипт для вставки выбранных значений.

Цель этого - сделать резервную копию выбранных значений. когда SP возвращается значение {Вставить операторы}, c # просто запишет их в файл .sql.

Понятия не имею о написании этого SP, любые образцы кода оценены. Спасибо ..

Ответы [ 4 ]

4 голосов
/ 05 мая 2010

Вы можете сделать это с помощью mysqldump:

mysqldump --no-create-info --skip-triggers 
  --where="$COLUMN_NAME='$COLUMN_VALUE'" --databases $DB --tables $TABLE_NAME
2 голосов
/ 25 декабря 2012

Расширить ответ Ануи (на который ссылаются http://kedar.nitty -witty.com / blog / mysql-хранимая процедура для генерации-извлечения-вставки-оператора ) кстати ...

Сначала нужно несколько вспомогательных функций mysql:

/*
isNumeric - return 1/true if passed in string is numeric, false otherwise
Usage example: select isNumeric('2012-02-16'); => 0
*/
DROP FUNCTION IF EXISTS `bettermentdb`.`isNumeric`;
DELIMITER ;;
CREATE DEFINER=`betterment-web`@`localhost` FUNCTION `bettermentdb`.`isNumeric`(s varchar(255))
RETURNS TINYINT
DETERMINISTIC
BEGIN
   SET @match ='^(([0-9+-.$]{1})|([+-]?[$]?[0-9]*(([.]{1}[0-9]*)|([.]?[0-9]+))))$';
   RETURN IF(s regexp @match, 1, 0);
END;;
DELIMITER ;

/*
isNumeric - return an input wrapped in "'" if value is non-numeric, original otherwise.
Depends on isNumeric()
Usage example: select wrapNonNumeric(now()); => '2012-02-16'
           select wrapNonNumeric(NULL); => NULL
           select wrapNonNumeric(1); => 1
*/
DROP FUNCTION IF EXISTS `bettermentdb`.`wrapNonNumeric`;
DELIMITER ;;
CREATE DEFINER=`betterment-web`@`localhost` FUNCTION `bettermentdb`.`wrapNonNumeric`(s varchar(255))
RETURNS varchar(255)
DETERMINISTIC
BEGIN
   RETURN IF(isNumeric(s), s, concat("'", s, "'"));
END;;
DELIMITER ;

Вывод на консоль с именами столбцов определяет и нечисловые значения, заключенные в кавычки, с ограничением на заданную строку ввода db.table:

DELIMITER ;;
DROP PROCEDURE IF EXISTS GenerateInsertSQL;
CREATE DEFINER=`root`@`localhost` PROCEDURE GenerateInsertSQL(IN in_db varchar(20), IN in_table varchar(32), IN in_row BIGINT)
READS SQL DATA
BEGIN
   DECLARE nullableValues varchar(1000);
   DECLARE colNames varchar(1000);
   DECLARE insertStmnt varchar(2000);

   SELECT group_concat(concat('IFNULL(wrapNonNumeric(`',column_name,'`), "NULL")')) INTO @nullableValues from information_schema.columns where table_schema=in_db and table_name=in_table;
   SELECT group_concat(concat('`',column_name,'`')) INTO @colNames from information_schema.columns where table_schema=in_db and table_name=in_table;

   SET @insertStmnt=concat("select concat('INSERT INTO `", in_db, "`.`", in_table, "`(", @colNames, ") VALUES (', concat_ws(', ',",@nullableValues,"),');') from ", in_db, ".", in_table, " where id = ", in_row, " group by ", @colNames, ";");
   PREPARE insertStmnt FROM @insertStmnt;
   EXECUTE insertStmnt;
END
DELIMITER ;
0 голосов
/ 05 апреля 2012

Пришлось решать эту проблему сегодня.

mysqldump в порядке, но не слишком дружелюбен, чтобы изменить предложение WHERE.

В итоге я SQLyog , клиент MySQL, он имеет функцию, позволяющую экспортировать набор результатов любого оператора SQL SELECT в набор операторов INSERT.

0 голосов
/ 18 мая 2010
DELIMITER $$

DROP PROCEDURE IF EXISTS `sample`.`InsGen` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsGen`(
in_db varchar(20),
in_table varchar(20),
in_ColumnName varchar(20),
in_ColumnValue varchar(20)
)
BEGIN

declare Whrs varchar(500);
declare Sels varchar(500);
declare Inserts varchar(200);
declare tablename varchar(20);
declare ColName varchar(20);


set tablename=in_table;


# Comma separated column names - used for Select
select group_concat(concat('concat(\'"\',','ifnull(',column_name,','''')',',\'"\')'))
INTO @Sels from information_schema.columns where table_schema=in_db and table_name=tablename;


# Comma separated column names - used for Group By
select group_concat('`',column_name,'`')
INTO @Whrs from information_schema.columns where table_schema=in_db and table_name=tablename;


#Main Select Statement for fetching comma separated table values

 set @Inserts=concat("select concat('insert IGNORE into ", in_db,".",tablename," values(',concat_ws(',',",@Sels,"),');')
 as MyColumn from ", in_db,".",tablename, " where ", in_ColumnName, " = " , in_ColumnValue, " group by ",@Whrs, ";");

 PREPARE Inserts FROM @Inserts;

EXECUTE Inserts;                    

END $$

DELIMITER ;
...