2013-04-10 65 views
0

以下過程已成功編譯。但是,當我嘗試運行它的錯誤。在oracle中執行變量

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS 
VARIABLE1 VARCHAR2(2000); 
BEGIN 
VARIABLE1:='DECLARE A TIMESTAMP:=LOCALTIMESTAMP; 
CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW 
    (ROW_ID NUMBER(10),DIVISION VARCHAR2(256),OUTLET VARCHAR2(256),CLASS VARCHAR2(256));'; 

EXECUTE IMMEDIATE VARIABLE1; 
END; 

錯誤是:

6550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

你能幫助我,什麼是錯的這個。

+0

爲什麼要在這個動態SQL中聲明一些東西? – 2013-04-10 18:00:56

回答

0

動態創建全局臨時表很奇怪。無論如何,我認爲這是一個學習鍛鍊的一部分...

試試這個:

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS 
    VARIABLE1 VARCHAR2(2000); 
BEGIN 
    VARIABLE1:='DECLARE A TIMESTAMP:=LOCALTIMESTAMP; 
       BEGIN 
       CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW 
       (ROW_ID NUMBER(10), 
       DIVISION VARCHAR2(256), 
       OUTLET VARCHAR2(256), 
       CLASS VARCHAR2(256)); 
       END'; 

    EXECUTE IMMEDIATE VARIABLE1; 
END; 
+1

如果目標是使用動態PL/SQL,則動態PL/SQL塊內的CREATE TABLE語句必須使用動態SQL。一個被謎團包圍的謎團,爲什麼有人會想要這樣的野獸...... – 2013-04-10 18:03:51

+0

需求就是這樣,動態查詢將追加到變量,直到過程結束。之後需要執行該變量。從SQL服務器遷移的邏輯,其中我動態地創建了一個臨時表,並且最終需要執行。 – user1990383 2013-04-10 18:08:37

+0

@ user1990383 - 你知道Oracle中的臨時表是完全不同的,對吧? Oracle中的臨時表對所有會話均可見。 Oracle中的臨時表只創建一次。它沒有會話級範圍,或者像在SQL Server中一樣在Oracle中自動刪除。天真地將代碼從SQL Server移植到Oracle將導致一個痛苦的世界。 – 2013-04-10 18:10:11

0

有什麼不對的是,你幾乎肯定不應該在運行時創建表和你差不多當然不應該使用動態PL/SQL,而且實際上,確實不應該在動態PL/SQL塊內動態創建表。

如果您完全確定要這樣做,則CREATE TABLE語句本身需要在動態PL/SQL塊中使用動態SQL。如果我有我所有的報價正確轉義,你最終像這樣的東西

CREATE OR REPLACE PROCEDURE SAMPLE_PROCEDURE 
AS 
    VARIABLE1 VARCHAR2(2000); 
BEGIN 
    VARIABLE1:='DECLARE 
       A TIMESTAMP:=LOCALTIMESTAMP; 
       BEGIN 
       EXECUTE IMMEDIATE ''CREATE GLOBAL TEMPORARY TABLE TEMP_BWXROW 
            (ROW_ID NUMBER(10), 
            DIVISION VARCHAR2(256), 
            OUTLET VARCHAR2(256), 
            CLASS VARCHAR2(256))''; 
       END;'; 

    EXECUTE IMMEDIATE VARIABLE1; 
END; 

要是遇到一段代碼排在我的系統之一,這樣做,雖然,我將有一個非常與原始開發人員進行了強烈的措辭對話,以瞭解他們認爲任何問題都迫使PL/SQL執行一個動態的PL/SQL塊,該塊本身執行一個動態的SQL語句。

+0

終止';''在'end'後面? – 2013-04-10 18:12:16

+0

@EgorSkriptunoff - 是的,我錯過了。 – 2013-04-10 18:14:57

+0

「創建GTT」動態SQL不能有最終的';'。 – 2013-04-10 18:23:53