2010-05-24 96 views
1

參數參考我已經創建了在Oracle 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; 

這給了我一個錯誤,因爲它不能獲取一行。 如果WHERE fl.nome = nome; insted的我寫WHERE fl.nome = 'folder1'; - 它的工作原理。

我想我不會用正確的方法參數。 我該如何使用它?

+1

我看不出有什麼錯誤的語法,明智的。 'DESC FOLDER_TAB'的輸出是什麼?知道你得到的錯誤也會有所幫助。 – 2010-05-24 20:49:21

回答

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> 

...我可以查詢兩個個REF:

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與表格中的列匹配,所以它不檢查是否存在該名稱的參數。這就是爲什麼給這些參數一個明確的名字是個好主意。有意思的是,我傾向於使用P_作爲參數前綴的做法,所以不會出現與局部變量或對象名稱發生衝突的情況。

+0

因爲您將文件夾屬性命名爲「名稱」而不是「nome」。我解決了以不同名稱調用參數的問題。 所以現在看起來像fl.nome = nome2; 反正謝謝你。 – Gainder 2010-05-24 23:05:26

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;