Hướng dẫn how to connect oracle database in php using wamp - cách kết nối cơ sở dữ liệu oracle trong php bằng cách sử dụng wamp

Tôi có tiêu chuẩn Windows Server 2008 R 2 với WampServer2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b.

Tôi đã làm theo các hướng dẫn được cung cấp bởi Oracle, tất nhiên bằng cách sử dụng WAMP Cài đặt: Bài viết

Tôi đã sử dụng phiên bản khách hàng tức thời của Oracle: InstantClient-Basic-NT-11.2.0.4.0instantclient-basic-nt-11.2.0.4.0

Vấn đề là, khi tôi kích hoạt các dòng này trong httpd.conf, bất kỳ tệp PHP nào có tên là cho lỗi "bị cấm, bạn không có quyền truy cập /path /file.php trên máy chủ này.":httpd.conf, any php file called gives error "Forbidden You don't have permission to access /path/file.php on this server.":

FcgidInitialEnv PHPRC "C:/new_wamp/bin/php/php5.5.12/" AddHandler fcgid-script .php FcgidWrapper "C:/wamp/bin/php/php5.5.12/php-cgi.exe" .php

Ngoài ra có lỗi trong nhật ký lỗi PHP:

CẢNH BÁO PHP: Php Startup: Không thể tải Thư viện động 'C: /wamp/bin/php/php5.5.12/ext \ php_oci8_11g.dll' - %1 không phải là ứng dụng Win32 hợp lệ. không rõ trên dòng 0'C:/wamp/bin/php/php5.5.12/ext\php_oci8_11g.dll' - %1 is not a valid Win32 application. in Unknown on line 0

Nhưng InstantClient là phiên bản 32 bit. Theo như tôi đã tìm ra từ các cài đặt trước đó, hầu hết là vấn đề là trong 64 bit InstantClient?instantclient is 32bit version. As far as i have found out from previous installations, mostly problem is in 64bit instantclient?

Bất kỳ lời khuyên?

Thanks!

Mục đích

Hướng dẫn này chỉ cho bạn cách sử dụng PHP với cơ sở dữ liệu Oracle 11g.

Thời gian để hoàn thành

Khoảng 2 giờ

Tổng quan

PHP là ngôn ngữ tập lệnh web phổ biến và thường được sử dụng để tạo các trang web dựa trên cơ sở dữ liệu. Hướng dẫn này giúp bạn bắt đầu với cơ sở dữ liệu PHP và Oracle bằng cách chỉ ra cách xây dựng một ứng dụng web và bằng cách cung cấp các kỹ thuật để sử dụng PHP với Oracle. Nếu bạn chưa quen với PHP, hãy xem lại Phụ lục: Php Primer để có được sự hiểu biết về ngôn ngữ PHP.

Điều kiện tiên quyết

Trước khi bắt đầu lời tiên tri này, xin vui lòng hoàn thành các điều kiện tiên quyết sau:

.

.

.

.

.

.

Cài đặt Cơ sở dữ liệu Oracle 11.2

Cài đặt Cơ sở dữ liệu Oracle 11.2

Bắt đầu gộp kết nối DRCP:

Cài đặt Cơ sở dữ liệu Oracle 11.2
HR schema and make the following changes:

Bắt đầu gộp kết nối DRCP:

Cài đặt Cơ sở dữ liệu Oracle 11.2

Cài đặt Cơ sở dữ liệu Oracle 11.2

Bắt đầu gộp kết nối DRCP:

Cài đặt Cơ sở dữ liệu Oracle 11.2

Bắt đầu gộp kết nối DRCP:

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults();

Tạo người dùng có tên PHPHOL bằng mật khẩu 'Chào mừng'. Cài đặt lược đồ nhân sự mẫu của Oracle và thực hiện các thay đổi sau:

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees;

.

.

.

.

.

Cài đặt Cơ sở dữ liệu Oracle 11.2$HOME/public_html/connect.php

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>

Bắt đầu gộp kết nối DRCP:oci_connect() function contains the username, the password and the connection string. In this case, Oracle's Easy Connect connection string syntax is used. It consists of the hostname and the DB service name.

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); oci_close() function closes the connection. Any standard connections not explicitly closed will be automatically released when the script ends.

Cài đặt Cơ sở dữ liệu Oracle 11.2

//localhost/~phphol/connect.php

Bắt đầu gộp kết nối DRCP:

Cài đặt Cơ sở dữ liệu Oracle 11.2$HOME/public_html/usersess.sql

column username format a30 column logon_time format a18 set pagesize 1000 feedback off echo on select username, to_char(logon_time, 'DD-MON-YY HH:MI:SS') logon_time from v$session where username is not null; exit

Bắt đầu gộp kết nối DRCP: This SQL*Plus script shows the current database sessions, and what time they logged into the database.

Cài đặt Cơ sở dữ liệu Oracle 11.2

cd $HOME/public_html sqlplus -l phphol/welcome @usersess.sql

Bắt đầu gộp kết nối DRCP:oci_connect() function has been closed.

Chỉnh sửa $ home/public_html/Connect.php và thay đổi oci_connect () để sử dụng kết nối liên tục oci_pconnect ().$HOME/public_html/connect.php and change oci_connect() to use a persistent connection oci_pconnect().

$ Conn = OCI_PConnect ("Phphol", "Chào mừng", "// LocalHost/Orcl");

Tải lại tập lệnh Connect.php trong trình duyệt. Bây giờ Rerurn Usersess.sql trong SQL*Plus.connect.php script in the browser. Now rerurn usersess.sql in SQL*Plus.

cd $HOME/public_html sqlplus -l phphol/welcome @usersess.sql

Cần có hai người dùng được kết nối. Bạn có thể thấy nhiều hơn hai nếu bạn tải lại trang nhiều lần và Apache đã phân bổ các quy trình khác nhau để xử lý tập lệnh PHP. Theo mặc định, các kết nối liên tục vẫn mở cho đến khi quá trình Apache chấm dứt. Các tập lệnh PHP tiếp theo có thể sử dụng lại kết nối đã mở, khiến chúng chạy nhanh hơn.

Sử dụng gộp kết nối thường trú cơ sở dữ liệu

Tập hợp kết nối thường trú cơ sở dữ liệu là một tính năng mới của cơ sở dữ liệu Oracle 11G. Nó rất hữu ích cho các tập lệnh sống ngắn như thường được sử dụng bởi các ứng dụng web. Nó cho phép số lượng kết nối được chia tỷ lệ khi việc sử dụng trang web tăng lên. Nó cho phép nhiều quy trình Apache trên nhiều máy để chia sẻ một nhóm nhỏ các quy trình máy chủ cơ sở dữ liệu. Không có DRCP, kết nối PHP không liên tục phải bắt đầu và chấm dứt quy trình máy chủ và kết nối PHP liên tục giữ các tài nguyên cơ sở dữ liệu ngay cả khi PHP không hoạt động.

Bên dưới bên trái là sơ đồ của việc không phát sinh. Mỗi tập lệnh đều có các giao dịch máy chủ cơ sở dữ liệu riêng. Các tập lệnh không thực hiện bất kỳ công việc cơ sở dữ liệu nào vẫn giữ kết nối cho đến khi kết nối được đóng và máy chủ bị chấm dứt. Dưới đây là một sơ đồ với DRCP. Các tập lệnh có thể sử dụng các máy chủ cơ sở dữ liệu từ một nhóm máy chủ và trả lại chúng khi không còn cần thiết.

Các tập lệnh hàng loạt thực hiện các công việc chạy dài thường nên sử dụng các kết nối không có mặt.

Phần này của hướng dẫn cho thấy cách DRCP có thể được sử dụng bởi các ứng dụng mới hoặc hiện có mà không cần viết hoặc thay đổi bất kỳ logic ứng dụng nào. Thực hiện các bước sau:

.

.

.

.

.

.

Kiểm tra xem PHP có Set OCI8.Connection_Class không. Mở cửa sổ đầu cuối và thực hiện lệnh sau:oci8.connection_class set. Open a terminal window and execute the following command:

Php -r 'echo ini_get ("oci8.connection_class"), "\ n";'

Lớp kết nối cho nhóm máy chủ cơ sở dữ liệu biết rằng các kết nối có liên quan. Thông tin phiên (như định dạng ngày mặc định) có thể được giữ lại giữa các cuộc gọi kết nối, mang lại lợi ích hiệu suất. Thông tin phiên sẽ bị loại bỏ nếu một máy chủ gộp sau đó được sử dụng lại bởi một ứng dụng khác với tên lớp kết nối riêng.

Xem lại mã trong $ home/public_html/query_pooled.php$HOME/public_html/query_pooled.php

<?php
$c = oci_pconnect("phphol", "welcome", "//localhost/orcl:pooled");
$s = oci_parse($c, 'select * from employees');
oci_execute($s);
oci_fetch_all($s, $res);
echo "<pre>\n"; var_dump($res); echo "</pre>\n";
?>

So sánh mã này với mã trong $ home/public_html/query_nonpooled.php$HOME/public_html/query_nonpooled.php

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 0

Sự khác biệt duy nhất là ": gộp" trong chuỗi kết nối Easy Connect trong query_pooled.php.:pooled" in the Easy Connect connection string in query_pooled.php.

Để chạy các tập lệnh, công cụ Apache Benchmark được sử dụng. Lệnh này liên tục tải một trang web, đo lường hiệu suất của nó. Từ cửa sổ đầu cuối, thực hiện các mục sau:

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 1

Lệnh trên gửi Apache 150 yêu cầu đồng thời cho tập lệnh, liên tục trong 30 giây.

Bây giờ hãy nhìn vào số lượng kết nối cơ sở dữ liệu mở. Mở một cửa sổ đầu cuối khác, thực hiện các mục sau:

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 2

Nhóm DRCP mặc định tối đa là 40. Bạn thấy tối đa 40 kết nối với tên người dùng PHPHOL, tùy thuộc vào số lượng quy trình Apache đã xử lý các yêu cầu 'AB'. Bạn cũng có thể cần thực hiện truy vấn trong khi 'AB' đang chạy để xem các máy chủ gộp hoạt động.

Oracle quản lý nhóm DRCP, thu hẹp nó sau một thời gian chờ quy định.

Bây giờ, bạn sẽ chạy cùng một lệnh ngoại trừ chạy tập lệnh không có mặt để so sánh sự khác biệt. Từ cửa sổ đầu cuối, thực hiện các mục sau:

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 3

Bây giờ hãy nhìn vào số lượng kết nối cơ sở dữ liệu mở. Mở một cửa sổ đầu cuối khác, thực hiện các mục sau:

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 2

Nhóm DRCP mặc định tối đa là 40. Bạn thấy tối đa 40 kết nối với tên người dùng PHPHOL, tùy thuộc vào số lượng quy trình Apache đã xử lý các yêu cầu 'AB'. Bạn cũng có thể cần thực hiện truy vấn trong khi 'AB' đang chạy để xem các máy chủ gộp hoạt động.

Oracle quản lý nhóm DRCP, thu hẹp nó sau một thời gian chờ quy định.

Bây giờ, bạn sẽ chạy cùng một lệnh ngoại trừ chạy tập lệnh không có mặt để so sánh sự khác biệt. Từ cửa sổ đầu cuối, thực hiện các mục sau:V$SESSION.

Nhiều hàng hơn trước được trả lại. Các hàng với

(TNS V1-V3)query_pooled.php a little slower than query_nonpooled.php. But the non-pooled script causes every single Apache process to open a separate connection to the database. For larger sites, or where memory is limited, the overall benefits of DRCP are significant.

tương ứng với quá trình Apache đang chạy giữ kết nối cơ sở dữ liệu mở. Đối với PHP, Apache chạy ở chế độ đa quy trình, sinh sản con xử lý từng quy trình có thể xử lý một tập lệnh PHP. Tùy thuộc vào cách Apache phân bổ các quy trình này để xử lý các yêu cầu "AB", bạn có thể thấy một số lượng hàng khác nhau trong phiên V $.

So sánh số lượng yêu cầu hoàn thành trong mỗi lần chạy. Bạn có thể muốn chạy từng tập lệnh một vài lần để làm nóng bộ nhớ cache.

1. Phân tích câu lệnh để thực hiện. the statement for execution.
2. Liên kết các giá trị dữ liệu (tùy chọn). data values (optional).
3. Thực thi câu lệnh. the statement.
4. Tìm nạp các kết quả từ cơ sở dữ liệu. the results from the database.

Để tạo một truy vấn đơn giản và hiển thị kết quả trong bảng HTML, hãy thực hiện các bước sau.

.

.

Xem lại mã trong $ home/public_html/query.php$HOME/public_html/query.php

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 5

Hàm oci_parse () phân tích lại câu lệnh.oci_parse() function parses the statement.

Hàm OCI_execute () thực thi câu lệnh phân tích cú pháp.oci_execute() function executes the parsed statement.

Hàm OCI_Fetch_Array () truy xuất một hàng kết quả của truy vấn dưới dạng mảng kết hợp và bao gồm các null.oci_fetch_array() function retrieves a row of results of the query as an associative array, and includes nulls.

Hàm HTMLENTITY () thoát khỏi bất kỳ văn bản nào giống với các thẻ HTML để nó hiển thị chính xác trong trình duyệt.htmlentities() function escapes any text resembling HTML tags so it displays correctly in the browser.

Xem lại mã trong $ home/public_html/query.php

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 6

Hàm oci_parse () phân tích lại câu lệnh.

Hàm OCI_execute () thực thi câu lệnh phân tích cú pháp.OCI_ASSOC parameter fetches the row as an associative arrary of column names and column data.

Hàm OCI_Fetch_Array () truy xuất một hàng kết quả của truy vấn dưới dạng mảng kết hợp và bao gồm các null.OCI_NUM parameter can be passed to oci_fetch_array() to fetch the row as a numeric array.

Hàm HTMLENTITY () thoát khỏi bất kỳ văn bản nào giống với các thẻ HTML để nó hiển thị chính xác trong trình duyệt.

Từ trình duyệt web của bạn, hãy nhập URL sau để hiển thị đầu ra: Bind variables improve code reusability, and can reduce the risk of SQL Injection attacks.

Kết quả của truy vấn được hiển thị trong trình duyệt web.

.

.

Xem lại mã trong $ home/public_html/query.php$HOME/public_html/bind.php

Hàm oci_parse () phân tích lại câu lệnh.

Xem lại mã trong $ home/public_html/query.php

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 8

Hàm oci_parse () phân tích lại câu lệnh.$myeid variable is bound to the :eidbv bind variable so when the query is re-executed the new value of $myeid is passed to the query. This allows you to execute the statement again, without reparsing it with the new value, and can improve performance of your code.

Hàm OCI_execute () thực thi câu lệnh phân tích cú pháp.EMPLOYEE_ID column of the EMPLOYEES table, and edit bind.php to use IDs that exist in the table.

Hàm OCI_Fetch_Array () truy xuất một hàng kết quả của truy vấn dưới dạng mảng kết hợp và bao gồm các null.

Hàm HTMLENTITY () thoát khỏi bất kỳ văn bản nào giống với các thẻ HTML để nó hiển thị chính xác trong trình duyệt.

Từ trình duyệt web của bạn, hãy nhập URL sau để hiển thị đầu ra:oci_commit() and oci_rollback() functions used to control transactions. At the end of a PHP script, any uncommitted data is rolled back.

Kết quả của truy vấn được hiển thị trong trình duyệt web.

Tham số OCI_ASSOC tìm nạp hàng như một sự kết hợp của tên cột và dữ liệu cột.

.

.

.

.

.

.

.

.

.

Xem lại mã trong $ home/public_html/query.php

sqlplus / as sysdba execute dbms_connection_pool.start_pool(); execute dbms_connection_pool.restore_defaults(); 9

Xem lại mã trong $ home/public_html/query.php$HOME/public_html/trans_rollback.php

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 0

Hàm oci_parse () phân tích lại câu lệnh.OCI_DEFAULT parameter overrides the basic behavior of oci_execute().

Xem lại mã trong $ home/public_html/query.php

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 1

Hàm oci_parse () phân tích lại câu lệnh.

Xem lại mã trong $ home/public_html/query.php

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 2

Xem lại mã trong $ home/public_html/query.php$HOME/public_html/trans_autocommit.php

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 3

Hàm oci_parse () phân tích lại câu lệnh.trans1.php in that there is no OCI_DEFAULT when the data is inserted.  This means the new data is committed by the oci_execute() call.

Xem lại mã trong $ home/public_html/query.php

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 4

Hàm oci_parse () phân tích lại câu lệnh.

Xem lại mã trong $ home/public_html/query.php

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 2

Hàm oci_parse () phân tích lại câu lệnh.

Xem lại mã trong $ home/public_html/query.php

Hàm oci_parse () phân tích lại câu lệnh.$HOME/public_html/trans_time_autocommit.php

Hàm OCI_execute () thực thi câu lệnh phân tích cú pháp.

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 6

Hàm OCI_Fetch_Array () truy xuất một hàng kết quả của truy vấn dưới dạng mảng kết hợp và bao gồm các null.

Hàm HTMLENTITY () thoát khỏi bất kỳ văn bản nào giống với các thẻ HTML để nó hiển thị chính xác trong trình duyệt.trans_autocommit.php.

Từ trình duyệt web của bạn, hãy nhập URL sau để hiển thị đầu ra: Your time values may differ depending on the hardware resources you are using.

Bây giờ xem lại tập lệnh trans_time_explicit.php. Sự khác biệt duy nhất trong tập lệnh này là trong hàm do_insert () OCI_Default đã được thêm vào để nó không tự động cam kết và một cam kết rõ ràng đã được thêm vào sau khi vòng chèn: trans_time_explicit.php script. The only difference in this script is that in the do_insert() function OCI_DEFAULT has been added so it doesn't automatically commit, and an explicit commit has been added after the insertion loop:

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 7

Tải URL //localhost/~phphol/trans_time_explicit.php. Thời gian chèn là ít hơn.

Nói chung, bạn muốn tất cả hoặc không có dữ liệu của bạn cam kết. Thực hiện kiểm soát giao dịch của riêng bạn có hiệu suất và lợi ích tích hợp dữ liệu.

Lưu ý: Giá trị thời gian của bạn có thể khác nhau tùy thuộc vào tài nguyên phần cứng bạn đang sử dụng. Your time values may differ depending on the hardware resources you are using.

Sử dụng các thủ tục được lưu trữ

PL/SQL là mở rộng ngôn ngữ thủ tục của Oracle cho SQL. Các quy trình và chức năng PL/SQL được lưu trữ trong cơ sở dữ liệu. Sử dụng PL/SQL cho phép tất cả các ứng dụng cơ sở dữ liệu tái sử dụng logic, bất kể ứng dụng truy cập cơ sở dữ liệu như thế nào. Nhiều hoạt động liên quan đến dữ liệu có thể được thực hiện trong PL/SQL nhanh hơn so với trích xuất dữ liệu vào một chương trình (ví dụ: PHP) và sau đó xử lý nó. Oracle cũng hỗ trợ các thủ tục lưu trữ Java.s reuse logic, no matter how the application accesses the database. Many data-related operations can be performed in PL/SQL faster than extracting the data into a program (for example, PHP) and then processing it. Oracle also supports Java stored procedures.

Trong hướng dẫn này, bạn sẽ tạo một quy trình được lưu trữ PL/SQL và gọi nó trong tập lệnh PHP. Thực hiện các bước sau:

.

.

.

.

.

.

.

Bắt đầu SQL*Plus và tạo một bảng mới, PTAB với lệnh sau:ptab with the following command:

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 8

Trong SQL*Plus, hãy tạo một quy trình được lưu trữ, MyProc, để chèn dữ liệu vào bảng PTAB, với các lệnh sau:myproc, to insert data into the ptab table, with the following commands:

create sequence emp_id_seq start with 400; create trigger my_emp_id_trigger before insert on employees for each row begin select emp_id_seq.nextval into :new.employee_id from dual; end; / -- -- Also to simplify the example we remove this trigger otherwise -- records can only be updated once without violating the -- PYTHONHOL.JHIST_EMP_ID_ST_DATE_PK constraint -- drop trigger update_job_history; -- -- Allow employees to be changed when testing the lab after hours. -- drop trigger secure_employees; 9

Xem lại mã trong $ home/public_html/Proc.php$HOME/public_html/proc.php

oci8.connection_class = MYPHPAPP 0

Từ trình duyệt web, nhập URL sau để hiển thị đầu ra:

oci8.connection_class = MYPHPAPP 1

Tập lệnh PHP đã tạo ra một hàng mới trong bảng PTAB bằng cách gọi quy trình được lưu trữ MyProc. Bảng PTAB có một hàng mới với các giá trị "MyData" và 123.ptab table by calling the stored procedure myproc. The table ptab has a new row with the values "mydata" and 123.

Chuyển sang phiên SQL*Plus của bạn và truy vấn bảng để hiển thị hàng mới:

chọn * từ ptab;

Mở rộng Proc.php để sử dụng một biến liên kết. Thay đổi Proc.php thành phần sau (thay đổi in đậm):proc.php to use a bind variable. Change proc.php to the following (changes are in bold):

oci8.connection_class = MYPHPAPP 2

Hàm OCI_BIND_BY_NAME () liên kết biến PHP $ V thành ": BV" và thử nghiệm Thay đổi giá trị được chèn bằng cách thay đổi giá trị trong $ v.oci_bind_by_name() function binds the PHP variable $v to ":bv" and experiment changing the value inserted by changing the value in $v.

Chạy lại url sau:

oci8.connection_class = MYPHPAPP 1

Chuyển sang phiên SQL*Plus của bạn và truy vấn bảng một lần nữa để hiển thị hàng mới:

chọn * từ ptab;

Các chức năng được lưu trữ PL/SQL cũng thường được sử dụng trong Oracle. Trong sql*plus, hãy tạo hàm được lưu trữ PL/SQL myFunc () để chèn một hàng vào bảng PTAB và trả về gấp đôi giá trị chèn:myfunc()to insert a row into the ptab table, and return double the inserted value:

oci8.connection_class = MYPHPAPP 4

Xem lại mã trong $ home/public_html/func.php$HOME/public_html/func.php

oci8.connection_class = MYPHPAPP 5

Vì một giá trị đang được trả về, tham số độ dài tùy chọn thành OCI_BIND_BY_NAME () được đặt thành 10 để PHP có thể phân bổ số lượng bộ nhớ chính xác để giữ tới 10 chữ sốoci_bind_by_name() is set to 10 so PHP can allocate the correct amount of memory to hold up to 10 digits

Chạy lại url sau:

oci8.connection_class = MYPHPAPP 6

Chuyển sang phiên SQL*Plus của bạn và truy vấn bảng một lần nữa để hiển thị hàng mới:

chọn * từ ptab;

.

.

.

.

.

.

Các chức năng được lưu trữ PL/SQL cũng thường được sử dụng trong Oracle. Trong sql*plus, hãy tạo hàm được lưu trữ PL/SQL myFunc () để chèn một hàng vào bảng PTAB và trả về gấp đôi giá trị chèn:$HOME/public_html/fetch_prefetch.sql

oci8.connection_class = MYPHPAPP 7

Xem lại mã trong $ home/public_html/func.php

Vì một giá trị đang được trả về, tham số độ dài tùy chọn thành OCI_BIND_BY_NAME () được đặt thành 10 để PHP có thể phân bổ số lượng bộ nhớ chính xác để giữ tới 10 chữ số

Cải thiện hiệu suất truy vấn

Phần này cho thấy một số cách để cải thiện hiệu suất truy vấn. Thực hiện các bước sau:$HOME/public_html/fetch_prefetch.php

oci8.connection_class = MYPHPAPP 8

Xem lại SQL trong $ home/public_html/fetch_prefetch.sql

Kịch bản này tạo ra một bảng với một số lượng lớn các hàng. Từ phiên SQLPLUS của bạn, hãy chạy như sau:

Kết nối PHPHOL/Chào mừng

oci8.connection_class = MYPHPAPP 9

@fetch_prefetch

Xem lại mã trong $ home/public_html/fetch_prefetch.phpphp.ini. Prior to PHP 5.3, the default prefetch size was 10 rows. In 5.3, it is 100 rows. You should choose a suitable default value for your application, and use oci_set_prefetch() for specific queries that need a different value.

Điều này thực hiện cùng một truy vấn với các kích thước trước khác nhau. Giới thiệu trước là một hình thức đệm hàng bên trong. Số lượng hàng trong bộ đệm là giá trị trước. Giá trị trước càng lớn, số lượng truy cập cơ sở dữ liệu vật lý càng ít để trả lại tất cả dữ liệu cho PHP, bởi vì mỗi yêu cầu vật lý cơ bản cho cơ sở dữ liệu trả về nhiều hơn một hàng. Điều này có thể giúp cải thiện hiệu suất. Mã PHP không cần thay đổi để xử lý các kích thước trước khác nhau. Bộ đệm được xử lý bằng mã Oracle.

Bộ trợ giúp tập lệnh được bao gồm bao gồm các hàm thời gian đơn giản () và hết thời gian (), cũng như một số hàm thiết lập bổ sung được sử dụng sau này.oci_bind_array_by_name() function that allows a PHP array to be retrieved from, or passed to, a PL/SQL procedure.

Tải URL sau để hiển thị đầu ra:$HOME/public_html/fetch_bulk.sql

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>0

Tải lại một vài lần để xem thời gian trung bình. Giá trị thời gian của bạn có thể khác nhau tùy thuộc vào tài nguyên phần cứng của bạn, v.v.BIGTAB using a PL/SQL BULK COLLECT statement, and returns the results in a PL/SQL array. From your sqlplus session, run the following:

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>1

Xem lại mã trong $ home/public_html/fetch_bulk.php$HOME/public_html/fetch_bulk.php

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>2

Mã này gọi gói PL/SQL và liên kết một biến PHP để giữ mảng dữ liệu được trả về. Không cần cuộc gọi tìm nạp OCI8.

Tải URL sau để hiển thị đầu ra:

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>3

Tải lại một vài lần để xem thời gian trung bình.

Binding mảng là một kỹ thuật hữu ích để giảm chi phí cơ sở dữ liệu khi chèn hoặc truy xuất dữ liệu.

Ví dụ này không in kết quả trả lại. Nếu bạn muốn xem chúng, hãy thêm "var_dump ($ res);" Trước câu lệnh trả về chức năng. Đầu ra cho thấy các chuỗi dữ liệu 20 ký tự ngẫu nhiên được tạo bởi fetch_prefetch.sql, mà bạn đã chạy trước đó.var_dump($res);" before the function return statement. The output shows the random 20-character data strings created by fetch_prefetch.sql, which you ran earlier.

Sử dụng LOB: Tải lên và truy vấn hình ảnh

Các cột đối tượng lớn của ký tự Oracle (CLOB) và các cột đối tượng lớn nhị phân (BLOB) (và các biến PL/SQL) có thể chứa một lượng dữ liệu rất lớn. Có nhiều cách khác nhau để tạo chúng để tối ưu hóa lưu trữ Oracle. Ngoài ra còn có một gói được cung cấp trước DBMS_LOB giúp thao túng chúng trong PL/SQL dễ dàng.DBMS_LOB that makes manipulating them in PL/SQL easy.

Để tạo một ứng dụng nhỏ để tải và hiển thị hình ảnh vào cơ sở dữ liệu, hãy thực hiện các bước sau.

.

.

.

.

.

.

.

Trước khi thực hiện phần này, hãy tạo một bảng để lưu trữ một đốm màu. Trong SQL*Plus đã đăng nhập dưới dạng PHPHOL, thực thi các lệnh sau:phphol, execute the following commands:

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>4

Xem lại mã trong $ home/public_html/blobins.php$HOME/public_html/blobins.php

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>5

Điều này cho thấy mã HTML được nhúng trong nhiều khối PHP. Cụ thể, câu lệnh PHP 'IF' bao quanh mã HTML. Lần đầu tiên tập lệnh được tải, biểu mẫu tải lên HTML được hiển thị. PHP đã điền vào tên hành động biểu mẫu để gọi cùng một tập lệnh.

Có một mối quan hệ trực tiếp giữa tên biểu mẫu HTML Tên = "lob_upload" và biến PHP đặc biệt $ _files ['lob_upload']. Khi biểu mẫu được gọi với dữ liệu, tập lệnh sẽ xóa bất kỳ hình ảnh hiện có nào khỏi bảng và chèn hình ảnh mới.name="lob_upload" and the special PHP variable $_FILES['lob_upload']. When the form is called with data, the script deletes any existing image from the table, and inserts the new picture.

Kịch bản hiển thị việc sử dụng oci_new_descriptor () được liên kết với vị trí trống_blob (). Phương thức lob-> saveFile () chèn hình ảnh vào hàng mới được tạo. Lưu ý tùy chọn OCI_DEFAULT cho OCI_EXECUTE () là cần thiết cho phương thức LOB tiếp theo hoạt động.oci_new_descriptor() which is bound to the empty_blob() location. The LOB->savefile() method inserts the picture to the newly created row. Note the OCI_DEFAULT option to oci_execute() is necessary for the subsequent LOB method to work.

Từ trình duyệt web của bạn, hãy nhập URL sau để hiển thị đầu ra:

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>6

Nó hiển thị một biểu mẫu web với các nút duyệt và tải lên. Nhấp vào Duyệt.Browse.

Chọn Oracle.jpg từ thư mục/home/phphol/public_html và nhấp vào mở.oracle.jpg from the /home/phphol/public_html directory and click Open.

Nhấp vào Tải lên.Upload.

Hành động biểu mẫu gọi tập lệnh là lần thứ hai, nhưng bây giờ biến đặc biệt $ _files ['lob_upload'] đã được đặt và hình ảnh được tải lên. Thông điệp Echo thành công được hiển thị.$_FILES['lob_upload'] is set and picture is uploaded. The successful echo message is displayed.

Hình ảnh đã được tải lên máy chủ web.

Để hiển thị hình ảnh, hãy xem lại mã trong $ home/public_html/blobview.php$HOME/public_html/blobview.php

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>7

Từ trình duyệt web của bạn, hãy nhập URL sau để hiển thị đầu ra:

<?php // Create connection to Oracle $conn = oci_connect("phphol", "welcome", "//localhost/orcl"); if (!$conn) { $m = oci_error(); echo $m['message'], "\n"; exit; } else { print "Connected to Oracle!"; } // Close the Oracle connection oci_close($conn); ?>8

Nó hiển thị một biểu mẫu web với các nút duyệt và tải lên. Nhấp vào Duyệt.

Chủ đề