Ошибка запроса вставки: количество столбцов не соответствует количеству значений в строке 1

У меня есть cfquery, который я перебираю значениями, чтобы вставить несколько строк в базу данных. Я должен сделать это таким образом, вместо того, чтобы генерировать несколько запросов INSERT в цикле, потому что мне нужен список generatedKeys после INSERT. Однако мой запрос теперь выдает ошибку ниже. Я знаю, что означает ошибка, но это не имеет смысла, исходя из моего запроса.

Запрос:

<cfquery datasource="#OLMSdatasourceWrite#" result="myResult">
    INSERT INTO OLMS_Data_RatioScenarios
    (
        OLMS_Account_ID,
        OLMS_RatioScenario_Name
    )
    VALUES
    (
    <cfset numItems = ListLen(AccountListWithSettings)>
    <cfset i = 1>

    <cfloop list="#AccountListWithSettings#" index="CurrentAccount">
        (<cfqueryparam cfsqltype="cf_sql_numeric" value="#CurrentAccount#" maxlength="255">
        , <cfqueryparam cfsqltype="cf_sql_clob" value="#requestBody.value#" maxlength="255">
        )
        <cfif i lt numItems>
            ,
        </cfif>

        <cfset i++>
    </cfloop>
    )
</cfquery>

<cfoutput>Inserted ID is: #myResult.generatedkey#</cfoutput>

Ошибка:

Root Cause:java.sql.SQLException: Column count doesn't match value count at row 1
SQL: INSERT INTO OLMS_Data_RatioScenarios ( OLMS_Account_ID, OLMS_RatioScenario_Name ) 
VALUES ( ( (param 1) , (param 2) ) , ( (param 3) , (param 4) ) , ( (param 5) , (param 6) ) ) 

person Charles L.    schedule 06.02.2017    source источник
comment
Взгляните на сгенерированное предложение VALUES. Это недопустимый sql. У вас слишком много скобок. При динамическом создании SQL я часто сначала вывожу сгенерированную строку, <cfoutput>INSERT INTO .... </cfoutput>, чтобы легче обнаружить такого рода синтаксические ошибки. Кроме того, я могу скопировать и вставить sql в IDE, если это необходимо.   -  person Leigh    schedule 06.02.2017
comment
@Ли, можешь уточнить?   -  person Charles L.    schedule 06.02.2017
comment
Скопируйте sql-часть сообщения об ошибке в текстовый редактор и отформатируйте его так, чтобы вы могли видеть проблему со скобками.   -  person Dan Bracuk    schedule 06.02.2017
comment
Взгляните на документы по MySQL. Правильное предложение VALUES выглядит следующим образом: VALUES(1,2),(4,5),(7,8);. Игнорируя параметры, то есть (парам X), обратите внимание, что у вас есть лишние скобки?   -  person Leigh    schedule 06.02.2017


Ответы (1)


Исправленный код:

<cfquery datasource="#OLMSdatasourceWrite#" result="myResult">
    INSERT INTO OLMS_Data_RatioScenarios
    (
        OLMS_Account_ID,
        OLMS_RatioScenario_Name
    )
    VALUES
    <cfset numItems = ListLen(AccountListWithSettings)>
    <cfset i = 1>
    <cfloop list="#AccountListWithSettings#" index="CurrentAccount">
        (
          <cfqueryparam cfsqltype="cf_sql_numeric" value="#CurrentAccount#" maxlength="255">
         , <cfqueryparam cfsqltype="cf_sql_clob" value="#requestBody.value#" maxlength="255">
        )
        <cfif i lt numItems>
            ,
        </cfif>

        <cfset i++>
    </cfloop>
</cfquery>
person Charles L.    schedule 06.02.2017