2012-03-08 4 views
4

... 적어도 그것이 문제라고 생각합니다.예약어 NUMBER이 (가) 커서 선언에 오류를 일으키는 열 이름으로 사용되었습니다

저는 열의 하나가 예약어 NUMBER (예, 알고 있습니다 ..) 인 테이블에 액세스하는 커서 선언을 포함하는 함수를 작성하고 있습니다. 함수는 컴파일시에 문제를 발생시킵니다.

오류 (16,10) : PL/SQL : ORA-06552 : PL/SQL : 컴파일 단위 분석이 종료되었습니다. ORA-06553 : PLS-488 : 유효하지 않은 변수 선언 : ,

CURSOR my_cur 
IS 
    SELECT "NUMBER", col2, col3 
    FROM tb1_x; 

그래도 문제가 있는지 확인하기 위해, 나는

CURSOR my_cur 
IS 
    SELECT 'NUMBER', 'col2', 'col3' 
    FROM dual; 

에 코드를 변경하고 확실히 컴파일 : 번호는 '

MY 코드가 같은 것을 보이는 유형 또는 하위 유형이어야합니다하지만 분명히 그것은 내가 원하는 것이 아닙니다.

불행히도, 난 (한숨) 열 이름을 변경할 수있는 옵션을 가지고 있지 않으며, 기록을 위해

SELECT "NUMBER", col2, col3 
    FROM tb1_x; 

정상적인 SQL 실행에서 확인을 작동합니다.

어쨌든이 문제를 해결할 수 있습니까? 어떤 도움을 많이 주시면 감사하겠습니다!

+0

여기에 빨대에서 파악 ...하지만 당신은'NUMBER'으로 "번호"를 선택하거나 '같은 NUMBER'' 또는 뭔가'으로 "번호"를 선택 시도? – gangreen

+0

@gangreen 나는 그것이 효과가 있다고 생각하지 않는다. 사실, tb1_x 테이블이 사용되는 한 사실상 커서 선언은 컴파일 타임에 실패 할 것이다. 심지어 범인 컬럼 "NUMBER"이 전혀 액세스되지 않고있다.아래처럼 실패 할 것이다 :'CURSOR my_cur IS SELECT col2, col3 FROM tb1_x; ' – alchn

+1

나는이 문제를 해결한다. 범인 테이블을 감싸기 위해 뷰를 생성하여 뷰에서 NBR으로 "NUMBER"컬럼의 이름을 변경합니다. 그런 다음 원래 표나 "NUMBER"를 언급하지 않고 NBR보기 및 열을 사용하여 커서를 선언 할 수 있습니다. 컴파일이 잘되어 잘 작동합니다. – alchn

답변

0
Create table temp2("number" integer); 
insert into temp2 values(1); 
insert into temp2 values(2); 
insert into temp2 values(3); 
commit; 

DECLARE 
TYPE v_cur IS REF CURSOR; 

cur  v_cur; 
v_temp INTEGER; 
BEGIN 
OPEN cur FOR 
    SELECT "number" 
    FROM temp2; 
FETCH cur 
INTO v_temp; 
DBMS_OUTPUT.put_line ('number is ' || v_temp); 
CLOSE cur; 

끝;

출력

번호 1

나는이 문제를 복제 할 수 없습니다,하지만이 나를 위해 workign 괜찮

+0

@ thisis 또한 프로 시저 또는 함수를 만들 때 컴파일됩니다. –

1
우리는 또한 레코드를 만들뿐만 아니라 수 있습니다

커서에서 데이터를 사용합니다. 커서는 커서를 사용합니다.

Create table temp2("number" integer,id integer,name varchar2(200)); 
insert into temp2 values(1,1,'Gaurav Soni'); 
insert into temp2 values(2,2,'Niharika Saraf'); 
Commit; 


DECLARE 
    type abc is record(
    "number" number, 
    id  NUMBER, 
    name  varchar2(200)); 

v_rec abc; 
TYPE v_cur IS REF CURSOR; 

cur v_cur; 
v_temp INTEGER; 
BEGIN 
    OPEN cur FOR 
    SELECT "number", id, name FROM temp2; 
LOOP 
    FETCH cur INTO v_rec; 
    EXIT when cur%notfound; 

    DBMS_OUTPUT.put_line('number is ' || v_rec."number"); 
    DBMS_OUTPUT.put_line('id is ' || v_rec.id); 
    DBMS_OUTPUT.put_line('name is ' || v_rec.name); 

    end loop; 
CLOSE cur; 

end; 

출력

number is 1 
id is 1 
name is Gaurav Soni 
number is 2 
id is 2 
name is Niharika Saraf 
0

흠. Cursor 선언의 구조는 약간 다릅니다. 이것을 시도해 볼 수 있습니까?

drop table temp2; 
Create table temp2("NUMBER" integer); 
insert into temp2 values(1); 
Commit; 

CREATE OR REPLACE FUNCTION func1 
RETURN VARCHAR2 
IS 
    l_dummy VARCHAR2(10) := ''; 

CURSOR cur1 IS 
    SELECT * FROM temp2; 

BEGIN  
    FOR a_rec IN cur1 
    LOOP 
     l_dummy := 'dummy';  
    END LOOP; 

    RETURN l_dummy; 

END func1; 
/
SHOW ERRORS; 

위의 적중 오류. 제 2 행을 편집하여 컴파일 된 예약어를 제거하십시오. BTW Oracle 10.2 db에 연결하는 Oracle SQL Developer 클라이언트를 사용하고 있습니다.

Create table temp2("NUMBERxxx" integer);