2010-05-24 2 views
1

필자는 ork 10g에 간단한 정적 함수를 작성하여 해당 pk를 기반으로하는 개체 참조를 가져 왔습니다.ORACLE : WHERE 절의 매개 변수 참조가 작동하지 않습니다.

STATIC FUNCTION getRef(nome IN VARCHAR2) 
RETURN REF folder_typ IS 

    fl_r REF folder_typ := null; 

BEGIN 

    SELECT REF(fl) 
    INTO fl_r 
    FROM folder_tab fl 
    WHERE fl.nome = nome; 

    RETURN fl_r; 

END getRef; 

이렇게하면 행을 가져올 수 없기 때문에 오류가 발생합니다. insted가 WHERE fl.nome = nome;이라면 WHERE fl.nome = 'folder1';이라고 쓰면 작동합니다.

나는 올바른 방법으로 매개 변수를 사용하지 않는다고 생각합니다. 어떻게 사용할 수 있습니까?

+1

나는 아무 잘못 구문이 많다는 표시되지 않습니다. 'DESC FOLDER_TAB'의 결과는 무엇입니까? 당신이 받고있는 오류를 아는 것도 도움이 될 것입니다. –

답변

3

이것은 범위 지정 문제입니다.

게시 한 항목에서 추정 한 나의 버전입니다. 매개 변수 이름은 속성 이름과 다릅니다. 이 테스트 데이터를 제공

create or replace type folder_t as object 
(name varchar2(128)) 
/

create table folders of folder_t 
/

create or replace function getRef 
    (nome in varchar2) 
    return ref folder_t 
is 
    fl_r REF folder_t; 
begin 
    select ref(fl) 
    into fl_r 
    from folders fl 
    where fl.name = nome; 

    return fl_r; 
end getRef; 
/

당신이 볼 수 있듯이, ...

SQL> insert into folders values (folder_t('temp')) 
    2/

1 row created. 

SQL> insert into folders values (folder_t('work')) 
    2/

1 row created. 

SQL> 

... 나는이 심판을 조회 할 수 있습니다 내가 기능을 변경하는 경우,

SQL> select getRef('temp') from dual 
    2/

GETREF('TEMP') 
-------------------------------------------------------------------------------- 
00002802091051432318864AF594741916D743E1291CF597373A4F4D7A93F159DA53A73FC0010372 
2D0000 


SQL> select getRef('work') from dual 
    2/

GETREF('WORK') 
-------------------------------------------------------------------------------- 
0000280209F31778C18D5740FBA0CB90929E1B6FBD1CF597373A4F4D7A93F159DA53A73FC0010372 
2D0001 


SQL> 

을하지만, 선언에서 매개 변수 이름이 속성 이름과 같으면 다음과 같이됩니다.

SQL> create or replace function getRef 
    2  (name in varchar2) 
    3  return ref folder_t 
    4 is 
    5  fl_r REF folder_t; 
    6 begin 
    7  select ref(fl) 
    8  into fl_r 
    9  from folders fl 
10  where fl.name = name; 
11 
12  return fl_r; 
13 end getRef; 
14/

Function created. 

SQL> select getRef('temp') from dual 
    2/

GETREF('TEMP') 
------------------------------------------------------------ 


SQL> 

SQL 엔진은 테이블의 범위를 바깥쪽에 적용합니다. 규정되지 않은 NAME은 테이블의 열과 일치하므로 해당 이름의 매개 변수도 있는지 확인하지 않습니다. 따라서 매개 변수에 별개의 이름을 지정하는 것이 좋습니다. Persoanlly 나는 파라미터 접두어를 P_으로 접두사로 사용하기를 선호합니다. 따라서 지역 변수 나 객체 이름과의 paremeter 충돌 가능성은 없습니다.

+0

폴더 속성 "name"을 "nome"이 아니기 때문에. 매개 변수를 다른 이름으로 호출하여 해결했습니다. 이제 fl.nome = nome2; 어쨌든 고마워, . – Gainder

0

모범 사례는 항상뿐만 아니라 테이블 별칭에서 사람들을 위해, 모든 변수의 범위를 제공하는 것입니다 :

FUNCTION getRef(nome IN VARCHAR2) 
RETURN REF folder_typ IS 
    fl_r REF folder_typ := null; 
BEGIN 

    SELECT REF(fl) 
    INTO fl_r 
    FROM folder_tab fl 
    WHERE fl.nome = getRef.nome; 

    RETURN fl_r; 
END getRef;