Вставьте в sysadm.tablename несколько значений

Я борюсь с оператором sql и не могу найти правильный синтаксис для этого.

Я программирую с teamdeveloper 6.1 и использую функцию SqlPrepareAndExecute(...)

Я пытаюсь вставить набор значений. В mysql это будет примерно так:

INSERT INTO supportContacts
    (type, details)
VALUES
    ('Email', '[email protected]'),
    ('Twitter', '@sqlfiddle');

С SqlTalk я могу сделать это...

INSERT INTO SYSADM.FOOBAR VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)
\
$datatypes CHARACTER,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC
"01",0,0,0,0,0,0,0,0,0,0,0,0
"02",0,0,0,0,0,0,0,0,0,0,0,0
"03",0,0,0,0,0,0,0,0,0,0,0,0
"04",0,0,0,0,0,0,0,0,0,0,0,0
"05",0,0,0,0,0,0,0,0,0,0,0,0
"06",0,0,0,0,0,0,0,0,0,0,0,0
"07",0,0,0,0,0,0,0,0,0,0,0,0
"08",0,0,0,0,0,0,0,0,0,0,0,0
/

Оба бота не будут работать, когда я заполню переменную и использую ее в функции SqlExecute TD 6.1.

Я всегда получаю ошибки типа Statement not ended properly или Invalid constant.

Я также попытался поставить такие значения, как:

('01',0,0,0,0,0,0,0,0,0,0,0,0),
('02',0,0,0,0,0,0,0,0,0,0,0,0),
('03',0,0,0,0,0,0,0,0,0,0,0,0), ...

Ошибка...

Что я делаю не так ?

РЕДАКТИРОВАТЬ (Вещи, которые я пробовал до сих пор):


Попробуйте 1

Это все


Попробуйте 2

"INSERT INTO SYSADM.FOOBAR VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)
\
$datatypes CHARACTER,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC,NUMERIC
'01',0,0,0,0,0,0,0,0,0,0,0,0
'02',0,0,0,0,0,0,0,0,0,0,0,0"

Что только говорит SQL command not properly ended


Попробуйте 3

Я думал, может это из-за \. На самом деле это escapechar, поэтому я избежал его, как

"INSERT INTO SYSADM.FOOBAR VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)
\\
$datatypes....

Теперь он сказал Недопустимый символ


Попробуйте 4

"INSERT INTO SYSADM.FOOBAR VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)
\
$da...
\'01\',0,0,0,0,0,0,0,0,0,0,0,0
\'02\',0,0,0,0,0,0,0,0,0,0,0,0"

Тоже был провал! :)


person Dwza    schedule 30.12.2014    source источник
comment
Как выглядит ваш SqlPrepare-Statement?   -  person Stephan Keller    schedule 02.01.2015
comment
На самом деле это то же самое, что и средний пост (sqltalk).   -  person Dwza    schedule 02.01.2015
comment
Есть некоторые синтаксисы SQLTalk (синтаксисы?), которые вы не можете использовать в SqlPrepare. Я предполагаю, что это относится к вашим попыткам 2-4. Таким образом, вы можете либо подготовить сценарий для SQLTalk и запустить его, либо вы можете просмотреть свои значения в цикле в CTD и вставить их одну строку за другой.   -  person Stephan Keller    schedule 05.01.2015
comment
Хм, хорошо .. Я зацикливаю их в данный момент. Просто попытался сделать более эффективным, как я делаю во всех других программах, например. PHP и MySQL   -  person Dwza    schedule 05.01.2015


Ответы (3)


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

INSERT INTO SYSADM.FOOBAR VALUES(:var1,:var2,:var3)

где var1, var2, var3 — переменные, видимые в функции, вызывающей SqlExecute/SqlPrepareAndExecute.

person Nathanyel    schedule 30.12.2014
comment
Как вы можете видеть в моем примере, я сделал это. Но это работает только в sqltalk, а не в исходниках... И я знаю, что это переменные. Но я хочу передать все данные для вставки. Я могу сделать это в mysql, а также в обычном SQL. У меня проблемы только с программированием... - person Dwza; 31.12.2014

Некоторый код для иллюстрации общего синтаксиса.
Предостережения:

  1. это делается с помощью CTD 2.1.
  2. Я пропустил весь код для подключения к базе данных и просто предположил, что h_SqlMain является допустимым дескриптором подключения.
  3. Данные поступают из массива. В реальной жизни вы бы, например. прочитать CSV-файл.
  4. Переменные myType и myDetail используются в качестве переменных привязки в SqlPrepare-Statment, поскольку CTD 2.1 не поддерживает прямое использование переменных массива в качестве привязок.

Часть «Локальная переменная»:

String: myType
String: myDetail
String: types[*]
String: details[*]
Number: i
Sql Handle: h_SqlMain

Часть «Действия»:

Set types[0] = 'Email'
Set details[0] = '[email protected]'
Set types[1] = 'Twitter'
Set details[1] = '@sqlfiddle'
Set types[2] = 'Foo'
Set details[2] = 'Bar'
Call SqlPrepare( h_SqlMain, 
   "INSERT INTO supportContacts (type, details) 
    VALUES(:myType, :myDetail)")
Set i=0
While i <= 2 
    Set myType = types[i]
    Set myDetail = details[i]
    Call SqlExecute( h_SqlMain )
    Set i=i+1
person Stephan Keller    schedule 02.01.2015
comment
У меня действительно так. В моем источнике у меня есть строка вставки, которая изменяется на каждой итерации. У меня есть таблица с 13 столбцами (каждый месяц один + один для объявления дней) и 31 строкой, чтобы получить представление о годе. Есть некоторые числовые значения, которые будут сохранены. Например, вставить в xy набор month1=12345, где day='02'. Так что я должен создать все с самого начала. Как я уже сказал, у меня есть банкомат. Но я хочу вставить это в одно утверждение. :) - person Dwza; 02.01.2015
comment
Есть ли в вашей строке вставки кавычки? Если это так, вы должны экранировать их, используя обратную косую черту. - person Stephan Keller; 02.01.2015
comment
Конечно, есть :) это Set sSql="INSERT INTO... ", а не обычное Call SqlPrepareAndExecute( sSql ). Конечно, в то время как sSql модифицируется на каждой итерации. без пока это не работает. И как большая строка, такая как средний код, тоже не работает. - person Dwza; 02.01.2015
comment
Я имел в виду, содержит ли он кавычки, как в вашем третьем примере. Эти вы должны бежать. Это касается и ' - person Stephan Keller; 02.01.2015
comment
Вы имеете в виду, что я должен сделать так: "... (\'01\',0,0,0,0,0,0,0,0,0,0,0,0)..."? - person Dwza; 02.01.2015

Ваши исходные данные находятся в таблице базы данных? Затем вы можете использовать оператор INSERT SELECT.

Как это:

INSERT INTO SYSADM.FOOBAR (COL1, COL2, COL3) SELECT COL1, COL2, COL3 FROM SOURCE_DATA

РЕДАКТИРОВАТЬ:

Или Вы можете использовать:

Call SqlPrepareAndExecute( hSql, '
INSERT INTO FOOBAR VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13)
select \'01\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'02\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'03\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'04\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'05\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'06\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'07\',0,0,0,0,0,0,0,0,0,0,0,0 from dual union all
select \'08\',0,0,0,0,0,0,0,0,0,0,0,0 from dual ' )
person ZephyCZ    schedule 31.12.2014
comment
Нет, ни со стола. Я должен обновлять некоторые базы данных клиентов каждые 2 года. Для этого у меня есть скрипт, который содержит нужный sql. На самом деле я могу использовать данный инструмент (SQLTalk) для выполнения этого скрипта. Но мне всегда приходится вносить какие-то изменения в этот скрипт (менять годы на нескольких позициях). И теперь я попытался создать инструмент, где у меня есть поле ввода. Там я бы ввел 15;16;17, чтобы сделать это dbupdate для 2015, 2016 и 2016 года. В зависимости от того, что я вставляю во входные данные. Вот почему я не храню source_data в БД. - person Dwza; 31.12.2014