當前位置:首頁 » 編程軟體 » hive編譯存儲過程不報錯

hive編譯存儲過程不報錯

發布時間: 2022-06-13 19:03:55

① 寫了個存儲過程,編譯的時候通過了,執行的時候報錯 提示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

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:1469
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:1731
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:1471
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:1594
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:1438
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1843
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:1013
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:938
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:1572
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:1714