2012-07-02 2 views
0

오라클 PL/SQL에서, 나는이 코딩을 가지고, 그것은 complier 오류를 제공합니다. 왜 모든 걸 가지고있는 것 같아, 모르겠다. ...Oracle PL/SQL이 구문 오류를 찾는 방법은 무엇입니까?

도와주세요.

감사

ORA-06550: line 6, column 5: 
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: 

    (begin case declare end exit for goto if loop mod null 
    pragma raise return select update while with <an identifier> 
    <a double-quoted delimited-identifier> <a bind variable> << 
    continue close current delete fetch lock insert open rollback 
    savepoint set sql execute commit forall merge pipe purge 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

코드

begin 
    for c in (select id from tmp_A) 
    loop 
    dbms_output.put_line(c.id); 

    create table tmp_c as 
    select B.name from tmp_B B where B.id = c.id; 

    drop table tmp_c; 
    end loop; 
end; 
/
+2

왜 런타임에 테이블을 생성 하시겠습니까? 오라클에서는 이것이 필요하고 사람들이 이와 같은 코드를 작성하는 대다수의 경우에는 매우 드뭅니다. 이는 오류입니다. –

+0

복잡한 상관 관계가있는 하위 쿼리가 있으므로 이해하기 쉬운 작은 조각으로 나누고 싶습니다. – user595234

+1

런타임시 테이블을 만드는 것이 현명한 이유는 아닌 것 같습니다. 동적 SQL을 사용한다고해서 코드를 더 쉽게 이해할 수는 없습니다. 여러 세션이 동일한 코드를 성공적으로 호출하는 것을 방지합니다 (동적으로 생성 한 테이블은 모든 세션에 즉시 표시됨). 잠재적으로 프로 시저 외부에 하나의 전역 임시 테이블을 만든 다음 코드에서 해당 임시 테이블에 삽입하려고하지만이 경우에도 매우 드뭅니다. 코드를 이해하기 쉽게 분할하려면 모듈 형 함수 및 절차를 사용하십시오. –

답변

3

당신이 DDL 문에서도 호출 할 수 없습니다 직접 PL/SQL에서 (DROP, ALTER 등을 CREATE)입니다. 당신은, 그러나 즉시 문을 실행할 수 있습니다 :

begin 
    EXECUTE IMMEDIATE 'CREATE TABLE MYTABLE(DT DATE)'; 
end; 

참조 :

http://www.orafaq.com/wiki/PL/SQL_FAQ#Can_one_call_DDL_statements_from_PL.2FSQL.3F 
+0

감사합니다. 당신이 올바른지. 왜 그런지 알아? – user595234

+0

@ user595234 - 개체를 동적으로 생성하면 안됩니다. 일반 코드 경로의 일부로 객체를 생성하는 것이 합리적이었던 유스 케이스가 있었다면, 오라클은 동적 객체를 참조 할 때마다 동적 SQL을 사용하도록 강요하는 대신 시간을 투자 할 수있었습니다. 그러나 실제로 그러한 유스 케이스는 없기 때문에 특히 쉽게 사용할 수있는 복잡성을 추가 할 필요가 없습니다. –

+0

여기에 하나의 답변이 있습니다 : http://www.toadworld.com/Blogs/tabid/67/EntryId/549/Why-cant-I-execute-DDL-natively-in-PL-SQL.aspx – DCookie

관련 문제