2013-03-21 193 views
0

任何人都可以幫助我找出錯誤。立即執行

create or replace procedure sample 
is 
begin 
    DECLARE AGG_COLUMNS VARCHAR2(2000); 
     BEGIN 
     EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS; 
     END; 
begin 
    EXECUTE IMMEDIATE  
     'CREATE TABLE NEW_BW_COLUMN_ROW_CELL_JOIN AS 
     (
      SELECT * 
      FROM BW_COLUMN_ROW_CELL_JOIN 
      PIVOT 
      (
      MAX(STRING_VALUE) 
      FOR COLUMN_NAME IN ('||AGG_COLUMNS||')))'; 
    END; 
end; 

Error(9,5): PL/SQL: Statement ignored 

Error(17,36): PLS-00201: identifier 'AGG_COLUMNS' must be declared 

由於

回答

0

立即錯誤是局部變量AGG_COLUMNS在第一嵌套PL/SQL塊被聲明。這意味着只要第一個嵌套塊完成,它就會超出範圍。因此,您不能在第二個嵌套的PL/SQL塊中使用它。你可以通過在你的過程的聲明部分聲明局部變量來解決這個問題。您還可以擺脫嵌套的PL/SQL塊

create or replace procedure sample 
is 
    AGG_COLUMNS VARCHAR2(2000); 
begin 
    EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS; 
    EXECUTE IMMEDIATE  
     'CREATE TABLE NEW_BW_COLUMN_ROW_CELL_JOIN AS 
     (
      SELECT * 
      FROM BW_COLUMN_ROW_CELL_JOIN 
      PIVOT 
      (
      MAX(STRING_VALUE) 
      FOR COLUMN_NAME IN ('||AGG_COLUMNS||')))'; 
end; 

這應該會消除立即編譯錯誤。不過,我不確定這是否能解決您的所有問題。

  • COLUMN_NAMES不是默認Oracle安裝中的表。這必須是您爲了使代碼運行而創建的。
  • 如果您確實創建了COLUMN_NAMES表,並且COLUMNS存儲逗號分隔的字符串,則不需要使用動態SQL來查詢表。你可以做一個簡單的SELECT ... INTO
+0

Justin Cave ...謝謝......我通過在聲明部分定義了一個變量來解決了一個錯誤。但現在我有像non-constant表達式的錯誤不允許用於pivot | unpivot values .... can u plz help me .. – user1990383 2013-03-22 04:44:07