![](/img/trans.png)
[英]IBM DB2 for i SQL (iSeries) - Removing a character from end of a field using update
[英]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.