2013-02-15 88 views
0

最近,我已經開始準備定期報告過程的數據市場,並嘗試使用帶參數的過程。使用循環和立即執行的過程

所以我讀了this guideline並試圖複製,但在編譯時遇到了錯誤。

這裏是我的代碼:

create or replace procedure mig_rate @rep_date date AS 
    create or replace table mig_temp1(
    report_date date, 
    portfolio string, 
    bucket integer, 
    Q integer); 
begin  
    for j in 1..7 loop 
     for t in 0..32 loop 
     -- execute immediate 'bla-bla-bla insert statement mig_temp1 
     end loop; 
    end loop; 
end 

這導致PLS-00103@符號是出乎意料的。

語法有什麼問題,我該如何將參數放入過程?

回答

0

最主要的錯誤是您嘗試在Oracle數據庫中使用SQL Server語法。

首先,甲骨文object names have to start with a letter(除非你使用帶引號的標識符,但請不要)和......嗯,這裏有相關部分:

不帶引號的標識符必須從 字母開頭您數據庫字符集。帶引號的標識符可以以任何 字符開頭。

非引用標識符只能包含 數據庫字符集和下劃線(_),美元符號($), 和井號(#)中的字母數字字符。數據庫鏈接還可以包含句點(。)和「at」(@)處的 。 Oracle強烈建議您不要使用$和# 非引用標識符。

引用的標識符可以包含任何字符和標點符號 以及空格。但是,引號和非引號標識符 都不能包含雙引號或空字符(\ 0)。

...所以你根本不能在程序名中使用@,並且不需要這樣做,因爲這是SQL Server的東西(我想我不使用它!)。

編輯:看到我對SQL Server非常陌生,我誤解了它在做什麼。你的程序名稱是可以的,但這不是你聲明參數的方式;它應該開始:

create or replace procedure mig_rate(rep_date date) as 
... 

其次,你不能Oracle過程中創建(申報嗎?)那樣的表​​。看起來你在過程期間想要一個臨時表,但這不是Oracle的工作方式;您可以在過程外部創建全局臨時表,但它是永久數據庫對象 - 只有數據是臨時的。

您可以使用PL/SQL collection來代替它,但它取決於您想要用它做什麼。如果在插入普通表之前它是一個臨時區域,那麼您可以將其作爲單個SQL命令來執行,該命令的執行效果會更好。

我不確定你爲什麼想在這裏使用動態SQL(execute immediate)...

請參閱PL/SQL language reference和Oracle特定的網站,而不是SQL Server特定的網站,瞭解做什麼;他們的工作方式有很大差異。

+0

Alex!大感謝您的回答,我已經離開了while.I我要學習你的鏈接,然後可能我會想出一些新的問題!) 我想用執行mmediate的原因是表我引用有像X_1,X_2列名,X_3 ......所以我想遍歷他們在「爲噸0..32循環」 – user2074685 2013-02-26 06:14:38