2012-10-18 12 views
4

我想從一段SQL代碼中提取一個函數,該函數在一個查詢中多次使用。我在尋找一個功能,它是類似於以下(由我發明的)語法:在SQL導航器查詢中定義一個函數

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

thing1,thing2,thing3是在例如表「東西」的整數列。另外,假設f比添加一個函數更復雜。

如何在查詢中定義一個函數?

回答

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

您是否正在嘗試構建動態表和列的函數,我會這樣做一些代碼?而且你不能在查詢的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;