如何解決 Golang 中的錯誤'ORA-00911:無效字元”?
在Golang開發過程中,我們有時會遇到"ORA-00911: 無效字元"這樣的錯誤。這種錯誤通常是由於在SQL語句中使用了無效的字元而引起的。要解決這個問題,我們可以採取一些簡單的方法。首先,在執行SQL語句之前,我們應該仔細檢查語句中是否有特殊字元或無效字元。其次,我們可以嘗試使用引號將包含特殊字元的欄位或值括起來,以避免出現錯誤。另外,也可以使用轉義字符來處理特殊字符,確保其在SQL語句中被正確地識別和處理。透過這些方法,我們可以有效地解決Golang中出現"ORA-00911: 無效字元"的問題,確保我們的程式能夠正常運作。
問題內容
我在呼叫以下函數時遇到錯誤「ORA-00911:無效字元」。如果我使用帶有硬編碼值的 SQL 查詢(截至目前,它已在下面的程式碼片段中註解掉),那麼我可以在郵遞員中以 JSON 回應取得資料庫記錄,沒有任何問題。所以,看起來我的論點做錯了。僅供參考,我正在使用“github.com/sijms/go-ora/v2”套件連接到 oracle db。 另外,「DashboardRecordsRequest」結構位於資料模型包中,但我已將其貼到下面的程式碼片段中以供參考。 請注意,當我進行 POC 時,我們將使用預存程序與 Oracle 互動。
郵差請求負載:
<code>{ "username": "UserABC", "startindex": 0, "pagesize": 10, "sortby": "requestnumber", "sortorder": "DESC" } </code>
執行程式碼:
<code>type DashboardRecordsRequest struct { Username string `json:"username"` StartIndex int `json:"startindex"` PageSize int `json:"pagesize"` SortBy string `json:"sortby"` SortOrder string `json:"sortorder"` } func GetDashboardActiveRequestRecords(request datamodel.DashboardRecordsRequest) ([]datamodel.ActiveRequestRecord, error) { sortby := request.SortBy sortorder := request.SortOrder startindex := request.StartIndex pagesize := request.PageSize activerecords := []datamodel.ActiveRequestRecord{} slog.Info("Verify values", slog.String("sortby", sortby), slog.String("sortorder", sortorder), slog.Int("startindex", startindex), slog.Int("pagesize", pagesize)) dbconn, err := getDBConnection() if err != nil { logger.Error("Could not connect to database") return activerecords, err } stmt, err := dbconn.Prepare("SELECT requestnumber, requeststatus, NVL(requestor, 'N/A'), NVL(pendingwith, 'N/A'), NVL(processtype, 'N/A'), actiondate FROM requests WHERE requeststatus = 'PENDINGAPPROVAL' ORDER BY ? ? OFFSET ? ROWS FETCH NEXT ? ROWS ONLY") /*stmt, err := dbconn.Prepare("SELECT requestnumber, requeststatus, NVL(requestor, 'N/A'), NVL(pendingwith, 'N/A'), NVL(processtype, 'N/A'), actiondate FROM requests WHERE requeststatus = 'PENDINGAPPROVAL' ORDER BY requestnumber DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY")*/ if err != nil { logger.Error("Error while building prepared statement for retrieving dashboard active records", slog.String("Error", err.Error())) return activerecords, err } rows, err := stmt.Query(sortby, sortorder, startindex, pagesize) //rows, err := stmt.Query() if err != nil { logger.Error("Error while executing prepared statement for retrieving dashboard active records", slog.String("Error", err.Error())) return activerecords, err } defer rows.Close() for rows.Next() { var rec datamodel.ActiveRequestRecord err = rows.Scan(&rec.RequestNumber, &rec.RequestStatus, &rec.RequestorName, &rec.PendingWith, &rec.ProcessType, &rec.LastActionDate) if err != nil { logger.Error("Error while processing database resultset for dashboard active records", slog.String("Error", err.Error())) return activerecords, err } activerecords = append(activerecords, rec) } return activerecords, err } </code>
請求表結構:
<code>CREATE TABLE "REQUESTS" ( "REQUESTNUMBER" VARCHAR2(64 CHAR) NOT NULL ENABLE, "REQUESTSTATUS" VARCHAR2(128 CHAR) NOT NULL ENABLE, "SUBMISSIONDATE" TIMESTAMP(6), "PROCESSTYPE" VARCHAR2(256 CHAR), "SUBMITTER" VARCHAR2(256 CHAR) NOT NULL ENABLE, "REQUESTOR" VARCHAR2(512 CHAR), "PENDINGWITH" VARCHAR2(512 CHAR), "ACTIONDATE" TIMESTAMP(6), "RESUBMISSIONDATE" TIMESTAMP(6), PRIMARY KEY ( "REQUESTNUMBER" ), FOREIGN KEY ( "SUBMITTER" ) REFERENCES "SUBMITTERS" ( "USERNAME" ) ) </code>
錯誤:
time=2023-10-04T06:43:06.304Z level=INFO source=C:/code/tutorials/myapp/internal/storage/dashboard.go:19 msg="Verify values" sortby=requestnumber sortorder=DESC startindex=0 pagesize=10 time=2023-10-04T06:43:06.603Z level=ERROR source=C:/code/tutorials/myapp/internal/storage/dashboard.go:34 msg="Error while executing prepared statement for retrieving dashboard active records" Error="ORA-00911: invalid character\n"
解決方法
直接的問題是您正在使用JDBC 樣式的?
綁定佔位符,而不是預期的:var
#形式。從 go-ora
套件的文檔中,您說您正在使用:< /p>
所以你的 stmt
應該是:
SELECT requestnumber, requeststatus, NVL(requestor, 'N/A'), NVL(pendingwith, 'N/A'), NVL(processtype, 'N/A'), actiondate FROM requests WHERE requeststatus = 'PENDINGAPPROVAL' ORDER BY :sortby :sortorder OFFSET :startindex ROWS FETCH NEXT :pagesize ROWS ONLY
但是除了變數之外你不能綁定任何東西,所以它根本不允許你將 sortorder
作為變量,如果你只是刪除它並執行以下操作:
ORDER BY :sortby OFFSET :startindex ROWS FETCH NEXT :pagesize ROWS ONLY
這似乎可以工作,但即使這樣也不能完全達到您想要的效果,因為排序將按文字列名稱而不是它的值進行排序;因此它將作為ORDER BY 'requestnumber'
的等效項運行,而不是ORDER BY requestnumber
。並且按該常數字串排序不會實現任何目標。
您需要在語句中嵌入訂購標準:
"... ORDER BY " + sortby + " " + sortorder + " OFFSET :startindex ROWS FETCH NEXT :pagesize ROWS ONLY"
db<>fiddle 使用 PL/SQL 動態遊標作為簡化的等效項,顯示三個版本 - 一個錯誤,一個沒有按預期訂購,最後訂購正常。
但是您還需要清理這些輸入以再次防止 SQL 注入。
以上是如何解決 Golang 中的錯誤'ORA-00911:無效字元”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 SQL Server 中使用 SQL 語句創建表的方法:打開 SQL Server Management Studio 並連接到數據庫服務器。選擇要創建表的數據庫。輸入 CREATE TABLE 語句,指定表名、列名、數據類型和約束。單擊執行按鈕創建表。

本文介紹了一種使用 SQL 語句連接三個表的詳細教程,指導讀者逐步了解如何有效地關聯不同表中的數據。通過示例和詳細的語法講解,本文將幫助您掌握 SQL 中表的連接技術,從而能夠高效地從數據庫中檢索關聯信息。

phpMyAdmin 可用於在 PHP 項目中創建數據庫。具體步驟如下:登錄 phpMyAdmin,點擊“新建”按鈕。輸入要創建的數據庫的名稱,注意符合 MySQL 命名規則。設置字符集,如 UTF-8,以避免亂碼問題。

判斷 SQL 注入的方法包括:檢測可疑輸入、查看原始 SQL 語句、使用檢測工具、查看數據庫日誌和進行滲透測試。檢測到注入後,採取措施修補漏洞、驗證補丁、定期監控、提高開發人員意識。

PostgreSQL 添加列的方法為使用 ALTER TABLE 命令並考慮以下細節:數據類型:選擇適合新列存儲數據的類型,如 INT 或 VARCHAR。默認值:通過 DEFAULT 關鍵字指定新列的默認值,避免值為 NULL。約束條件:根據需要添加 NOT NULL、UNIQUE 或 CHECK 約束條件。並發操作:使用事務或其他並發控制機制處理添加列時的鎖衝突。

檢查 SQL 語句的方法有:語法檢查:使用 SQL 編輯器或 IDE。邏輯檢查:驗證表名、列名、條件和數據類型。性能檢查:使用 EXPLAIN 或 ANALYZE,檢查索引並優化查詢。其他檢查:檢查變量、權限和測試查詢。

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。
