hive編譯存儲過程不報錯
① 寫了個存儲過程,編譯的時候通過了,執行的時候報錯 提示execute immediate語句無效
create or replace procere pro_t is
cursor c is
select table_name
from user_all_tables
where table_name in (select table_name
from user_tab_columns
where column_name = 'POSITION_ID');
tablename varchar2(100);
strinsert varchar2(1000);
begin
open c;
loop
fetch c
into tablename;
exit when c%notfound;--你之前沒有循環退出條件
strinsert:= 'update '|| tablename ||' set POSITION_ID =1' ;--之前sql語句拼的有問題
execute immediate strinsert;
end loop;
commit;
close c;
end;
② 存儲過程 編譯錯誤 show error 沒有錯誤
insert into supermarket.sales_goods("TIME","BAR_CODE","PRICE","NUM")
這里為何要加 引號
③ Oracle 存儲過程不能執行 但是不報錯
無效狀態有兩種可能,一種是你的存儲過程編輯沒有成功,創建了,但裡面有語法錯誤。
還有一種是存儲過程使用的表有結構上的改變,需要重新編譯一下。
你重新編譯一下,如果不成功,就是有語法問題,你需要修改存儲過程。
④ hive底層依賴hadoop中的哪些框架
1. 什麼是hive
•Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。
•本質是將HQL轉換為MapRece程序
2. 為什麼使用hive
•操作介面採用類SQL語法,提供快速開發的能力
•避免了去寫MapRece,減少開發人員的學習成本
•擴展功能很方便
3. hive 特點
•可擴展
Hive可以自由的擴展集群的規模,一般情況下不需要重啟服務
•延展性
Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數
•容錯
良好的容錯性,節點出現問題SQL仍可完成執行
4. hive 與hadoop 關系
發出HQL —> hive 轉換成maprece—> maprece—> 對hdfs進行操作
5. hive 與傳統數據對比
Hive
RDBMS
查詢語言
HQL
SQL
數據存儲
HDFS
Raw Device or Local FS
執行
MapRece
Excutor
執行延遲
高
低
處理數據規模
大
小
索引
0.8版本後加入點陣圖索引
有復雜的索引
6. hive 的未來
•增加更多類似傳統資料庫的功能,如存儲過程
•提高轉換成的MapRece性能
•擁有真正的數據倉庫的能力
•UI部分加強
Hive是基於Hadoop平台的,它提供了類似SQL一樣的查詢語言HQL。有了Hive,如果使用過SQL語言,並且不理解Hadoop MapRece運行原理,也就無法通過編程來實現MR,但是你仍然可以很容易地編寫出特定查詢分析的HQL語句,通過使用類似SQL的語法,將HQL查詢語句提交Hive系統執行查詢分析,最終Hive會幫你轉換成底層Hadoop能夠理解的MR Job。
對於最基本的HQL查詢我們不再累述,這里主要說明Hive中進行統計分析時使用到的JOIN操作。在說明Hive JOIN之前,我們先簡單說明一下,Hadoop執行MR Job的基本過程(運行機制),能更好的幫助我們理解HQL轉換到底層的MR Job後是如何執行的。我們重點說明MapRece執行過程中,從Map端到Rece端這個過程(Shuffle)的執行情況,如圖所示(來自《Hadoop: The Definitive Guide》)
基本執行過程,描述如下:
- 一個InputSplit輸入到map,會運行我們實現的Mapper的處理邏輯,對數據進行映射操作。
- map輸出時,會首先將輸出中間結果寫入到map自帶的buffer中(buffer默認大小為100M,可以通過io.sort.mb配置)。
- map自帶的buffer使用容量達到一定門限(默認0.80或80%,可以通過io.sort.spill.percent配置),一個後台線程會准備將buffer中的數據寫入到磁碟。
- 這個後台線程在將buffer中數據寫入磁碟之前,會首先將buffer中的數據進行partition(分區,partition數為Recer的個數),對於每個的數據會基於Key進行一個in-memory排序。
- 排序後,會檢查是否配置了Combiner,如果配置了則直接作用到已排序的每個partition的數據上,對map輸出進行化簡壓縮(這樣寫入磁碟的數據量就會減少,降低I/O操作開銷)。
- 現在可以將經過處理的buffer中的數據寫入磁碟,生成一個文件(每次buffer容量達到設置的門限,都會對應著一個寫入到磁碟的文件)。
- map任務結束之前,會對輸出的多個文件進行合並操作,合並成一個文件(若map輸出至少3個文件,在多個文件合並後寫入之前,如果配置了Combiner,則會運行來化簡壓縮輸出的數據,文件個數可以通過min.num.splits.for.combine配置;如果指定了壓縮map輸出,這里會根據配置對數據進行壓縮寫入磁碟),這個文件仍然保持partition和排序的狀態。
- rece階段,每個rece任務開始從多個map上拷貝屬於自己partition(map階段已經做好partition,而且每個rece任務知道應該拷貝哪個partition;拷貝過程是在不同節點之間,Recer上拷貝線程基於HTTP來通過網路傳輸數據)。
- 每個rece任務拷貝的map任務結果的指定partition,也是先將數據放入到自帶的一個buffer中(buffer默認大小為Heap內存的70%,可以通過mapred.job.shuffle.input.buffer.percent配置),如果配置了map結果進行壓縮,則這時要先將數據解壓縮後放入buffer中。
- rece自帶的buffer使用容量達到一定門限(默認0.66或66%,可以通過mapred.job.shuffle.merge.percent配置),或者buffer中存放的map的輸出的數量達到一定門限(默認1000,可以通過mapred.inmem.merge.threshold配置),buffer中的數據將會被寫入到磁碟中。
- 在將buffer中多個map輸出合並寫入磁碟之前,如果設置了Combiner,則會化簡壓縮合並的map輸出。
- 當屬於該recer的map輸出全部拷貝完成,則會在recer上生成多個文件,這時開始執行合並操作,並保持每個map輸出數據中Key的有序性,將多個文件合並成一個文件(在rece端可能存在buffer和磁碟上都有數據的情況,這樣在buffer中的數據可以減少一定量的I/O寫入操作開銷)。
- 最後,執行rece階段,運行我們實現的Recer中化簡邏輯,最終將結果直接輸出到HDFS中(因為Recer運行在DataNode上,輸出結果的第一個replica直接在存儲在本地節點上)。
通過上面的描述我們看到,在MR執行過程中,存在Shuffle過程的MR需要在網路中的節點之間(Mapper節點和Recer節點)拷貝數據,如果傳輸的數據量很大會造成一定的網路開銷。而且,Map端和Rece端都會通過一個特定的buffer來在內存中臨時緩存數據,如果無法根據實際應用場景中數據的規模來使用Hive,尤其是執行表的JOIN操作,有可能很浪費資源,降低了系統處理任務的效率,還可能因為內存不足造成OOME問題,導致計算任務失敗。
下面,我們說明Hive中的JOIN操作,針對不同的JOIN方式,應該如何來實現和優化:
生成一個MR Job
多表連接,如果多個表中每個表都使用同一個列進行連接(出現在JOIN子句中),則只會生成一個MR Job,例如:
1 SELECTa.val, b.val, c.valFROMaJOINbON(a.key= b.key1)JOINcON(c.key= b.key1)
三個表a、b、c都分別使用了同一個欄位進行連接,亦即同一個欄位同時出現在兩個JOIN子句中,從而只生成一個MR Job。
生成多個MR Job
多表連接,如果多表中,其中存在一個表使用了至少2個欄位進行連接(同一個表的至少2個列出現在JOIN子句中),則會至少生成2個MR Job,例如:
1 SELECTa.val, b.val, c.valFROMaJOINbON(a.key= b.key1)JOINcON(c.key= b.key2)
三個表基於2個欄位進行連接,這兩個欄位b.key1和b.key2同時出現在b表中。連接的過程是這樣的:首先a和b表基於a.key和b.key1進行連接,對應著第一個MR Job;表a和b連接的結果,再和c進行連接,對應著第二個MR Job。
⑤ 關於sqlserver存儲過程的編譯的問題
只編譯一次。
在發布存儲過程時就編譯一次,頁面上只要調用就可以,兩次打開就是調用兩次存儲過程
⑥ 資料庫存儲過程編譯出錯
可用第三方工具檢查錯誤。
如以下存儲過程:

⑦ oralce 存儲過程編譯時不會出現紅叉但在執行一段時間後總是會出現紅叉
這是由於有些資料庫對象可能被你變更了,比如表結構某個欄位改變了類型,刪除了一下欄位,可能對你程序本身並沒有影響,但是存儲過程會認為你這需要重新編譯,才能夠運行。。
⑧ 我寫了一個存儲過程,編譯通過,可是一測試就報錯,不知道為什麼實在是不會改,
應該是jestr這個地方報錯了,jestr是字元型的,所以f47和這個拼接的格式應該是f47||'123'這樣的形式,所以把jestr這個變數轉化後,缺少了單引號。後邊的f1欄位應該也是字元型吧,也是同樣的問題。
另外還發現有一個問題,oracle裡面,沒有UPDATE ... SET ... FROM 這樣的語法,這個是SQLSERVER的語法。
EXECUTE immediate ('update T_zfjz_57g_ffb set f47=f47||'''||jestr||''' where exists (select 1 from T_zfjz_57g_hmc where T_zfjz_57g_hmc.F1=T_zfjz_57g_ffb.f2 ) and T_zfjz_57g_ffb.f1= '''||idstr||' '||wqg||'''');
⑨ 存儲過程一直報錯 但是編譯成功了 也沒有錯 調用時一直不成功報錯
下面是問題:
Oraclede 環境中,客戶那邊提出,執行存儲過程時出錯,信息:DBCustomException: ORA-00900: invalid SQL statement
關於這個問題之前也遇到過,一直找不到原因,沒解決,時好時壞,,由於客戶大部分是SQL Server,也就沒太在意,現在終於麻煩來了。
我用自己創建的用戶,通過P/L SQL 登陸,執行以下語句
--創建表
create table ttt
(
aa varchar(20)
)
--創建存儲過程
CREATE OR REPLACE PROCEDURE myproc
AS BEGIN
select * from ttt;
END
--執行
exec myproc
執行存儲過程時,開始報錯:ORA-00900:無效SQL語句 (上面那個錯誤的中文版-_-!)
這時候看右邊的存儲過程如下,有個紅叉,
⑩ 這個存儲過程哪兒犯錯了,編譯成功了,但執行不來,Test也沒報錯
你把 if startdate is not null and enddate is not null then 這句改了 改成
if (length(startdate) != 0) and (length(enddate) != 0) then
