2012-10-03 4 views
2

Oracle 10g에서 Pro * C를 실행 중입니다.Oracle ProC INSERT INTO VALUES ((선택 ...)

insert 문 값 절 내에서 하위 쿼리를 수행하려고합니다. 이 SQL 쿼리는 완전히 유효하며 TOAD 내에서 문제없이 실행되지만 Pro * C는 쿼리를 구문 분석하지 못합니다.

(SELECT (CREATED_FLAG || DISPLAY_ID) from TARGET t where t.TARGET_ID = :targetID) ||**". 

프로 * C 컴파일러 작업을하고 모든 컴파일하고 예상대로 실행 :

EXEC SQL INSERT INTO TARGET_ATTACHMENT 
     (
      TARGET_ID 
      FILENAME 
    ) 
     VALUES ( 
     :targetID, 
     (SELECT CREATED_FLAG from TARGET t where t.TARGET_ID = :targetID) || '.tif' 
    ) 

나는 제거합니다.

제거하지 않을 경우 : Pro * C 컴파일러가 구문 오류를 발생시킵니다.

예 : 나는 프로 *의 C는 값 내에서 subquerys이 caluse 컴파일 할 수 있기를 기대로

1>Syntax error at line 128, column 12, file  d:\SVN\...\TA.pc: 
1>Error at line 128, column 12 in file d:\SVN\... 
1>...\TA.pc 
1>    (select CREATED_FLAG from target t where t.TARGET_ID = :targetID) 
1>...........1 
1>PCC-S-02201, Encountered the symbol "CREATED_FLAG" when expecting one of the fol 
1>lowing: 
1> () * + -/. @ | at, day, hour, minute, month, second, year, 

는 문제입니다.

INSERT into table1 (col1) values ((select t2.singleCol from table2 t2 where t2.priKey = :priKey)) 

Pro * C의 예상되는 동작입니까? 또는 values ​​절 내에서 하위 쿼리를 지원해야합니까?

(SELECT CREATED_FLAG || '.tif' from TARGET t where t.TARGET_ID = :targetID) 

나는 내가 하위 쿼리 당신이 시도했던 방법에 추가 뭔가를 본 것 같아요 :

답변

1

는 아마도 하위 쿼리로 변경합니다.

0

당신이 게시 한 코드는이 논리적으로 동일합니다 :

INSERT INTO TARGET_ATTACHMENT  
    (TARGET_ID , FILENAME)  
select :targetID, CREATED_FLAG|| '.tif' 
from TARGET t 
where t.TARGET_ID = :targetID) 

당신이 VALUES 절에서 스칼라 커서를 사용할 필요가 왜 특별한 이유가 있나요?

+0

하위 쿼리에서 추가 한 후에 어떤 내용이 손상되었는지 보여주기 위해 단순화 된 쿼리 만 표시합니다. 실제로 20 개 이상의 필드가 TARGET_ATTACHMENT 테이블에 삽입되며, 그 중 하나만 TARGET 테이블의 정보가 필요합니다. – user297500

1

정적 SQL 문에서 Pro * C 전 처리기가 구문 분석 할 수있는 SQL의 양은 매우 제한되어 있습니다. 예를 들어 명시 적으로 inner joiner/outer left join 등의 표기법을 구문 분석 할 수도 없습니다.

임시 해결책은 SQL 문이 실제로 동적이지 않더라도 동적 SQL 문을 준비하고 실행할 수 있습니다.