2014-09-04 3 views
2

나는 매우 자동화되어야하는 오라클 프로 시저에서 작업 중이므로 동적 SQL을 사용하고 있습니다. 동적 SQL을 처음 사용했습니다.오라클 동적 SQL으로 고생

실행해야하는 SQL을 빌드하는 데 varchar2 변수를 사용하고 있습니다. 나는 생성되고있는 SQL을 캡처하는 DBMS_OUTPUT을 사용했습니다, 그리고 그것을 잘 실행 :

SQL은 INBOUND.BASKET_FCT 파티션에서 표 INBOUND.BASKET_CTAS_SWP COMPRESS를 쿼리 HIGH AS SELECT *를 만들 = (SYS_1234)를 바구니 스왑 테이블을 만들려면 ; 내가 이것을 사용하여 프로 시저를 실행할 때

그러나, 그것은

Execute MyProcedure; 

아래의 오류가 어떤지도 주셔서 감사 생성!

오라클 버전 : 오라클 데이터베이스 11g 엔터프라이즈 에디션 출시 11.2.0.3.0 - 64 비트 생산

IDE : 오라클 SQL 개발자 버전 4.0.2.15 빌드 15.21

코드 :

note: all variables set at beginning of procedure... 
Sqlexec:= 'CREATE TABLE ' || Basket_Swap_Schema || '.' || Basket_Swap_Table_Name || ' '; 
Sqlexec:= Sqlexec || 'COMPRESS FOR QUERY HIGH '; 
Sqlexec:= Sqlexec || 'AS SELECT * FROM ' || Basket_Source_Schema_Name || '.' || Basket_Source_Table_Name || ' '; 
Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 

Dbms_Output.Put_Line('sql to create Basket Swap table = ' || Sqlexec); 

Execute Immediate Sqlexec; 

오류 메시지 :

오류가 발생하는 줄 : 명령에서 1 - Process_Wic_Snap_Partition에게 오류 보고서를 실행 - ORA-00911을 : 잘못된 문자 ORA-06512 : "를 MY_SCHEMA.MY_PROCEDURE"에서, 라인 (102) ORA-06512 : 줄에 1 00911. 00000 - "잘못된 문자" * 원인 : 식별자 문자 및 숫자 이외의 ASCII 문자로 시작할 수 없습니다. 첫 번째 문자 뒤에 $ # _도 사용할 수 있습니다. 이중 인용 부호로 묶인 식별자는 이중 인용 부호 이외의 문자이면 을 포함 할 수 있습니다. 대체 인용 부호 (q '# ... #')은 공백, 탭 또는 캐리지 리턴을 구분 기호로 사용할 수 없습니다. 다른 모든 문맥에 대해서는 SQL 언어 Reference Manual을 참조하십시오.

답변

5

귀하의 문의는 괜찮지 만 DynamicSQL을 사용하면 명세서 마지막에 세미콜론을 사용할 수 없습니다. Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 줄 끝에 세미콜론을 넣지 말고 문장을 변경하십시오. Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';

+0

놀랍습니다. 정말 고마워 – Steve