2013-06-20 3 views
2

Как бы вы создали функцию в Oracle, которая имеет таблицу в качестве входного параметра и возвращает строку? Вот моя попытка, но возвращает ошибку:Oracle с таблицей в качестве входного параметра

create or replace type temp_table as object (col_name varchar(100)); 
/
create or replace type col_table as TABLE of temp_table; 
/
create or replace FUNCTION COLUMN_HEADERS 
    (col_name in col_table) 
    RETURN VARCHAR2 
is 
    return_string VARCHAR2(4096); 
BEGIN 
    return_string := ''; 
    for i in 1 .. col_name.count loop 
    return_string := return_string || ' ''' || col_name(i) || ''' as ' || regexp_replace(col_name(i), '[ \+]', '_'); 
    if i < col_name.count then 
     return_string := return_string || ','; 
    end if; 
    end loop; 
    RETURN return_string; 
END; 

я получаю следующее:

Error(9,9): PL/SQL: Statement ignored 
Error(9,26): PLS-00306: wrong number or types of arguments in call to '||' 

который указывает на этой линии:

return_string := return_string || ' ''' || col_name(i) || ''' as ' || regexp_replace(col_name(i), '[ \+]', '_'); 

Я думаю, что col_name (я) не возвращает строку, но с использованием VALUE() или TO_CHAR() дает мне другие ошибки. Кто-нибудь знает, как отладить это?

ответ

2

Когда вы ссылаетесь на индекс в таблице, используя col_name(i), вам также необходимо ссылаться на свойство объекта этого индекса таблицы, как в col_name(i).col_name. В вашем случае вы использовали col_name как свойство объекта, так и как аргумент функции. Для ясности вы можете это изменить. Это скомпилировано для меня:

create or replace type temp_table is object (col_name varchar(100)); 
/
create or replace type col_table is TABLE of temp_table; 
/
create or replace FUNCTION COLUMN_HEADERS 
    (col_name in col_table) 
    RETURN VARCHAR2 
is 
    return_string varchar2(4096); 
BEGIN 
    return_string := ''; 
    for i in 1 .. col_name.count loop 
    return_string := return_string || ' ''' || col_name(i).col_name || ''' as ' || regexp_replace(col_name(i).col_name, '[ \+]', '_'); 
    if i < col_name.count then 
     return_string := return_string || ','; 
    end if; 
    end loop; 
    return return_string; 
END; 
+0

Спасибо! Думаю, я впутался в номенклатуру. – user2506680

Смежные вопросы