我想從一段SQL代碼中提取一個函數,該函數在一個查詢中多次使用。我在尋找一個功能,它是類似於以下(由我發明的)語法:在SQL導航器查詢中定義一個函數
with f(x) as (return x+1)
select f(thing1), f(thing2), f(thing3) from things
thing1,thing2,thing3是在例如表「東西」的整數列。另外,假設f比添加一個函數更復雜。
如何在查詢中定義一個函數?
我想從一段SQL代碼中提取一個函數,該函數在一個查詢中多次使用。我在尋找一個功能,它是類似於以下(由我發明的)語法:在SQL導航器查詢中定義一個函數
with f(x) as (return x+1)
select f(thing1), f(thing2), f(thing3) from things
thing1,thing2,thing3是在例如表「東西」的整數列。另外,假設f比添加一個函數更復雜。
如何在查詢中定義一個函數?
在查詢的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
您是否正在嘗試構建動態表和列的函數,我會這樣做一些代碼?而且你不能在查詢的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;