2013-03-21 5 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

저스틴 동굴 ... 감사합니다 ... 선언 구역에 변수를 정의하여 오류를 해결했습니다. 하지만 지금은 아닌 상수 표현 피벗에 대한 unpivot 값을 허용하지 않는 오류가 있습니다 .... 나를 도와 줄 수 plz .. Logged – user1990383