簡體   English   中英

什么是 IBM SQL 的有效語句結束?

[英]What is a valid END-OF-STATEMENT for IBM SQL?

我更像是一個 Microsoft T-SQL 的人——不是很好,但我用過它一點。

在 Visual Studio 代碼中,我有這個:

public static DataSet GetModels(string currentLogical, string fullTable, string library)
{
    var tableCurMd3LF = new DataTable(currentLogical);
    var tableCurMdlPF = new DataTable(fullTable);
    var sql = $@"
SELECT CMDESC, CMSPRE, CMTOLM
FROM {library}.CURMD3LF
ORDER BY CMSEQ ASC
FOR READ ONLY WITH UR;

SELECT CMDESC, CMSPRE, CMTOLM
FROM {library}.CURMDLPF
ORDER BY CMSEQ ASC
FOR READ ONLY WITH UR;
";
    using (var cmd = new OleDbCommand(sql, new OleDbConnection($"{ConfigurationManager.ConnectionStrings["AS400"]}")))
    {
        cmd.Connection.Open();
        using (var reader = cmd.ExecuteReader())
        {
            tableCurMd3LF.Load(reader);
            if (reader.NextResult())
            {
                tableCurMdlPF.Load(reader);
            }
        }
    }
    var result = new DataSet();
    result.Tables.Add(tableCurMd3LF);
    result.Tables.Add(tableCurMdlPF);
    return result;
}

我正在嘗試執行這樣的 SQL 語句:

SELECT CMDESC, CMSPRE, CMTOLM
FROM Test_Data.CURMD3LF
ORDER BY CMSEQ ASC
FOR READ ONLY WITH UR;

但我得到的錯誤是:

SQL0104:令牌; 無效。 有效標記: <END-OF-STATEMENT>
原因。 . . . . : 在標記處檢測到語法錯誤;。 代幣; 不是有效的令牌。 有效令牌的部分列表是。 此列表假定語句在令牌之前是正確的。 錯誤可能出現在語句的前面,但語句的語法到目前為止似乎是有效的。 恢復。 . . : 執行以下一項或多項操作並再次嘗試請求: -- 驗證令牌區域中的 SQL 語句;。 更正聲明。 錯誤可能是缺少逗號或引號,可能是單詞拼寫錯誤,也可能與從句的順序有關。 -- 如果錯誤標記是,請更正 SQL 語句,因為它沒有以有效子句結尾。

顯然,它不喜歡; 在 SQL 的末尾,就像 T-SQL 接受的那樣。

在它說“有效標記: <END-OF-STATEMENT> ”的地方,我嘗試使用<END-OF-STATEMENT>代替我的分號,但這只會產生這個異常:

SQL0104: 令牌 < 無效。 有效標記:用於使用 SKIP WAIT WITH OPTIMIZE。
原因。 . . . . : 在標記 < 處檢測到語法錯誤。 令牌 < 不是有效令牌。 部分有效令牌列表用於使用跳過等待優化。 此列表假定語句在令牌之前是正確的。 錯誤可能出現在語句的前面,但語句的語法到目前為止似乎是有效的。 恢復。 . . : 執行以下一項或多項操作並再次嘗試請求: -- 驗證令牌區域中的 SQL 語句 <。 更正聲明。 錯誤可能是缺少逗號或引號,可能是單詞拼寫錯誤,也可能與從句的順序有關。 -- 如果錯誤標記是<END-OF-STATEMENT> ,請更正 SQL 語句,因為它沒有以有效子句結尾。

是的,我完全想使用 Skip Wait。 這就是我想要達到的目的。

SELECT CMDESC, CMSPRE, CMTOLM
FROM Test_Data.CURMD3LF
ORDER BY CMSEQ ASC
FOR READ ONLY WITH UR
<END-OF-STATEMENT>
SELECT CMDESC, CMSPRE, CMTOLM
FROM Test_Data.CURMDLPF
ORDER BY CMSEQ ASC
FOR READ ONLY WITH UR

但這只會造成同樣的錯誤。

SQL0104: 令牌 < 無效。 有效標記:用於使用 SKIP WAIT WITH OPTIMIZE。
原因。 . . . . : 在標記 < 處檢測到語法錯誤。 令牌 < 不是有效令牌。 部分有效令牌列表用於使用跳過等待優化。 此列表假定語句在令牌之前是正確的。 錯誤可能出現在語句的前面,但語句的語法到目前為止似乎是有效的。 恢復。 . . : 執行以下一項或多項操作並再次嘗試請求: -- 驗證令牌區域中的 SQL 語句 <。 更正聲明。 錯誤可能是缺少逗號或引號,可能是單詞拼寫錯誤,也可能與從句的順序有關。 -- 如果錯誤標記是<END-OF-STATEMENT> ,請更正 SQL 語句,因為它沒有以有效子句結尾。

如何從我的 C# 代碼向 AS400 發送 2 個或更多 SQL 語句?

我認為不支持一次向 IBM i 發送多個 SQL 語句。 嘗試將其分解為多個交換。

如果您正在使用 SQL 創建過程或例程,則; 字符確實是例程主體語句的適當語句結束字符,但在這種情況下,所有內容都需要包裝在單個 create 語句中,並且 create 語句不能以;結尾; 特點。

DB2 只能為每個請求返回一個對象。

沒有JOIN的兩個或多個 Select 語句是無效的。 將請求分開。


是的,我完全想使用 Skip Wait。 這就是我想要達到的目的。

此聲明與UR子句相結合是沒有意義的。 您想要以下其中一項:

'UR' 返回未提交的數據。 請參見DB2 的鎖定控件

'SKIP LOCKED DATA` 忽略未提交的數據。

或 'SELECT WAIT' 未完成的提交必須首先發生或超時。

在 IBM 的世界里,所有的意外事件都被考慮在內,任何偏差都是錯誤。

如何從我的 C# 代碼向 AS400 發送 2 個或更多 SQL 語句?

假設滿足單個返回對象要求,使用事務:

使用BEGIN WORK; 語句開始交易。 是的,全部或沒有。 然后使用COMMIT WORK; 提交事務。

如果更新,您可能需要鎖定涉及的數據庫以確保成功:

BEGIN WORK;
   LOCK TABLE stock;
   UPDATE stock SET unit_price = unit_price * 1.10
      WHERE manu_code = 'KAR';
   DELETE FROM stock WHERE description = 'baseball bat';
   INSERT INTO manufact (manu_code, manu_name, lead_time) 
      VALUES ('LYM', 'LYMAN', 14);
COMMIT WORK;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM