以表为输入参​​数的 Oracle 函数

Posted

技术标签:

【中文标题】以表为输入参​​数的 Oracle 函数【英文标题】:Oracle function with table as input parameter 【发布时间】:2013-06-20 20:01:58 【问题描述】:

如何在 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(i) 不返回字符串,但使用 VALUE()TO_CHAR() 会给我其他错误。有人知道如何调试吗?

【问题讨论】:

【参考方案1】:

当您使用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;

【讨论】:

谢谢!我想我最终将自己与命名法混淆了。

以上是关于以表为输入参​​数的 Oracle 函数的主要内容,如果未能解决你的问题,请参考以下文章

教义 - 以表为目标的多对多

oracle 两表数据对比---minus

在 TSQL 中,我可以创建一个以表行作为输入的 UDF 吗?

oracle 自定义函数传参可以判断值么

使用 Oracle 表作为输入参数编写 Oracle 存储过程

如何创建一个以表名作为输入的简单存储过程