PL / SQL - 无法访问非嵌套表项的行

时间:2014-10-10 13:22:58

标签: sql oracle plsql casting

我正在尝试获取 my_table 的所有列名称,并希望使用 my_fn 将其设为字符串。例如,假设 my_table 包含名为"年" "月" "天" 即可。使用 all_tab_cols 表获取此列名称,并将其存储到 tmp 集合中。使用for-loop,我希望使用 my_fn 将这些列名称设为"月,年,日" 。目前,我收到以下错误。

错误日志 - 这是我收到的错误

SQL Error: ORA-22905: cannot access rows from a non-nested table item
22905. 00000 -  "cannot access rows from a non-nested table item"
*Cause:    attempt to access rows of an item whose type is not known at
           parse time or that is not of a nested table type
*Action:   use CAST to cast the item to a nested table type    

SQL CODE - 这是我的代码。

CREATE OR REPLACE TYPE col_array as table of varchar2(1000);
/
CREATE OR REPLACE FUNCTION my_fn (
    input_1 IN VARCHAR2,
    input_2 IN VARCHAR2,
    input_3 IN VARCHAR2) 
    RETURN varchar2 AS
      tmp col_array;
      txt varchar2(1000);

    BEGIN
    SELECT column_name bulk collect into tmp
    FROM all_tab_cols 
    where owner = 'me' and table_name ='my_table'; 

      for i in 1..tmp.count loop
        txt := txt || to_char( tmp(i) ) || ',';
      end loop;

    //txt := 'wow';

    RETURN txt;

    END my_fn;
/
SELECT * FROM TABLE(my_fn('','',''));

我也尝试了以下简单的代码,但仍然无法正常工作。我可能需要更多关于如何使用CAST功能的知识:(

BEGIN        
    txt := 'wow';    //or  txt := CAST('wow' as varchar2);         
RETURN txt;

非常感谢您的帮助!!

1 个答案:

答案 0 :(得分:6)

您的函数返回的字符串不是集合。你可以用

SELECT my_fn('','','') FROM dual;

获得价值。