вставить / обновить / удалить несколько таблиц в одном операторе SQL - PullRequest
0 голосов
/ 08 ноября 2018

Когда я использую JMeter с JDBC-запросом в БД Oracle, он не допускает ; в операторе.

SQL-запрос. Не вводите точку с запятой.

Например

insert into a select '1' from dual;
insert into b select '1' from dual

Будет выдавать исключение (пока оно работает при разделении на 2 отдельных запроса):

 java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

Если я хочу выполнить очистку / вставку тестовых данных, я не могу вставить несколько таблиц , используя 1 запрос JDBC, и мне нужно создать как минимум 1 запрос на таблицу (может быть с несколькими значениями на таблицу) .

Есть ли способ вставить / обновить / удалить, кроме как с помощью вызываемого оператора?

Связано ли это ограничение исключительно с SQL-инъекцией?

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

; не является частью "SQL", это терминатор для программы, которая отправляет SQL. В sqldev / sqlcl / sqlplus ";" видно, что он знает конец оператора, чтобы отправить все до этого момента в базу данных как оператор. Затем обработайте следующий набор текста до следующего ";" или "/"

Этот пример представляет базу данных в виде одной большой строки, такой как:

"вставить в выделенную '1' из двойных; вставить в b выбрать '1' из двойных"

Чтобы выполнить 2 оператора в 1 обращении к базе данных, потребуется преобразование начала / конца, чтобы преобразовать его в исполняемый блок, такой как

BEGIN
insert into a select '1' from dual;
insert into b select '1' from dual;
END;

Затем в JMeter измените на «Вызываемый оператор»

0 голосов
/ 08 ноября 2018

Я нашел ВСТАВИТЬ ВСЕ с несколькими таблицами работает:

INSERT ALL
 Into a (a) values ('1')
 into b (b) values('1')
 SELECT * FROM dual

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

0 голосов
/ 08 ноября 2018

Вставка будет работать, используя INSERT ALL, например

insert all
  into a (col) values ('1')
  into b (col) values ('2')
select * From dual

Обновлять и удалять не буду; Я боюсь, что вам придется использовать один оператор на таблицу, если вы не хотите использовать PL / SQL и вызвать процедуру , которая выполнит всю эту работу.

0 голосов
/ 08 ноября 2018

Почему бы не попробовать: Insert Into tableA a, tableB b Value (a.field = (Select '1' From Dual), b.field = (Select '1' From Dual)), я не совсем уверен, но я думаю, что это может работать.

...