2014-06-23 3 views
0

저는이 주제 및 다른 포럼에서 대다수의 주제를 읽었지 만 여전히 문제가있는 곳을 찾을 수 없습니다. 여기에 내가 가진 무엇 : 나는 점점 계속PLS-00302. Unable to resolve

drop type RecordCount_tab; 
drop type RecordCount_obj; 

create type RecordCount_obj is object(Symbol varchar2(6), TimeFrame char(3), TotalCount number, minDate date, maxDate date); 
/

show errors; 
create type RecordCount_tab is table of RecordCount_obj; 
/

show errors; 

create or replace function RecordCount return RecordCount_tab is 
l_RecordCount_tab RecordCount_tab := RecordCount_tab(); 
tName varchar2(64); vMinDate date; vMaxDate date; vCount number; 
n integer :=0; 
BEGIN 
for r in (select table_name, substr(table_name,1,instr(table_name,'_')-1) as "BaseTable", substr(table_name,instr(table_name,'_')+1,length(table_name)-instr(table_name,'_')) as "TimeFrame" from user_tables) loop 
    dbms_output.put_line('select min(NewDateTime), max(NewDateTime), count(*) from '||r.table_name); 
    execute immediate 'select min(NewDateTime), max(NewDateTime), count(*) from '||r.table_name into vMinDate, vMaxDate, vCount; 
    n:=n+1; 
    l_RecordCount_tab(n) := (r.BaseTable, r.TimeFrame, vCount, vMinDate, vMaxDate); 
end loop; 
return l_RecordCount_tab; 
END; 
/

show errors; 

PLS-00302 : 구성 요소 'BASETABLE은'

를 선언해야하고 그 이유를 나는대로, 이해가 안 돼요 쿼리는 sqlplus에서 완벽하게 정상적으로 실행됩니다. 나는 또한 별칭을 제거하려고 노력했다.

무엇이 누락 되었습니까?

+0

주위에' "BaseTable"를 따옴표를 제거'그들에게 이름의 대소 문자를 구분하게 사용 (또는'r. "BaseTable"'을 사용하십시오). 식별자 관련 규칙은 설명서를 참조하십시오. http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements008.htm#SQLRF00223 –

답변

1

당신은 for의 필드 별칭 주위에 따옴표를 제거해야합니다 :

(select table_name 
    ,  substr(table_name,1,instr(table_name,'_')-1) BaseTable 
    ,  substr(table_name,instr(table_name,'_')+1,length(table_name)-instr(table_name,'_')) TimeFrame from user_tables 
) 

을 간체 예를 들어. 이 작품 :

begin 
    for r in (select 'x' d from dual) -- NO quotes 
    loop 
    dbms_output.put_line(r.d); -- NO quotes 
    end loop; 
end; 

를이하지 않는 동안 :

begin 
    for r in (select 'x' "d" from dual) -- double quotes 
    loop 
    dbms_output.put_line(r.d); -- NO quotes 
    end loop; 
end; 

을하지만 이것은 수행합니다

begin 
    for r in (select 'x' "d" from dual) -- double quotes 
    loop 
    dbms_output.put_line(r."d"); -- double quotes 
    end loop; 
end; 
+0

아야 ... 그게 전부입니다. 고마워 패트릭! – gcaglion

+0

나를 상기시켜 주신 Patrick에게 감사드립니다. 나는 참으로 새로운 ... – gcaglion