4

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関数よりも複雑であると想像してください。

クエリ内で関数を定義するにはどうすればよいですか?

4

2 に答える 2

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
于 2012-10-18T14:07:49.777 に答える
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;
于 2012-10-18T17:22:17.427 に答える