2017-11-11 80 views
1

我所試圖做的PL/SQL PLS-00208:標識符「類型」是不是合法的光標屬性

我想寫使用Dynamic SQL創建表的過程。

什麼問題

我收到以下錯誤,而編譯程序:

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/5  PL/SQL: Statement ignored 
4/80  PLS-00208: identifier 'TYPE' is not a legal cursor attribute 

步驟:

create or replace procedure createTab is 

    begin 
     EXECUTE IMMEDIATE 'create table thisYearCustomerNames (id ' || customer.id%type || ', name ' || 
                   customer.name%type || ', points ' || 
                   customer.points%type || ')'; 
    end; 
    /

客戶表

Name    Null?  Type 
----------------------------------------- 
ID    NOT NULL NUMBER(5) 
NAME       VARCHAR2(30) 
ADDRESS      VARCHAR2(40) 
POINTS   NOT NULL NUMBER(10) 
DATE_OF_JOINING    DATE 
GENDER      CHAR(1) 
+2

動態SQL很難寫,因爲它會將編譯錯誤轉化爲運行時錯誤。我建議你從編寫靜態SQL開始,並確保你有一個在SQL Developer中運行的有效語句(或者你使用的任何東西)。完成之後,您可以將其轉換爲動態代碼。 – APC

+0

我使用notepad ++代碼,並使用'@'運算符作爲文件在sql終端中運行它。這是一個好方法嗎?並非常感謝你的寶貴建議。再次感謝您花時間製作出這樣一個不錯的建議。會嘗試它。 – Ahtisham

+1

我認爲這是初學者的最佳方式。你手寫的SQL越多,學到的東西越多。太多的人從IDE開始,以犧牲理解爲代價讓他們產生幻覺。 – APC

回答

3

您正試圖創建一個表%type屬性,這是不允許的。

%TYPE屬性只允許作爲PL/SQL變量,並且在創建表時不能使用。

作爲每Oracle文檔,%TYPE

的%TYPE屬性可以聲明一個常數,變量,收集 元件,記錄字段,或子程序參數是相同的數據的 類型如先前聲明的變量或列

所以,如果你需要創建一個表具有相同的定義的Customer,沒有數據,使用Create table as select * 0行。

即,

create table thisYearCustomerNames AS SELECT id,name,points FROM customer where ROWNUM < 1; 

而你正在試圖將外EXECUTE IMMEDIATE...id ' || customer.id%type列名 - 這也不會奏效。這是合適的方式。

BEGIN 
    EXECUTE IMMEDIATE 'create table thisYearCustomerNames AS SELECT id,name,points 
    FROM customer where ROWNUM < 1'; 
END; 
+0

謝謝,這很容易。 :)和平與你同行bro:D – Ahtisham

+1

只需要添加,'%type'不是在運行時展開的標籤。它是PL/SQL編譯器的指令。 –