我想从一段 SQL 代码中提取一个函数,该代码在一个查询中多次使用。我正在寻找类似于以下(由我发明)语法的功能:
with f(x) as (return x+1)
select f(thing1), f(thing2), f(thing3) from things
在示例中,thing1、thing2、thing3 是表“things”中的整数列。另外,想象一下 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;