Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menyelesaikan ralat 'ORA-00911: aksara tidak sah' di Golang?

Bagaimana untuk menyelesaikan ralat 'ORA-00911: aksara tidak sah' di Golang?

WBOY
WBOYke hadapan
2024-02-08 21:39:23768semak imbas

如何解决 Golang 中的错误“ORA-00911:无效字符”?

Semasa proses pembangunan Golang, kadangkala kita menghadapi ralat seperti "ORA-00911: watak tidak sah". Ralat ini biasanya disebabkan oleh penggunaan aksara yang tidak sah dalam pernyataan SQL. Untuk menyelesaikan masalah ini, kita boleh mengambil beberapa kaedah mudah. Pertama sekali, sebelum melaksanakan pernyataan SQL, kita harus menyemak dengan teliti sama ada terdapat aksara khas atau aksara tidak sah dalam pernyataan itu. Kedua, kita boleh cuba menggunakan petikan untuk menyertakan medan atau nilai yang mengandungi aksara khas untuk mengelakkan ralat. Selain itu, anda juga boleh menggunakan aksara melarikan diri untuk memproses aksara khas untuk memastikan bahawa aksara tersebut dikenali dan diproses dengan betul dalam pernyataan SQL. Melalui kaedah ini, kami boleh menyelesaikan masalah "ORA-00911: watak tidak sah" dengan berkesan di Golang dan memastikan program kami dapat berjalan seperti biasa.

Kandungan soalan

Saya mengalami ralat "ORA-00911: aksara tidak sah" semasa memanggil fungsi berikut. Jika saya menggunakan pertanyaan SQL dengan nilai berkod keras (setakat ini ia diulas dalam coretan kod di bawah), maka saya boleh mendapatkan rekod pangkalan data dalam respons JSON dalam Posman tanpa sebarang masalah. Jadi, nampaknya saya salah buat hujah. FYI, saya menggunakan pakej "github.com/sijms/go-ora/v2" untuk menyambung ke oracle db. Selain itu, struktur "DashboardRecordsRequest" berada dalam pakej model data, tetapi saya telah menampalnya ke dalam coretan di bawah untuk rujukan. Sila ambil perhatian bahawa apabila saya melakukan POC, kami akan menggunakan prosedur tersimpan untuk berinteraksi dengan Oracle.

Beban permintaan posmen:

<code>{
    "username": "UserABC",
    "startindex": 0,
    "pagesize": 10,
    "sortby": "requestnumber",
    "sortorder": "DESC"
}
</code>

Kod pelaksanaan:

<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>

Struktur jadual permintaan:

<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>

Ralat:

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"

Penyelesaian

Masalah segera ialah anda menggunakan pakej gaya JDBC ? 绑定占位符,而不是预期的 :var 形式。从 go-ora Dalam dokumentasi anda mengatakan anda menggunakan:

Jadi stmt anda sepatutnya:

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

Tetapi anda tidak boleh mengikat apa-apa selain pembolehubah, jadi ia tidak membenarkan anda mempunyai sortorder sebagai pembolehubah sama sekali, jika anda hanya mengalih keluarnya dan melakukan:

ORDER BY :sortby OFFSET :startindex ROWS FETCH NEXT :pagesize ROWS ONLY

Ini nampaknya berkesan, tetapi ini tidak cukup melakukan apa yang anda mahu kerana pengisihan akan mengisih mengikut nama lajur literal dan bukannya nilainya, jadi ia akan berfungsi sebagai ORDER BY 'requestnumber' 的等效项运行,而不是 ORDER BY requestnumber. Dan menyusun mengikut rentetan berterusan itu tidak akan mencapai apa-apa.

Anda perlu membenamkan kriteria pesanan dalam kenyataan:

"... ORDER BY " + sortby + " " + sortorder + " OFFSET :startindex ROWS FETCH NEXT :pagesize ROWS ONLY"

dba8093152e673feb7aba1828c43532094fiddle menggunakan kursor dinamik PL/SQL sebagai persamaan yang dipermudahkan, menunjukkan tiga versi - satu salah, satu tidak dipesan seperti yang diharapkan dan akhirnya dipesan dengan baik.

Tetapi anda juga perlu membersihkan input ini untuk mengelakkan suntikan SQL lagi.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat 'ORA-00911: aksara tidak sah' di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam