我們剛剛獲得了新計算機,我通過 cx_Oracle 在 Python 中運行的 SQL 代碼停止作業。
當我運行代碼時,它回傳 ORA-01861 錯誤,指出文字與格式字串不匹配。我讀過這通常與日期有關,但在這種情況下,錯誤訊息指的是一個名為 period 的 char 變數。
基本上我的查詢說
where period = '2015-02'
指的是一年和一個月。period 的資料庫中的資料型別是 char。有人在處理 char 變數時識別出這個錯誤嗎?
我應該說,當我在 SQL Developer 中運行相同的代碼時,它作業得很好。
提前謝謝了。
uj5u.com熱心網友回復:
嗯,句號是字串嗎?VARCHAR2資料型別列(或任何其他“ CHAR”)?你確定嗎?因為,那個 Oracle 錯誤與DATE資料型別有關。
看看下面的例子:
SQL> desc emp
Name Null? Type
----------------------------- -------- --------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE --> HIREDATE is DATE datatype
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
我的資料庫回傳什么hiredate?
SQL> select hiredate from emp where rownum = 1;
HIREDATE
--------
17.12.80
啊哈;好的,所以讓我們嘗試使用以下日期格式選擇一行(注意這'1980-12-17'是一個字串,而不是日期!):
SQL> select empno, ename, hiredate from emp where hiredate = '1980-12-17';
select empno, ename, hiredate from emp where hiredate = '1980-12-17'
*
ERROR at line 1:
ORA-01861: literal does not match format string
哦?和你一樣的錯誤。你的日期格式怎么樣?
SQL> select empno, ename, hiredate from emp where hiredate = '1980-12';
select empno, ename, hiredate from emp where hiredate = '1980-12'
*
ERROR at line 1:
ORA-01861: literal does not match format string
SQL>
一樣的,沒有區別。Oracle未能將我提供的字串隱式“轉換”為有效值DATE。那么該怎么辦?
最糟糕的是不斷提供字串并希望Oracle會猜測格式:
SQL> select empno, ename, hiredate from emp where hiredate = '17.12.80';
EMPNO ENAME HIREDATE
---------- ---------- --------
7369 SMITH 17.12.80
SQL>
更好的選擇是控制它并提供DATE值,例如日期文字(它總是看起來像這樣:date關鍵字,后跟用yyyy-mm-dd單引號括起來的格式的日期):
SQL> select empno, ename, hiredate from emp where hiredate = date '1980-12-17';
EMPNO ENAME HIREDATE
---------- ---------- --------
7369 SMITH 17.12.80
SQL>
這行得通。
或者,調整當前會話的 NLS 設定(這是一種愚蠢的格式,只是為了表明它無論如何都可以作業):
SQL> alter session set nls_date_format = 'mm/yyyy/dd';
Session altered.
SQL> select empno, ename, hiredate from emp where hiredate = '12/1980/17';
EMPNO ENAME HIREDATE
---------- ---------- ----------
7369 SMITH 12/1980/17
SQL>
因此,我建議您a)檢查period列的資料型別,b)控制流程并將日期與日期進行比較,而不是日期與字串進行比較。
PS 哦,是的 - 為什么 SQL Developer “作業”?它的設定識別您提供的格式。
uj5u.com熱心網友回復:
我通過設定解決了
os.environ['NLS_LANG'] = 'swedish'
在我的 cx_Oracle 連接之前。
我要感謝 Littlefoot 幫助我將這個問題歸結為 NLS 設定,并使我免于錯過最后期限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415968.html
標籤:
