oracleとmysqlのカスタム関数の違い

3678 ワード

oracleとmysqlのカスタム関数の違い
  • 全体フォーマット
  • mysql
  • oracle
  • 基礎操作
  • 賦値
  • 声明
  • サイクル
  • 判断
  • 内蔵関数
  • その他の注意
  • プロジェクトの必要性のため、私は主にmysqlのカスタム関数をoracleに移行します.だから、ここではoracleに重点を置きます.彼ら2人の違いは、主にいくつかの部分にあります:全体のフォーマット;基礎操作と組み込み関数、その他注意すべきことがあります.
    全体の書式
    mysql
    create function functionName(param) returns datatType begin//more work to do return 【result】; end;
    oracle
    create [or replace ] function functionName([param]) return resultType as|is begin//more work to do return result; end; 実は大体フォーマットが悪くなくて、ネットも山ほどあって、ここは少しだけ言います!
    ベースオペレーション
    に値を付ける
  • mysql:set、例えばset a=';
  • oracle::=、例えばa:=';
  • クエリー文を使用して値を割り当てます.カーソルとプロシージャでは
  • にもよく使用されます.
  • 例えばselect sysdate into time from dual;

  • 宣言
  • mysql:生命は関数体、すなわちbeginの後、DECLAREキーワード、例えばDECLARE sTemp VARCHAR(4000);
  • oracle:DECLAREを使わずに直接書き、asまたはisの後、beginの前、例えば:sTemp VARCHAR(4000);
  • ここでasとisに言及する以上、oracleのプロセスと関数では、asとisは他に行かない.

  • ループ
  • mysql:while条件do...end while;
  • oracle:while条件loop...end loop;

  • と判断
    すべて:if条件then...end if;
    ビルド関数
    ここで約束します.まずmysqlの関数を話して、oracleがどの関数で対応しているかを説明します.
  • ifnull()対応nvl():nullに何を表示するか、nullに何を表示しないかを意味するので、oracleのような万能なdecode()関数
  • を把握することをお勧めします.
  • concatは、両方のデータベースにありますが、oracleに2つのパラメータが余分であれば、必ずエラーを報告し、|ハイフンで解決したり、concat関数でネストしたりすることができますが、mysqlにはこのような制限値はありません.
  • group_concat(フィールド)、関数の意味、フィールドでグループ化され、‘,’番号で分割され、oracleで対応する関数、12 c前:vm_concat(フィールド)でいいです.12 c後、関数を変更して廃棄します.代替関数は:
  • です.
     listagg(  , char) within group(  order by   )    --    2         ,    `,char       ,       
    
  • find_in_set(temp,src)はtemp文字列がsrc文字列にあるか否かを意味し、src文字列は‘,’で分割され、booleanタイプの数値が返されるので、それ自体が1つの判断であってもoracleではinstr(stc,temp)で代用できるが、instr関数はtempのsrcでの下付きを返すので、実際の業務に基づいて判断する必要がある.
  • insert(src,indexstart,leng,replacesstr)は、src文字列においてindexstartビットから始まるlengビットを、replacesstr文字列で置き換える役割を果たす.これはoracleで完璧に代替できる関数ではありません.ここに例がありますが、
  • を参照してください.
    #      ‘’          ,   oracle        
    #     set c1 = INSERT(c1,1,instr(c1,split1),'');
    SELECT substr(temp, instr(temp, split1) + length(split1)) into temp from dual;
    
  • uuid()関数の役割はuuidを生成し、oracleはビットsysの代わりになります.guid()、Oracle公式sys_guid()が生成したuuidは世界で唯一、128ビットを占めているため、リソースが多くかかります.

  • その他の注意
  • oracleでは、パラメータは関数内で付与操作を行うことができません.
  • CREATE OR REPLACE 
    FUNCTION "getParentIds"(pid IN VARCHAR2)
    RETURN VARCHAR2
    IS
     sTemp VARCHAR(4000);
    BEGIN
    sTemp:='$';
    pid := sTemp;  --        
    RETURN sTemp;
    END;
    
  • oracleでは、空(’’)がnullテスト方法であり、局所変数を生命した後、空(’)に値を割り当て、その後、局所変数を変更して表示される値を表示したり、if...thenで判断したりすることができます.
  • oracleの関数名関数名は、二重引用符で囲まれているかどうかに分けることができます.二重引用符で囲まれている場合は、oracleデータが文字列に厳密に一致し、大文字と小文字を区別していることを示します.二重引用符または単引用符で囲まれていない場合は、oracleが自分で認識するようにします.oracleは大文字の名前で処理することに同意します.
  • 設計insertキーワードoracle関数で、設計insertキーワード挿入データ、最良のトランザクション、構造:
  • PRAGMA AUTONOMOUS_TRANSACTION; ... commit;
    

    例:
    CREATE OR REPLACE 
    FUNCTION "fn_split" (c1 VARCHAR, split1 VARCHAR)
    RETURN VARCHAR
    AS
     PRAGMA AUTONOMOUS_TRANSACTION;  ####      
    uuid varchar(36);
    temp VARCHAR2(36);
    BEGIN
      temp := c1;
     
      select rawtohex(SYS_guid()) into uuid from dual;
    	while(instr(temp,split1)<>0) loop
      insert into split_tab  (id,col,dataTime) values (uuid,substr(temp,1,instr(temp,split1)-1),SYSDATE());
      SELECT substr(temp, instr(temp, split1) + length(split1)) into temp from dual;
    END loop;
    insert INTO split_tab (id,col,dataTime) values (uuid,c1,SYSDATE()); 
    commit;  ###     
    return uuid;
    END;