使用动态sql函数返回数字

时间:2016-01-29 07:57:23

标签: sql oracle plsql

我想创建一个返回data_byte的函数,以后我可以在rpad函数中使用它。继承了我之前提出的问题,我收到了有用的回复。 function that return data type that can be used in SQL(oracle)

这是我添加的当前功能代码:

create or replace FUNCTION get_data(tab_name in varchar2, column_name in varchar2) return number
is
  return_val NUMBER;
  str varchar2(1000) := 'select data_length from user_tab_columns where table_name = ' || ''''||tab_name||''''|| ' and column_name = ' || '''' || column_name || '''';
begin
 dbms_output.put_line(str);
  execute immediate(str);
  return(return_val);
end;
/
select get_data('EMPLOYEES', 'SALARY') from dual;

我记住,功能需要返回类型。成功编译该函数后,我尝试从dual中选择它,我得到NULL值。我预计它会为我返回22但我只有空。那是因为我的回归类型错了吗?或者我该如何解决它。

4 个答案:

答案 0 :(得分:2)

您的问题是没有填充return_val。例如下面的代码有效:

create or replace FUNCTION get_data(tab_name in varchar2, column_name in varchar2) return number
is
  return_val NUMBER;
  str varchar2(1000) := 'select data_length from user_tab_columns where table_name = ' || ''''||tab_name||''''|| ' and column_name = ' || '''' || column_name || '''';
begin
  dbms_output.put_line(str);
  execute immediate(str) INTO return_val;
  return(return_val);
end;

答案 1 :(得分:0)

你应该:

execute immediate str into return_val;
return return_val;

答案 2 :(得分:0)

在这种情况下,您不需要动态SQL。只需像这样使用CURSOR或SELECT INTO子句:

create or replace FUNCTION get_data(tab_name in varchar2, column_name in varchar2) return number is
  return_val NUMBER;
  cursor c_data(cp_table Varchar2, cp_column Varchar2) is
    select data_length
      from user_tab_columns
      where table_name = cp_table and
            column_name = cp_column;
begin

  open c_data(tab_name, column_name);
  fetch c_data into return_val;
  close c_data;

  return(return_val);
end;

答案 3 :(得分:0)

create or replace FUNCTION get_data(tab_name in varchar2, column_name in varchar2) return number
is
  return_val NUMBER;
begin
select data_length into return_val from user_tab_columns where table_name = tab_name and column_name = column_name
and rownum<2;
return return_val;
end;
/