當前位置:首頁 » 編程軟體 » 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 瀏覽:645
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:936
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:632
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:821
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:731
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1066
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:299
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:160
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:851
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:763