2013-11-23 5 views
1

я выполнить дизайн в кэше, и похоже, что он не допускает многократную вставку, т.е.SQL вставка не работает

insert into Ruler (...) values (...), values().... 

или

insert into Ruler (...) values (...), (....) 

Поэтому я решил создать метод для выполнения вставки. Проблема - это не работает. Каждая вставка в порядке. Удалить также работало, но не вставлялось. Нет ошибки, просто пустой стол.

Method Fill() As %Integer 
{ 
    &sql(insert into Ruler (nameRuler, biography, idRuler) 
     values ('Peter the Great','Born in Moscow, Russia on June 9, 1672, Peter the Great was a Russian czar in the late 17th century who is best known for his extensive reforms in an attempt to establish Russia as a great nation. He created a strong navy, reorganized his army according to Western standards, secularized schools, administered greater control over the reactionary Orthodox Church, and introduced new administrative and territorial divisions of the country.', 1) 
     ) 
    &sql(insert into Ruler (nameRuler, biography, idRuler) values ('Boris Godunov','was de facto regent of Russia from c. 1585 to 1598 and then the first non-Rurikid tsar from 1598 to 1605. The end of his reign saw Russia descend into the Time of Troubles.', 2)) 

    //&sql(delete from Ruler) 
    &sql(SELECT COUNT(*) INTO :count 
     FROM Ruler) 

    Quit "Total: "_count 
} 

Любые идеи ???

+0

«Каждая вставка в порядке. Удаление также сработало, но не вставлено»? Вы имеете в виду, что отдельные инструкции вставки хорошо работают, но метод [конструктор значения таблицы] (http://technet.microsoft.com/en-us/library/dd776382.aspx) не работает? –

+0

Ну, да. Отдельная вставка отлично работает, если выполняется через Portal (это аналог для phpmyadmin). Две и более вставки не работают на этом портале (поскольку синтаксис неверен, поэтому я предполагал, что это не поддерживается). Ни одна из вставке не работает, если вызвана из Object Method. Нет ошибки. Я не знаю о конструкторе значения таблицы, но не думаю, что это он. Я не создаю новую таблицу, я использую существующую. Теперь я пытаюсь сделать как ClassMethod, не Object .. Может быть, это сработает. (PS) Если вы знаете, как вызвать ClassMethod в кеше, пожалуйста, сообщите. Их документация ужасна. – Tigran

+0

напишите ## class (Ruler) .Fill() - это то, как вызван метод ClassMethod. И результат равен 0 (нет вставки снова) – Tigran

ответ

3

В качестве отправной точки Cache не поддерживает несколько вставок в одном выражении.

Чтобы ответить на ваш вопрос об ошибке, я подозреваю, что вы заблокированы от выполнения вставок, потому что по умолчанию кэш не позволяет вставить идентификатор, если идентификатор автоматически назначается. Ваш код не выполняет проверку SQLCODE, поэтому довольно сложно проверить, так ли это.

Я настоятельно рекомендую, чтобы ваш объектный код использовал динамический SQL для выполнения ваших вставок, поскольку это немного проще в обслуживании и выполнять проверку ошибок. Так что ваш код может выглядеть следующим образом:

ClassMethod Fill(Output pErrorMessage As %String) As %Integer 
{ 
    Set pErrorMessage = "" 
    Set tCount = 0 
    Set tStatement = ##class(%SQL.Statement).%New() 
    // If you want to use unqualified schema names then update the schema path 
    Set tStatement.%SchemaPath = "MySchema,DEFAULT_SCHEMA" 
    Set tStatus = tStatement.%Prepare("INSERT INTO Ruler (nameRuler, biography, idRuler) VALUES(?,?,?)") 
    If $system.Status.IsError(tStatus) { 
     Set pErrorMessage = $system.Status.GetErrorText(tStatus) 
     Quit tCount 
    } 
    Set tRS1 = tStatement.%Execute("Peter the Great", "Born ...", 1) 
    If (tRS1.%SQLCODE = 0) { // no logic for SQLCODE = 100 as this is an INSERT 
     Set tCount = tCount + tRS1.%ROWCOUNT 
    } 
    Else { 
     // Return an error 
     Set pErrorMessage = "SQLCODE = " _ tRS1.%SQLCODE _ "; Message = " _ tRS1.%Message 
     Quit tCount 
    } 
    // Repeat for subsequent rows 
    // ... 
    Quit tCount 
} 

выше, является довольно многословен, но я могу предоставить вам образец проверки кода SQL для ваших вставок с помощью встроенного SQL, если вы предпочитаете.

+0

Спасибо, но я нашел решение с простыми объектами ... множество о = ## класс (Правитель).% New() набор o.nameRuler = "Феликс Форт" набор o.idRuler = 9 сделать o.% Save() – Tigran

+0

Я буду использовать свою версию, но может быть кто-то в будущем будет использовать SQL. – Tigran

+0

Также есть много хороших кодов ... Лучше официальной документации :) – Tigran

Смежные вопросы