1つのクエリで複数回使用されるSQLコードから関数を抽出したいと思います。私は次の(私が発明した)構文に似た機能を探しています:
with f(x) as (return x+1)
select f(thing1), f(thing2), f(thing3) from things
例のthing1、thing2、thing3は、テーブル「things」の整数列です。また、fがadd-one関数よりも複雑であると想像してください。
クエリ内で関数を定義するにはどうすればよいですか?
クエリの句で関数を宣言する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;