2013-03-21 1 views
1

아래 코드 줄을 작성하여 PL/SQL Developer Tool에서 동일하게 실행했습니다.PL/SQL 프로그래밍 : 변수를 구별하기 위해 블록 레이블 사용

또한 Oracle 11g 데이터베이스에서 HR 스키마를 만들었습니다.

코드

CREATE TABLE employees2 AS SELECT last_name FROM employees; 
<<MAIN>> 
DECLARE 
last_name VARCHAR2(10) := 'King'; 
my_last_name VARCHAR2(10) := 'King'; 
BEGIN 

-- Deletes everyone, because both LAST_NAMEs refer to the column 
DELETE FROM employees2 WHERE last_name = last_name; 
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.'); 
ROLLBACK; 

-- OK, column and variable have different names 
DELETE FROM employees2 WHERE last_name = my_last_name; 
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.'); 
ROLLBACK; 

-- OK, block name specifies that 2nd LAST_NAME is a variable 
DELETE FROM employees2 WHERE last_name = main.last_name; 
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.'); 
ROLLBACK; 
END; 
/
DROP TABLE employees2; 

하지만

ORA-06550: line 4, column 0: 
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: 

    * & = - + ; </> at in is mod remainder not rem 
    <an exponent (**)> <> or != or ~= >= <= <> and or like like2 
    like4 likec between || multiset member submultiset 

아래와 같은 오류가 발생합니다 첫 번째 선언 문을 실행하는 동안 나는 아주 새로운 오전 나를 인도 해주십시오 PL/SQL 및 현재 자체를 학습 .

+0

당신이 라벨을 제거하고 그것을 실행 시도 해 봤나 :

주변의 유일한 작업은 다음과 같이 추가 beginend 블록을 추가하는 것 같다? – Rachcha

답변

0

코드가 좋으므로 클라이언트 문제라고 생각합니다.

PL/SQL Developer에는 여러 가지 종류의 창이 있습니다. 이러한 종류의 쿼리를 수행하려면 "명령 창"(SQL/Plus 프롬프트)을 사용해야합니다.

전체 스크립트를 실행해도 작동하지 않으면 각 명령문을 별도로 실행하십시오 ("SQL 창"에서는 코드 블록을 선택하고 선택 만 실행할 수 있음).

0

이것은 PL/SQL Developer 렉서 또는 구문 분석기의 버그입니다. 전체 블록을 또 다른 begin ... end; 안에 넣으면 해결할 수 있습니다.


SQL 창은 SQL과 PL/SQL 모두에서 작동하지만 두 문 유형은 서로 다른 문법을 사용합니다. 편집기 창에는 전체 구문 분석기가 필요하지 않습니다. 그러나 한 문장이 끝나고 또 다른 문장이 언제 시작되는지를 아는 문장에 대해 충분히 알고 있어야합니다. SQL 문을 시작하는 방법은 다양하고 PL/SQL 블록을 시작하는 방법은 거의 없습니다. 이 코드는 아마도 다음과 같은 분류 알고리즘을 사용합니다. "begin 또는 end으로 시작하는 경우 PL/SQL이고, 그렇지 않으면 SQL입니다." 프로그래머는 아마도 PL/SQL이 레이블로 시작한다는 것을 잊어 버렸을 것입니다. 파서가 SQL 문이라고 생각하기 때문에 첫 번째 세미콜론에서 멈 춥니 다.

당신은 오류보고가 첫 번째 세미콜론에 따라 문을 분할 있다고 아래 강조 할 수 있습니다

enter image description here

프랭크 슈미트의 생각은 일반적으로 좋은, 그리고 것은 이러한 종류의 문제를 해결. 그러나이 경우 명령 창이나 전체 식을 강조 표시하지 않아도 문제가 해결됩니다.

--Add extra begin/end to work around PL/SQL Developer parser bug. 
begin 
    <<main>> 
    declare 
     v_test number := 1; 
    begin 
     main.v_test := 1; 
    end; 
end; 
/