1. oracle sql 錯誤: ORA-12899:始終提示欄位太大
數據導入時報ORA-12899錯誤原因是:由於Oracle字元集不同,漢字占的長度不同造成的。
字元集的意思是插入的數據長度超出欄位的設置長度,實際長度並不長。
原因:
中文在ZHS16GBK中佔2個位元組,在UTF-8中卻佔3個位元組,所以漢字導入UTF-8字元集的資料庫就很容易出現欄位長度不夠。
解決辦法:
一個是增加欄位長度,還有就是修改字元集。
特別說明:
如果系統中已經存在很多數據,建議修改欄位長度,因為修改字元集後原來資料庫表中的漢字全部變成亂碼。如果一定要修改字元集,必須先導出數據,待到字元集修改後再重新導入這些數據。
具體查看方法:
查看字元集的方法可以用PL/SQL DEVELOP ---->Reports---->DBA---->NLS Database Parameters,結果如下圖:
(1)oraclesql太長擴展閱讀:
Oracle的解決之道 :在稅務部門信息化大集中的規劃之下,建立完整的信息化架構,以網格作為統一的基礎平台;然後在網格基礎平台的基礎之上,進行數據孝巧集中;最後從數據集中再到應用集中,實現以優化管理為目的,更好地進行業務處理與信息的接通等服務。
整合現有的各種平台、系統和數據,建立哪中一個信息數據總局、省局兩級處理的統一的技術平台,需要解決以下的問題:數據的採集、數據的存儲和管理、數據的質量控制、數據的靈活展現。
以網格技術構建的基礎平台,能夠提高硬體的利用率和資源共享,能夠使公司可以通過增加成本組件來向外擴張,還可以減少管巧緩鍵理需求等。所以,通過網格基礎平台,就可以滿足數據的採集、存儲、管理、展現和控制等需求。
參考資料:中關村-國家稅務系統與Oracle的解決之道
2. 「oracle 10g」中怎樣執行很長的sql語句呢
lv_sql clob;--很長長很長的字元串 4G ,記住太長不能後在plsql不能列印,不能to_char,只要執---行就可以了,想要看結果可以寫入一個表欄位位clob,再select查看。
X number; --聲明變數
BEGIN
x:=1; --給初值
FOR X IN REVERSE 1..10000 LOOP --reverse由大到小
lv_sql :=lv_sql || 'insert into testtable (aa) values(''111'')'|| ';';
END LOOP;
execute immediate lv_sql;
END;
---可以拼接可以很長很長,希望能幫到大家,然後點個贊,讓更多的人知道
3. 請教關於oracle資料庫的sql語句太長的問題
用子查詢代替in()裡面的數據
比如吧101,102.。。。放到一個表裡面去
select *from table where id in(select Id from 新建的表)
這樣也容易維護!!要是增加10*的時候就在新建的表裡面加入就可以了!!
4. 關於ORACLE中,動態SQL過長,調試時候不方便輸出的解決方案求助~!
create or replace procere (條件用到的變數 in varchar2,cursorname out ref cursor)
as
ref cursor cur1(條件用到的變數) is select * from table where 條件
定義你的變數
begin
open cur1(條件用到的變數);
end;
然後再調用這個過程.如果不用動態條件的話,直接用cursor類型。
5. Oracle執行插入SQL,執行報字元過長錯誤
1. select userenv('language') from al; 查詢的是當前會話的字元集,不一定是資料庫的字元集
2. 資料庫字元集用:select * from v$nls_parameters 來查詢
3. 可以如果都一樣的話,檢查兩個資料庫中,欄位長度是否一致。
6. 如何調整oracle中的sql語句輸入的最大長度
Oracle SQL 語句in長度不得超過1000
IN 子句中的LIST個數最長為1000,超過該數目將報錯,這里可轉用一個臨時表來解決;CREATE TRIGGER語句文本的字元長度不能超過32KB(觸發器中不能使用LONG, LONG RAW 類型;觸發器內可以參照LOB 類型列的列值,但不能通過 :NEW 修改LOB列中的數據;)順便說一下,觸發器中的PARENT關鍵字,只在嵌套表觸發器中有效,11G以前,DBMS_SQL對輸入的SQL長度不能超過32K,原因是輸入參數只能是VARCHAR2類型,11G後,可以用CLOB作為輸入參數,則取消了這個限制一個PL/SQL的包、過程、函數、觸發器的大小,在UNIX上最大是64K,而WINDOWS則是32K大小(32K這個應該不準,看下面的測試)SQL語句可以有多長?(網友說)ORACLE文檔說是64K,實際受一些工具的限制會較這個值低,但網友測試發現可以很長,甚至超過1M(我測試過 170K的都沒問題)。具體多長,10G也未說明,只是與很多環境有關:資料庫配置,磁碟空間,內存多少。。。
PL/SQL中,表達式/SQL本身的長度是可以達到比較長的長度(50K)左右,如:v_str:=:new.f1||:ndw.f2。。。 ; select :new.f1||:new.f2。。。 into v_str from al; 另外發現,如果這樣寫:v_str := 『a』||』b』||。。。則允許的表達式長度將大大的減少。如果表達式/SQL過長,超過了一個ORACLE包/過程允許的最大程序長度,則在編譯時報 pls-123:program too large錯誤,這是pl/sql編譯器本身的限製造成的,即表達式/SQL的長度在PL/SQL中受限於包/過程的最大大小=================================================Oracle Sql語句長度限制問題及解決
最近在寫Sql語句時,碰到兩個問題:
1)ORA-01795: maximum number of expressions in a list is 1000起因:寫出了這樣的sql語句:SELECT PALLET_ID,BOX_ID,STATUS FROM SD_CURRENT_BOX WHERE PALLET_ID IN('"+pallets+"');其中的pallets是有很多個pallet_id組合成的字元串。
分析:很顯然,根據錯誤提示可以知道:in 中items的限制 1000個。
解決:用子查詢來代替pallets長字串。
2)ORA-01704: string literal too long
起因:寫出了這樣的Sql語句:UPDATE PDM_MEMBERLIST SET MEMBERS='<Project> ... 此處略去n多串 <ProjectID>'.
分析:資料庫設計MEMBERS欄位為xmltype格式,數據存儲時候,是以字元串的形式存儲。這樣在xml數據量大的時候,造成sql語句過長,嘗過2k的限制。
解決:參數化sql語句。
==================================================參數化sql語句----防止sql注入攻擊(下)
上一篇寫的sql注入的基本原理,本來要接著寫這篇的,但是由於時間的原因一直沒有寫成,今天是五一假期,總算是能抽空寫寫了。
作為一個程序員,防範sql注入的第一線是由我們來守護的,只要我們在程序中留少許的漏洞,就會給程序增強安全特性。所以我們要做的是要寫安全的程序,防止sql注入在程序體現在不要拼接sql字元串,一定要參數化sql或者寫存儲過程,這里就說說簡單的參數化sql吧。
例子中用c#和Oracle實現,Java中或者其他資料庫中的實現也是類似的。
using System.Data.OracleClient;//引入oracle操作包//定義DML語句
string strSQL = @"select user.name from user where user.name =:userName";//上句中的:userName就是sql語句中參數的佔位符,也就是說在資料庫伺服器中執行這條sql語句的時候這個佔位符要被其他東西替換掉,到底用什麼東西替換呢,接著往下看OracleParameter[] param = {
new OracleParameter(":userName",txtName);}//這里定義一個參數的數組,裡面可以寫入多個sql參數,咱們的這里只有一個,所以就寫入一個參數,這里講佔位符和他的替換也就是參數值對應起來了,txtName就是佔位符的替換值,他是用戶界面中用戶輸入的值,就是他可能含有注入攻擊的字元,這下資料庫伺服器知道用什麼東西替換佔位符了。
定義好sql語句和參數後就是執行了,執行的時候需要同時將sql語句和參數傳入,這樣用戶輸入的帶有非法字元的字元串在資料庫會當作參數處理,而不會當作sql語句和資料庫自己的字元混亂,防止了注入攻擊。
OracleCommandcmd = new OracleCommand();
cmd.CommandText= strSQL;//定義oracle命令的文本內容for(oracleParameter p in param)//將參數傳入{
cmd.Parameters.Add(p);
}
cmd.ExecuteNonQuery();//執行命令
上面基本上是一個完整的參數化sql,不同的資料庫伺服器sql語句中參數的佔位符不同,上面用的是oracle,參數佔位符是冒號(:)加名字,在sqlserver中是用@符號加名字作為佔位符,而在MySQL中用問號(?)加名字來作為參數佔位符,不同的資料庫中參數的表示符號不一樣,這個需要注意。
防止sql注入攻擊(上)
Sql注入是一種入門極低破壞極大的攻擊方式。如果sql是用字元串拼接出來的話,那麼肯定會被注入攻擊,前段時間還傳出了某國外大型社交網站被SQL注入攻擊。
Sql注入攻擊的方式,來這里看的同志們應該很清楚了,就是在拼接字元串的時候,如果輸入的是帶單引號的,那麼輸入laf'or 1='1'--這樣就會逃避條件檢查,後面要是再跟一些shutdown,delete之類的條件,那麼損失基本算是毀滅性的了。前幾天單位開發的過程中我發現幾乎大家都不重視安全,一個寫代碼的人不注意安全只注意實現那麼寫出來的代碼在攻擊者眼前基本就是一個沒有穿衣服的美女。
下面是我一個開發人員的一些經驗,主要用來防止sql注入。
1、首先對運行sql的用戶賦予最小許可權,這個理論也是安全領域的最小特權理論,運行一個程序一定要用最小特權運行,所以不要給用戶服務DBA的許可權,限制要許可權之後可以防止一些毀滅性的攻擊,即使攻入了也不會shutdown修改表之類的。
2、一定不要使用字元串拼接的方式構造sql,必須使用參數化sql,存儲過程可以看作是參數sql,簡單的就直接構造參數化sql,復雜的就寫存儲過程,不過存儲過程中一定不要用字元串,我看有人在存儲過程用字元串,這樣還是不能避免被攻擊,並且在調試的時候非常麻煩。
3、嚴把輸入關,系統肯定是用來交互的,所有用戶輸入的這一關一定要把好,可以利用各種方式來檢驗用戶的輸入,讓輸入都是合法的;可以設敏感字元不讓用戶輸入,這個雖然不是很友好,不過對與安全有保證。在驗證的是可以用正則表達式或者程序驗證,不管用什麼方式只要把敏感字元和可疑字元拒之門外那麼就無法攻擊了,不過限制輸入還是有缺陷,在安全理論方面,只能確定合法,不能確定不合法,比如你在界面限制了合法的,那麼剩餘的都是不合法的,這時候輸入的肯定全部是合法的,如果你限制的是非法的,可是你能確保你限制的全是非法的?如果某一天發現一個非法的不再你限制之內那麼你就會被攻擊。
4、做好自己的檢驗和測試工作,自己可以進行sql注入攻擊,利用工具檢驗。
5、一定要養成具有安全意識的程序員,時刻想著安全。
這幾條之中最重要的是1和2,許可權限制一定要注意,不然會死的很慘的,第二就是程序員的習慣了,一定要用參數化sql和資料庫交互。
7. oracle sql語句太長無法執行
'一篇很長的文章' 這裡面指搏跡的內容很瞎銀伍多嗎??? 你可以將欄位改成 大欄位類型 CLOB 用磨或存儲過程來做
8. oracle 導出超長Clob欄位insert語句執行報欄位過長的問題解決方案
對於長度小於4000的字元串直接執行insert語句正常,但對於超過4000的就不能直蔽陵接執行了,會報字元串長度過長的錯。
通過一陣網路,我認可網上的這個說法:隱式轉換,oracle默認把含野字元串轉換成varchar2類型,而這個字元串的長度,又比4000大,所以會報ora-01704錯誤。說得通俗一點,就是兩個單引號之間的字元不能超過4000。
解談並喊決方案,對於過長的sql定義一個Clob變數,然後在sql中直接引用這個變數即可:
注意的是:如果只執行單條語句,最後的 "/" 符號 可以不加,如果後面還有DECLARE語句,"/"符號必須要加上。
使用這種方式,親測通過,祝好運!
9. 關於ORACLE中,動態SQL過長,調試時候不方便輸出的解決方案求助~!
create
or
replace
procere
(條件用到的變數核慧
in
varchar2,cursorname
out
ref
cursor)
as
ref
cursor
cur1(條件用到的變數)
is
select
*
from
table
where
條檔彎件
定義你的變數
begin
open
cur1(條件用到的變數);
end;
然後再調行氏悶用這個
過程
.如果不用
動態
條件的話,直接用cursor
類型
。