這是一個範圍問題。
這裏是我的版本的設置,從你貼什麼推斷的。請注意,參數名稱與屬性名稱不同。
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_
作爲參數前綴的做法,所以不會出現與局部變量或對象名稱發生衝突的情況。
來源
2010-05-24 21:01:45
APC
我看不出有什麼錯誤的語法,明智的。 'DESC FOLDER_TAB'的輸出是什麼?知道你得到的錯誤也會有所幫助。 – 2010-05-24 20:49:21