2012-07-02 43 views
0

在Oracle PL/SQL中,我有這種編碼,它給了我編譯器錯誤。我不知道爲什麼,看起來像我擁有一切......Oracle PL/SQL如何找到這個語法錯誤?

請幫忙。

感謝

ORA-06550: line 6, column 5: 
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: 

    (begin case declare end exit for goto if loop mod null 
    pragma raise return select update while with <an identifier> 
    <a double-quoted delimited-identifier> <a bind variable> << 
    continue close current delete fetch lock insert open rollback 
    savepoint set sql execute commit forall merge pipe purge 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

代碼是

begin 
    for c in (select id from tmp_A) 
    loop 
    dbms_output.put_line(c.id); 

    create table tmp_c as 
    select B.name from tmp_B B where B.id = c.id; 

    drop table tmp_c; 
    end loop; 
end; 
/
+2

爲什麼要在運行時創建一個表?在Oracle中這是非常罕見的,因爲這是必要的,絕大多數人都是這樣寫代碼的,這是一個錯誤。 –

+0

我有一個複雜的相關子查詢,我想把它分成易於理解的小塊。 – user595234

+1

這似乎不是在運行時創建表的合理理由。訴諸動態SQL不會讓你的代碼更易於理解。它會阻止多個會話成功調用相同的代碼(動態創建的表對所有會話都立即可見)。有可能,您可能希望在您的過程之外創建一個全局臨時表,然後在代碼中插入該臨時表中,但即使這種情況非常不尋常。如果您想將代碼分成易於理解的部分,請使用模塊化功能和過程。 –

回答

3

你不能叫DDL statments直接(CREATE,DROP,ALTER等)在PL/SQL。 你可以,但是使用立即執行的語句:

begin 
    EXECUTE IMMEDIATE 'CREATE TABLE MYTABLE(DT DATE)'; 
end; 

參見:

http://www.orafaq.com/wiki/PL/SQL_FAQ#Can_one_call_DDL_statements_from_PL.2FSQL.3F 
+0

謝謝。你是對的。你知道爲什麼嗎 ? – user595234

+0

@ user595234 - 因爲您不應該動態創建對象。如果有些用例將對象創建爲普通代碼路徑的一部分是有意義的,那麼Oracle可能會投入時間使其更容易,而不是每次引用動態對象時都強迫您使用動態SQL。但是,由於實際上並沒有這種用例,所以增加複雜性使其變得非常簡單並不值得。 –

+0

下面是一個答案:http://www.toadworld.com/Blogs/tabid/67/EntryId/549/Why-cant-I-execute-DDL-natively-in-PL-SQL.aspx – DCookie