ホームページ バックエンド開発 PHPチュートリアル PHP_PHP チュートリアルを使用して Oracle LOB データを管理するための関連方法の説明

PHP_PHP チュートリアルを使用して Oracle LOB データを管理するための関連方法の説明

Jul 15, 2016 pm 01:30 PM
oracle php 方法 私たち データ 関連している 知る 管理 説明する

VARCHAR2 も Oracle が推奨する型であることは誰もが知っています。しかし、VARCHAR2 の使用には問題があります。VARCHAR2 は最大 4000 文字しか表現できず、これは中国語の 2000 文字に相当します。プログラム内の特定の文字の値が 20,002 文字を超える場合、VARCHAR2 は要件を満たすことができません。現時点では 2 つのオプションがあります。1 つは複数の VARCHAR2 を使用してそれを表す方法で、もう 1 つは LOB フィールドを使用する方法です。ここでは 2 番目の方法を見ていきます。

まず、Oracle の LOB フィールドについて一般的に理解しましょう。 Oracle の LOB タイプは、BLOB、CLOB、BFILE の 3 つのタイプに分類されます。 CLOB は文字 LOB と呼ばれ、BLOB および BFILE はバイナリ データを格納するために使用されます。 CLOB と BLOB の最大長は 4GB で、Oracle データベースに値を保存します。 BFILE は BLOB に似ていますが、データを外部ファイルに配置するため、外部 BLOB (外部 BLOB) とも呼ばれます。

私たちは皆、MYSQL に精通していると思います。 MYSQL には、TEXT や BLOB などの同様のデータ型があります。 PHP の MYSQL 関数では、他のタイプのデータと同様に、TEXT/BLOB に対する操作は直接的です。しかし、Oracle では状況が異なります。 Oracle は LOB を特別なデータ型として扱い、従来の操作方法を使用できません。たとえば、INSERT ステートメントで LOB フィールドに値を直接挿入したり、LIKE を使用して検索したりすることはできません。

以下では、PHP のいくつかの例を使用して Oracle LOB データを管理し、PHP の OCI 関数を使用して LOB データを挿入、取得、クエリする方法を説明します。

Insert

INSERT ステートメントを直接使用して LOB フィールドに値を挿入することはできません。通常の状況では、次の手順があります:

1. まず INSERT ステートメントを分析し、LOB 記述子を返します

2. OCI 関数を使用してローカル LOB オブジェクトを生成します

3. LOB オブジェクトを LOB On にバインドします。記述子

4. INSERT ステートメントを実行します

5. LOB オブジェクトに値を割り当てます

6. LOB オブジェクトと SQL ステートメントのハンドルを解放します

次の例は、Oracle LOB データを保存する例です。ユーザーによって BLOB (または BFILE、操作は若干異なります) にアップロードされます。まず、次の構造のテーブルを作成します:

<ol class="dp-xml">
<li class="alt"><span><span>CREATE TABLE PICTURES (  </span></span></li>
<li><span>ID NUMBER,  </span></li>
<li class="alt"><span>DESCRIPTION VARCHAR2(100),  </span></li>
<li><span>MIME VARCHAR2(128),  </span></li>
<li class="alt"><span>PICTURE BLOB  </span></li>
<li><span>); </span></li>
</ol>
ログイン後にコピー

IDの自動増加を実現したい場合は、SEQUENCE:

CREATE SEQUENCE PIC_SEQ;

を作成します。次に、処理に使用されるPHPプログラムコードがあります。データ。

<ol class="dp-xml">
<li class="alt"><span><span>< ?php  </span></span></li>
<li><span>//建立Oracle数据库连接  </span></li>
<li class="alt">
<span>$</span><span class="attribute">conn</span><span> = </span><span class="attribute-value">OCILogon</span><span>($user, $password, $SID);  </span>
</li>
<li><span>//提交SQL语句给Oracle  </span></li>
<li class="alt"><span>//在这里要注意的两点:一是用EMPTY_BLOB()函数。这是Oracle的内部函数,<br>返回一个LOB的定位符。在插入LOB时,只能用这个办法先 生成一个空的LOB定<br>位符,然后对这个定位符进行操作。EMPTY_BLOB()函数是针对BLOB类型的,<br>对应于CLOB的是 EMPTY_CLOB()。二是RETURNING后面的部分,把picture<br>返回,让PHP的OCI函数能够处理。  </span></li>
<li>
<span>$</span><span class="attribute">stmt</span><span> = </span><span class="attribute-value">OCIParse</span><span>($conn,”INSERT INTO PICTURES (id, description, picture)  </span>
</li>
<li class="alt"><span>VALUES (pic_seq.NEXTVAL, ‘$description’, ‘$lob_upload_type’<br>, EMPTY_BLOB()) RETURNING picture INTO ICTURE”);  </span></li>
<li><span>//生成一个本地LOB对象的描述符。注意函数的第二个参数:OCI_D_LOB,<br>表示生成一个LOB对象。其它可能的还有OCI_D_FILE和OCI_D_ROWID,<br>分别对应于BFILE和ROWID对象。  </span></li>
<li class="alt">
<span>$</span><span class="attribute">lob</span><span> = </span><span class="attribute-value">OCINewDescriptor</span><span>($conn, OCI_D_LOB);  </span>
</li>
<li><span>//将生成的LOB对象绑定到前面SQL语句返回的定位符上。  </span></li>
<li class="alt"><span>OCIBindByName($stmt, ‘:PICTURE’, &$lob, -1, OCI_B_BLOB);  </span></li>
<li><span>OCIExecute($stmt);  </span></li>
<li class="alt"><span>//向LOB对象中存入数据。因为这里的源数据是一个文件,所以直接用LOB<br>对象的savefile()方法。LOB对象的其它方法还有:save()和load(),<br>分别用来保存和取出数据。但BFILE类型只有一个方法就是save()  </span></li>
<li><span>if($lob->savefile($lob_upload)){  </span></li>
<li class="alt"><span>OCICommit($conn);  </span></li>
<li><span>echo “上传成功< br>”;  </span></li>
<li class="alt"><span>}else{  </span></li>
<li><span>echo “上传失败< br>”;  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>//释放LOB对象  </span></li>
<li class="alt"><span>OCIFreeDesc($lob);  </span></li>
<li><span>OCIFreeStatement($stmt);  </span></li>
<li class="alt"><span>OCILogoff($conn);  </span></li>
<li><span>?> </span></li>
</ol>
ログイン後にコピー

もう 1 つの注意事項: LOB フィールドの値は少なくとも 1 文字である必要があるため、save() または savefile() の前に、値が空であってはいけないことを確認してください。そうしないと、Oracle でエラーが発生します。

取得

PHP は Oracle LOB データを管理します。LOB からデータを取得するには 2 つの方法があります。 1 つは LOB オブジェクトを生成し、それを SELECT ステートメントによって返されたロケーターにバインドし、LOB オブジェクトのload() メソッドを使用してデータを取得する方法で、もう 1 つは PHP の OCIFetch*** 関数を直接使用する方法です。最初の方法は 2 番目の方法よりもはるかに面倒なので、2 番目の方法については直接説明します。

上の表は引き続き使用します。

<ol class="dp-xml">
<li class="alt"><span><span>< ?php  </span></span></li>
<li>
<span>$</span><span class="attribute">conn</span><span> = </span><span class="attribute-value">OCILogon</span><span>($user, $password, $SID);  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">stmt</span><span> = </span><span class="attribute-value">OCIParse</span><span>($conn,”SELECT * <br>FROM PICTURES WHERE </span><span class="attribute">ID</span><span>=$pictureid”);  </span>
</li>
<li><span>OCIExecute($stmt);  </span></li>
<li class="alt"><span>//秘密就在PCIFetchInfo的第三个参数上:<br>OCI_RETURN_LOBS。第三个参数是FETCH的模式,<br>如果OCI_RETURN_LOBS,就直接把LOB的值放到结<br>果数组中,而不是LOB定位符,也就不用LOB对象的load()方法了。  </span></li>
<li><span>if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))  </span></li>
<li class="alt"><span>{  </span></li>
<li><span>echo “Content-type: ” . StripSlashes($result[MIME]);  </span></li>
<li class="alt"><span>echo StripSlashes($result[PICTURE]);  </span></li>
<li><span>}  </span></li>
<li class="alt"><span>OCIFreeStatement($stmt);  </span></li>
<li><span>OCILogoff($conn);  </span></li>
<li class="alt"><span>?> </span></li>
</ol>
ログイン後にコピー

このプログラムはLOBに配置されたデータ(画像)を表示するために使用されます。メソッドの呼び出し (スクリプト名が getpicture.php であると仮定):

<ol class="dp-xml"><li class="alt"><span><span>< IMG </span><span class="attribute">SRC</span><span>=”getpicture.php?</span><span class="attribute">pictureid</span><span>=</span><span class="attribute-value">99</span><span>″ <br></span><span class="attribute">ALT</span><span>=”放在Oracle LOB中的图片”> </span></span></li></ol>
ログイン後にコピー

Query

前述したように、PHP は Oracle LOB データを管理し、LIKE を使用して Oracle の LOB フィールドと一致させることはできません。どうやってするの?実際、Oracle には DBMS_LOB と呼ばれる匿名パッケージがあり、これには LOB の操作に必要なすべてのプロセスが含まれています。

次のようなテーブルがあるとします。

<ol class="dp-xml">
<li class="alt"><span><span>CREATE TABLE ARTICLES (  </span></span></li>
<li><span>ID NUMBER,  </span></li>
<li class="alt"><span>TITLE VARCHAR2(100),  </span></li>
<li><span>CONTENT CLOB  </span></li>
<li class="alt"><span>); </span></li>
</ol>
ログイン後にコピー

記事のコンテンツは CONTENT フィールドに配置されます。

次に、コンテンツに「PHP 中国語ユーザー」を含むすべての記事を検索する必要があります。次のように実行できます。

<ol class="dp-xml">
<li class="alt"><span><span>< ?php  </span></span></li>
<li>
<span>$</span><span class="attribute">conn</span><span> = </span><span class="attribute-value">OCILogon</span><span>($user, $password, $SID);  </span>
</li>
<li class="alt"><span>//WHERE子句中用了DBMS_LOB.INSTR过程。它有四个参数,<br>前面两个分别表示LOB的定位符(可以直接用字段表示)<br>和要查找的字符串;后面两个分别表示开始的偏移量和出现的次数。<br>要注意的是必须判断它的返回值,也就是要大于0。  </span></li>
<li>
<span>$</span><span class="attribute">stmt</span><span> = </span><span class="attribute-value">OCIParse</span><span>($conn,”SELECT * FROM ARTICLES <br>WHERE DBMS_LOB.INSTR(CONTENT, ‘PHP中文用户’, 1, 1) > 0″);  </span>
</li>
<li class="alt"><span>OCIExecute($stmt);  </span></li>
<li><span>if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))  </span></li>
<li class="alt"><span>{  </span></li>
<li><span>…  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>OCIFreeStatement($stmt);  </span></li>
<li class="alt"><span>OCILogoff($conn);  </span></li>
<li><span>?> </span></li>
</ol><br> 
ログイン後にコピー

Oracle では、LENGTH、SUBSTR などの LOB データを操作するための多くのプロシージャも提供しています。詳細な使用方法については、Oracle の開発マニュアルを参照してください。

Oracle LOB データを管理するための PHP の操作については以上です。私は長い間オラクルと連絡を取っていなかったので、この記事には間違いがあるかもしれません。どなたでも私を批判したり修正したりしてください。


www.bkjia.com本当http://www.bkjia.com/PHPjc/446262.html技術記事 VARCHAR2 は Oracle が推奨する型でもあることは誰もが知っています。しかし、VARCHAR2 の使用には問題があります。VARCHAR2 は最大 4000 文字しか表現できず、これは中国語の 2000 文字に相当します。あなたのプログラムなら...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの現在のステータス:Web開発動向を見てください PHPの現在のステータス:Web開発動向を見てください Apr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHP:多くのウェブサイトの基礎 PHP:多くのウェブサイトの基礎 Apr 13, 2025 am 12:07 AM

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHP対Python:コア機能と機能 PHP対Python:コア機能と機能 Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPの目的:動的なWebサイトの構築 PHPの目的:動的なWebサイトの構築 Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

See all articles