2017-12-14 2 views
1

아래의 절차를 고려하십시오. 처리를 위해서는 어쨌든 모든 처리 단계를 거쳐야합니다. 그래서 내 질문은 :이 구문 분석 단계에서 'Select job_id from asfd' 여전히 문자열로 취급되고 EXECUTE IMMEDIATE의 실행 단계 'Select job_id from asfd'이 SQL 문으로 다시 구문 분석되는 동안? 내가 here에서 발견EXECUTE IMMEDIATE의 SQL 문은 런타임에 파싱됩니까?

CREATE OR REPLACE PROCEDURE test_ei 
IS 
BEGIN 
EXECUTE IMMEDIATE ‘select job_id from asfd’; //line 3 
END; 

한 설명은 asdf 테이블이 존재하지 않고 창자가 성공적으로 너무 'Select job_id from asfd'이 아직이 단계에서 문자열로 처리, 컴파일입니다. 어떤 수정도 부탁드립니다.

심지어 실제로 EXECUTE IMMEDIATE 'select * asfd';이 3 행에서 대체되는 경우에도 여전히 성공적으로 준수합니다. 그래서 위의 설명이 정확하다고 생각합니다.

+0

다른 단계에 대한 몇 가지 유용한 정보 : [링크] https://docs.oracle.com/cd/A57673_01/DOC/server/doc/A48506/sqlconce.htm – Anand

+1

예, 절차에 대한 구문 분석시에는 , 'asfd에서 job_id를 선택하십시오'는 ** 해석되지 않았으며 런타임시에만 구문 분석됩니다. –

답변

0

예. EXECUTE IMMEDIATE에서 런타임 엔진은 먼저 구문을 분석해야합니다. 즉 스키마 요소 (테이블, 열 등)의 이름을 바인드 할 수없는 이유는 다음과 같습니다.

자세한 내용 : 구문 분석 단계는 SQL.이 올 Y 르게 정의됩니다. PL/SQL은 :xyz의 값을 알 필요없이 다음 명령문이 유효 함을 알 수 있습니다.

'UPDATE emp SET sal = :xyz' 

그러나 다음 구문이 올바른지 PL/SQL이 어떻게 알 수 있습니까? 우리는 그렇게 할 수 없다.

'UPDATE emp SET :col_name = :xyz'