2015-10-06 8 views
12

RAWタイプ変数はPL/SQLコードでは変更できませんか?私は、RAWタイプの変数の特定のバイトを、メモリのコピーをしない場所に置き換えることはできますか?もちろんRAW型変数はPL/SQLコードで不変ですか?

我々はスペックバイト変更するための適切ないくつかのルーチンでUTL_RAWパッケージを持っているが、それはそれらのすべてが可変のインスタンスのメモリをコピーのようになります。

またUTL_RAW.BIT_ANDUTL_RAW.BIT_ORUTL_RAW.OVERLAY

この質問は密接に効果的な文字列にリンクされています連結問題。例えば、Javaの文字列も不変であり、このタスクのためにStringBuilderが用意されています。 私はこれに関するOracleのドキュメントで明確な情報が見つかりませんでした。いくつかのグーグルの後[1]答えのように見える:はい。 RAW型の変数は、PL/SQLコードでは不変であり、文字列でもあります。本当に本当ですか?この質問の説明と歴史がもっとある方がよいでしょう。

参考文献:

  1. https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:10445025326812#followup-76860752200038
+0

わかりません。私はこの質問の目的を理解しています。他の変数と同様に、RAW変数を確実に更新することができます。セマンティクスは同じです。 NOCOPYパラメータに関する例外は同様に適用されますが、これはUTL_RAWのいずれの関数にも当てはまりません。なぜあなたはメモリコピーなしでRAW変数の特定のビットを変更する必要がありますか? –

+0

一般的な目的はPL \ SQLマシンの内部動作をクリアすることです。また、strings \ rawの作業の効率の実用上の問題があります。膨大な量の操作を実行すると、高いメモリトラフィックが発生します。例えば、連鎖。なぜこれが私を混乱させるのですか? Javaとその中にStringBuilderが存在するためです。それは私たちが問題と解決策を持っているように見えます.PRO \ SQLには問題があります。 –

+3

あなたの問題がまだ分かりません。純粋なPL/SQLのパフォーマンスが問題となる場合は、NOCOPYおよび/またはおそらくネイティブ・コンパイル済PL/SQLを使用して探索することができます。それでも、 'RAW'変数自体は問題ではありません。あなたはおそらくそれらを使って問題を解決しています - 解決しようとしている問題は何ですか? –

答えて

5

変数に割り当てられたメモリの特定のサブパートを変更することとしてPL/SQLにはそのようなことはありません。それが関数の場合(前述のutl_rawルーチンの場合のように)、常に値の新しいインスタンスを返します。 in out nocopyパラメータを持つプロシージャの場合はreference to the argumentで動作しますが、そのコピーではなく、プロシージャ内の実際の作業には値がコピーされ、同じメモリでは動作しません。 (まあ、これはLOBには当てはまりませんが、これはあなたが尋ねたものではありません)

PL/SQLはSQL上の手続き型言語です。これは、SQLを手続き的に使用できるように設計されており、超高速で効果がないように設計されていません。メモリ内のバイトを直接変更する必要がある場合は、Cまたはアセンブラを使用することができます。

+0

こんにちは、それは、そのコピーではなく、引数への参照で動作しますが、それでもプロシージャ内の実際の作業は、値をコピーし、動作しない同じメモリに._? –

+0

@FlorinGhitaに加えて、もしそれが関数であれば(上記のutl_rawルーチンの場合のように)、値の新しいインスタンスを常に返します。これはdocのrefもなく質問に書いてあります。あなたの答えは、トピックについての新しい**情報はほとんどありません。 –

+0

私はさらに何を伝えることができますか分かりませんか?関数の値を返すには、基本的な 'variable:= variable'という代入の場合のように、単にメモリコピーが必要であるという単純な常識があります。 – nop77svk

関連する問題