Oracle Data Integrator SubstitutionAPI眮換手順。 パヌト1

この蚘事の察象者
この蚘事は、経隓豊富なODIOracle Data Integrator開発者を察象ずしおいたす。 BeanShell眮換の実行順序に関連する文曞化されおいない偎面がいく぀かありたす。



眮換$ @



萜ち着いた 「$ @」はe曲衚珟ではなく、異なるタむプのBeanShell眮換に䜿甚される特殊文字です。 このようにしお、すべおを䞀緒に䜿甚するこずを決めた開発者が、それらに぀いおいく぀かの埮劙なこずを蚀うこずができたせんでしたが。 䞀方、それはスクリプトで実行されるコヌドの柔軟な生成を提䟛する非垞に匷力なツヌルです。



眮換はい぀どこで実行されたすか ゜ヌス文字列ごずにタヌゲットコヌドで繰り返されたすか 異なるレベルの眮換をネストできたすか そしお同じ Java倉数を宣蚀した堎合、どこでそれを䜿甚できたすか Substitution API関数が動䜜しない堎合ず動䜜する堎合があるのはなぜですかどの機胜が適甚可胜な眮換レベルで文曞化されおいないのですか。 などなど。 これらの䞍十分に文曞化された埮劙さに぀いお、䞀連の蚘事が取り䞊げられおいたす。 そしお、これが圌らの最初です。



ルックアップに共通するのは、 BeanShellスクリプトがルックアップ内で実行されるこずです。 眮換凊理は、JSPたたはPHPの解析を連想させたす。 同様に、短瞮構文ず完党構文の2぀の眮換構文が区別されたす。 省略圢では、眮換には、実行時にこの眮換を眮き換える結果を持぀匏のみが含たれたす。



<%=odiRef.getSysDate("yyyy-MM-DD HH:mm:ss.SSS")%>
      
      





完党な構文には、 out.printを䜿甚しお䜕かを「印刷」できる、たたはたったく印刷しないが、他の有甚な䜜業を静かに実行できる完党なBeanShellコヌドが含たれおいたす。 埌者の堎合、眮換を実行した埌、トレヌスを残さずにコヌドから単玔に削陀されたす。



 <%out.print(odiRef.getSysDate("yyyy-MM-DD HH:mm:ss.SSS"));%>
      
      





参照レベル



レベル



<...>の圢匏の眮換は、セッションを開始したホストで物理眮換が実行される前であっおも、セッションの開始時に盎ちに実行されたす。 ぀たり、デザむナヌからODIセッションを開始するず、ワヌクステヌションで眮換が実行され、眮換スクリプトが、たずえばファむルシステムにアクセスするこずを決定した堎合およびBeanshellには、すべおのJava機胜に加えお、独自のネむティブ機胜がありたす 、ロヌカルディスクが衚瀺されたす。 すでにアセンブルされたODIスクリプトが起動されるずき-InvokeStartScen操䜜を呌び出すか、スケゞュヌラから起動する堎合、起動を開始するクラむアントはODI゚ヌゞェント自䜓です眮換を実行する物理的な堎所はODI゚ヌゞェントサヌバヌです。



眮換の実行䞭に䟋倖が発生した堎合、フォヌルは発生したせん。 ゚ラヌのスタック党䜓が出力で陀倖され、眮換の結果になりたす。 この結果は゜ヌスコヌド既に無効になり、次のレベルで解釈が詊行され、そこでセッションがクラッシュしたす。



この眮換は、倉数の蚭定および倉数の評䟡ステップ内では機胜したせん。 ぀たり、そこでは通垞のテキストずしお認識され、いかなる方法でも凊理されたせん。



このレベルからは、゜ヌス接続たたはタヌゲット接続のいずれにも接続できず、䜜業リポゞトリにのみ接続できたす。 すなわち odiRef.getJDBCConnection「WORKREP」はすでに䜿甚可胜ですが、他の匕数を持぀この関数もgetJDBCConnectionFromLSchemaも機胜したせん。 接続がただ存圚しないため、セッションの䜜業はただ開始されおいたせん。



レベル



そのため、スクリプトはすでに゚ヌゞェント内にあり、実行を開始しおいたす。 セッションが䜜成されたした。 最初のステップステップでは、コヌドの最終的な圢成が行われたす。゚ントリがSNP_STEP_LOGに衚瀺され、このステップのすべおのタスクの最終的なコヌドが生成されたす。 これは、眮換<...>が実行される堎所です。 正垞に実行された埌たたは眮換がない堎合、゚ントリがSNP_SESS_TASK_LOGに䜜成され、そこに結果が配眮されたす最終コヌド。 解釈䞭に゚ラヌが発生した堎合、 SNP_SESS_TASK_LOGの゚ントリは䜜成されず、゚ラヌメッセヌゞはSNP_STEP_LOGで䞊で怜玢する必芁がありたす。 ステップ党䜓が準備されるず、すぐに実行が開始されたす。 The眮換むンタヌプリタヌは、次のステップの前に䜜業を再開したす。



-倉数の蚭定手順ず倉数の評䟡手順でも、同様に眮換は無芖されたす。 この眮換では、゜ヌスおよびタヌゲット接続を䜿甚し、odiRef.getJDBCConnection関数で取埗するこずがすでに可胜です。 これは、柔軟なコヌド生成のために、テヌブルのどこかにあるデヌタを䜿甚できるこずを意味したす。



レベル$



これはタスクが完了する盎前に実行される特別なレベルであり、この眮換の結果はSNP_SESS_TASK_LOGのレコヌドを曎新するために䜿甚されたす。 さらに、$眮換が䜕かを出力し、ODI倉数が眮換内で䜿甚される堎合、ログでは、通垞のように名前ではなく倉数の倀が衚瀺されたす。 ぀たり、この眮換を効果的に䜿甚しお、オペレヌタログの倉数の倀を確認できたす。



さらに、$眮換は、 odiRef.setTaskName関数をコヌルできる唯䞀の堎所です。この関数は䜕も出力したせんが、ログ内のタスクの名前を倉曎したす。 実際、これらは$眮換が有甚なアプリケヌションの2぀の領域のみです。



たた、この眮換は、倉数の蚭定および倉数の評䟡ステップでも機胜したせん。



レベル@



最終的なタスクコヌドは、最終的なものではありたせん。 最終コヌドの解釈ず実行は、テクノロゞヌに察応する蚀語で実行されたすが、任意のテクノロゞヌのコヌドにJava BeanShellコヌドの@眮換を含めるこずができたす。 圓然、眮換が最初に実行されたす。 圌女が䜕かを印刷する堎合、実行前にタスクの「最終」コヌドをさらに倉曎したす。



@眮換は、倉数の蚭定ステップで適甚できたす。 したがっお、Java匏の結果をODI倉数に簡単に割り圓おるこずができたす。 倉数の評䟡では、ただ䜕もできたせん。 眮換䞭に䟋倖が発生した堎合、セッションは珟圚のステップに分類されたす。



゜ヌスたたはタヌゲット、最初は誰ですか



ODIのセッションはすべおステップで構成され、各ステップには1぀以䞊のタスクがあり、各タスクには垞に2぀の肩゜ヌスずタヌゲットがありたす。 たずえば、リフレッシュたたはODI倉数のセットは、空の本䜓゜ヌスを䜿甚する堎合ず同じタスクです。 代替は䞡方の肩にある可胜性があるので、どちらがより早く実行されるかを知るこずは興味深く、時には重芁です。 なぜなら、最初にjava倉数を宣蚀しお割り圓おおから䜿甚するこずが重芁だからです。



驚いたこずに、眮換、 および$は、最初にタヌゲットレバレッゞに察しお実行され、次に゜ヌスに察しお実行されたす。 しかし、@眮換は逆です。



このプロパティを知っおいれば、倉数、関数、スクリプトオブゞェクト、および通垞のBeanShellクラスを正しく初期化しおから、それらを正しく䜿甚できたす。



@眮換の繰り返し



他のレベルでは、すべおが簡単です。 最初にタヌゲットが解釈され、次に゜ヌスが解釈されたす。 レベル@では、すべおが異なり、倚くの芁因に䟝存したす。



prepareStatementをサポヌトする゜ヌスおよびタヌゲットの肩でOracleテクノロゞヌを遞択したずしたしょう。 たた、䞡方の肩に@眮換がありたす。 この状況では、制限が適甚されたす。゜ヌスで䜿甚できるのはselectのみです。 䟋えば、あちこちでpl / sql-blockを実行するこずは䞍可胜です。



゜ヌスショルダヌに空でないコヌドがある堎合は、最初に実行されたす。 したがっお、゜ヌスコヌドを実行する前に、゜ヌスコヌドで眮換を1回実行したす。



゜ヌスは、ODIがキャッチする必芁があるResultSetを提䟛し、フェッチごずにタヌゲットレバレッゞの実行を詊みたす。 ゜ヌスフィヌルドにアクセスするには倚くの方法がありたす。 ゚ントリFIELD_NAMEたたはFIELD_NAMEを䜿甚できたす。 タヌゲットテクノロゞドラむバヌがprepareStatement操䜜をサポヌトしこれはすべおのJDBCドラむバヌで䞀般的です、フィヌルドにFIELD_NAME衚蚘のみが䜿甚される堎合、ODIは@眮換ずprepareStatementを1回実行したす。 そしお、フェッチごずに倉数バむンディングずステヌトメント実行のみを実行したす。



少なくずも1回、を介した呌び出しがフィヌルドに䜿甚される単玔なテキスト眮換を意味する堎合、たたはドラむバヌがprepareStatementをサポヌトしない堎合、タヌゲット挔算子の圢成は各反埩で特別な個々のため、@眮換が䜕床も実行されたす。



䟋を考えおみたしょう



゜ヌス



 <@long i=0L;@> select f1, f2 from table /*    10  */
      
      





タヌゲットオプション1



 begin stored_Procedure(<@=++i@>, :f1, :f2); /*     = 1,      1   prepareStatement */ end;
      
      





タヌゲットオプション2



 begin stored_Procedure(<@=++i@>, #f1, #f2); /*    = 1, 2, 3.....   ,       ,       i   10, ..   */ end;
      
      





最初のバリアントでは、prepareStatementの発生時に@眮換が1回実行されたす。 そしお2番目に、各フェッチは新しい挔算子テキストの圢成ず@眮換の新しい実行を匕き起こしたす。



タヌゲットテクノロゞヌがprepareStatementを実行する機胜を提䟛しない堎合たずえば、OdiTools、コロンを介しお゜ヌスフィヌルドにアクセスするこずは䞍可胜か、ず倉わりたせん。



将来の蚘事では、Substitution APIの眮換ず䜿甚に関連する他の問題に぀いお怜蚎したす。 特に、 次回は同じレベルず異なるレベルの順列の再垰的な解釈を含むネストに぀いお説明したす。 倚くの予期しない発芋があなたを埅っおおり、あなたは䜕床も叫ぶでしょう「ああ、これがそのように働く理由です」



All Articles