在SQL Navigator查询中定义函数

时间:2012-10-18 13:53:28

标签: sql oracle

我想从一段SQL代码中提取一个函数,该函数在一次查询中多次使用。我正在寻找类似于以下(由我发明)语法的功能:

with f(x) as (return x+1)
select f(thing1), f(thing2), f(thing3) from things

thing1,thing2,thing3是示例中表“things”中的整数列。另外,假设f比add-one函数更复杂。

如何在查询中定义函数?

2 个答案:

答案 0 :(得分:3)

查询的WITH子句中的函数声明是不可能的,但根据OOW中提供的信息,它将是12c版本。所以现在你需要创建一个函数作为一个模式对象,无论它是一个独立的函数还是一个包的一部分。例如:

create or replace function F(p_p in number)
return number
is
begin
  return p_p + 1;
end;

然后在查询中调用它,确保作为参数传入函数的列的数据类型与函数的参数具有相同的数据类型:

select f(col1)
     , f(col2)
     , ...
     , f(coln)
  from your_table

答案 1 :(得分:1)

您是否正在尝试为动态表和表的列构建函数,我会像这样做一些代码吗?并且您不能在查询的WITH子句中声明函数。

    SELECT f ( tablename,columnname1 ),
           f ( tablename,columnname2 ),
           ........
    FROM   tablename;


    Create or replace function f (tableName varchar2,ColumnName varchar2)
    Return somethingHere
    Is
        varTableName varchar2(200);
        varColumnName varchar2(200);
        varValue integer;
        t_cid           INTEGER;
        t_command       VARCHAR2(200);
    Begin
        --Get tableName
        varTableName := tableName ;
        --Get columnName
        varColumnName := ColumnName ;
        t_command := 'SELECT ' || varColumnName ||' FROM ' || varTableName;
        --Here execute dynamic sql statement
        DBMS_SQL.PARSE
        DBMS_SQL.DEFINE_COLUMN
           DBMS_SQL.EXECUTE
        --fatch row values into varValue
        DBMS_SQL.COLUMN_VALUE (..,..,varValue);
        --then do your x+1 magic here
        varValue := varValue+1
        --then output  your value.
    End;