Chèn Oracle Python

Trang này dựa trên mô-đun mở rộng cx_oracle Python. Nó được phát triển trên máy ảo chạy Oracle Enterprise Linux 6U4 chạy Oracle 11. 2. 0. 4 và Trăn 2. 6. 6

Cài đặt và cấu hình

Giả sử Python 2. 6 đã được cài đặt, công việc đầu tiên là cài đặt mô-đun cx_oracle. Tại thời điểm viết bài, phiên bản hiện tại vẫn là 5. 1. 3 mà các tệp nhị phân có sẵn cho cả Windows và Linux. Đối với các nền tảng khác, các nguồn có thể được tải xuống và biên dịch

Tôi đã tải xuống phiên bản 5. 1. 2 từ http. //nguồnforge. net/projects/cx-oracle/files có sẵn RPM sau. Đây là trận đấu gần nhất với môi trường của tôi

cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm

Cài đặt là tiêu chuẩn. Là người dùng root

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm

VM của tôi đã chứa Oracle 11. 2. 0. 4 Enterprise Edition với cơ sở dữ liệu có tên "TARGET". Tôi đặt các biến môi trường sau trong. bash_profile

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET

Tôi hiếm khi cần đặt $LD_LIBRARY_PATH, nhưng trong trường hợp này, cần tránh gây ra lỗi sau khi nhập cx_Oracle

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory

Sự chuẩn bị

cx_oracle hỗ trợ nhiều phương thức kết nối khác nhau. Nếu có thể, tôi muốn sử dụng bí danh TNS với máy khách Oracle vì bí danh có thể được định cấu hình để sử dụng cân bằng tải kết nối, chuyển đổi dự phòng, v.v. Đối với bài đăng này, máy ảo của tôi được gọi là vm16, vì vậy mục nhập trong $ORACLE_HOME/network/admin/tnsnames. ora là

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)

Tập lệnh mẫu

Sau đây là đoạn script hoàn chỉnh kết nối với cơ sở dữ liệu, thực thi câu lệnh tổng hợp SELECT đơn giản và trả về kết quả

#!/usr/bin/python
# Example of fetchone

import sys
import cx_Oracle

def printf (format,*args):
  sys.stdout.write (format % args)

def printException (exception):
  error, = exception.args
  printf ("Error code = %s\n",error.code);
  printf ("Error message = %s\n",error.message);

username = 'scott'
password = 'tiger'
databaseName = "TARGET"

try:
  connection = cx_Oracle.connect (username,password,databaseName)
except cx_Oracle.DatabaseError, exception:
  printf ('Failed to connect to %s\n',databaseName)
  printException (exception)
  exit (1)

cursor = connection.cursor ()

try:
  cursor.execute ('SELECT COUNT(*) FROM emp')
except cx_Oracle.DatabaseError, exception:
  printf ('Failed to select from EMP\n')
  printException (exception)
  exit (1)

count = cursor.fetchone ()[0]
printf ('Count = %d\n',count)

cursor.close ()

connection.close ()

exit (0)

Đoạn mã trên được thảo luận trong các phần sau

câu lệnh printf

Python không bao gồm câu lệnh printf. Tuy nhiên chức năng thư viện sau đây cung cấp chức năng tương tự

import sys

def printf (format,*args):
  sys.stdout.write (format % args)

Điều này có thể được gọi bằng cú pháp C quen thuộc. Ví dụ

printf ("Str %s Int %d\n",s,i)

hàm printException

Tôi cũng đã tạo một chức năng để in chi tiết về bất kỳ ngoại lệ nào được đưa ra khi truy cập cơ sở dữ liệu

________số 8_______

Sự liên quan

Kết nối yêu cầu tên người dùng, mật khẩu và bí danh TNS

username = 'scott'
password = 'tiger'
databaseName = "TARGET"

Kinh nghiệm đã chứng minh rằng thực thi tốt các phương thức cx_oracle để truy cập cơ sở dữ liệu trong một lần thử. cấu trúc ngoại trừ để nắm bắt và báo cáo bất kỳ ngoại lệ nào mà họ có thể ném. Hàm printException in chi tiết hơn

Đối với kết nối tôi đã sử dụng đoạn mã sau

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
0

Kết nối nên được đóng lại khi không còn cần thiết sử dụng

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
1

Bạn nên phát triển mã xử lý ngoại lệ ngay từ đầu, sau đó hầu hết có thể được sử dụng lại cho các lệnh gọi phương thức cx_oracle khác. Hãy nhớ khôi phục mọi giao dịch chưa được cam kết, đóng con trỏ và đóng mọi kết nối khi ngoại lệ được đưa ra

Ngoài ra, hãy cân nhắc sử dụng mệnh đề cuối cùng trong câu lệnh thử. Mệnh đề cuối cùng của câu lệnh thử được thực thi bất kể ngoại lệ nào có thể được nêu ra

Quản lý con trỏ

Trong phần trước chúng ta đã tạo kết nối. Bây giờ chúng ta cần tạo một con trỏ như sau

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
2

Con trỏ phải được đóng khi không còn cần sử dụng

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
3

Lớp Con trỏ có một số phương thức mạnh cho phép các câu lệnh và khối PL/SQL được chuẩn bị và thực thi

thực hiện phương thức

Con trỏ. phương thức thực thi là cách dễ nhất để thực hiện các câu lệnh đơn giản bao gồm DDL

Câu lệnh SELECT đơn giản là một tổng hợp trả về một cột trong một hàng

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
4

Chúng ta có thể kiểm tra kết quả như sau

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
5

Trong trường hợp này, phương thức tìm nạp phù hợp hơn khi chúng ta mong đợi một hàng

Ngoài ra, chúng ta có thể đã sử dụng Con trỏ. phương thức tìm nạp tìm nạp tất cả các hàng được trả về bởi câu lệnh

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
6

CHỌN câu lệnh

Phần này xem xét các ví dụ phức tạp hơn của câu lệnh SELECT. Ví dụ tiếp theo trả về nhiều hàng và cột

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
7

Tôi đã tách câu lệnh SQL khỏi lời gọi đến con trỏ. thực hiện để cải thiện khả năng đọc. Ba dấu ngoặc kép ở đầu và cuối câu lệnh SQL cho phép nó được viết trên nhiều dòng. Điều này đặc biệt quan trọng đối với các câu lệnh SQL dài hơn khi cần thụt đầu dòng. Dấu gạch chéo ngược sau dấu ngoặc kép mở đầu ngăn không cho một ký tự dòng mới được thêm vào trước dòng đầu tiên. Một ký tự xuống dòng sẽ được thêm vào các dòng còn lại cho đến dấu ngoặc kép kết thúc

Kết quả được trả về bằng Con trỏ. fetchall�phương thức trả về mảng 2 chiều. Tất cả các kết quả được trả về bằng một lệnh gọi tới hàm tìm nạp và được lưu trữ trong bộ nhớ tiến trình. Rõ ràng điều này hiệu quả khi chỉ có 14 nhân viên - nó sẽ không phù hợp với các tập kết quả lớn hơn. Trong trường hợp này, tôi đang lặp lại các kết quả, in từng dòng một. Điều này hoạt động nhưng không phải là đặc biệt có thể đọc được

Một phiên bản thay thế của mã để xử lý cuộc gọi đến con trỏ. tìm nạp () theo sau

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
8

Phiên bản này dễ đọc hơn và cần ít bộ nhớ tiến trình hơn

Biến ràng buộc

Cho đến nay các tuyên bố của chúng tôi chỉ sử dụng các giá trị theo nghĩa đen. Đây không phải là khả năng mở rộng đặc biệt trong khối lượng công việc lớn, vì vậy hầu hết các ứng dụng sử dụng các biến liên kết để giảm chi phí phân tích cú pháp

Ví dụ sau đây cho thấy một câu lệnh có một vài biến liên kết trong các vị từ

rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm
9

Trong ví dụ trên, cuộc gọi đến con trỏ. thực thi bao gồm câu lệnh sql và các giá trị cho các biến liên kết 'job' và 'dept'. Lưu ý từ biến liên kết thứ hai rằng tên biến liên kết không nhất thiết phải giống với giá trị cột

Chuẩn bị báo cáo

Trong khi các biến liên kết giảm phân tích cú pháp ở một mức độ hạn chế, chúng không thể loại bỏ hoàn toàn. Để giảm thiểu việc phân tích cú pháp, tốt nhất là gán một câu lệnh đã chuẩn bị cho một con trỏ chuyên dụng. Sau đó, không cần thiết phải phân tích lại câu lệnh cho đến khi đóng con trỏ

Trong đoạn mã sau, ví dụ biến liên kết từ phần trước đã được sửa đổi để sử dụng lệnh gọi chuẩn bị riêng

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
0

Trong ví dụ trên, câu lệnh được chuẩn bị bằng cách sử dụng con trỏ. chuẩn bị cuộc gọi và sau đó được thực hiện bởi con trỏ. thực hiện cuộc gọi

Lưu ý rằng tham số đầu tiên của con trỏ. thực hiện cuộc gọi là "Không". Điều này chỉ định rằng con trỏ nên sử dụng câu lệnh đã chuẩn bị sẵn thay vì phân tích cú pháp câu lệnh SQL mới

Ngoài ra, con trỏ. câu lệnh thực thi có thể lấy con trỏ. tuyên bố như là tham số đầu tiên. Ví dụ

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
1

con trỏ. câu lệnh trả về câu lệnh cuối cùng được phân tích cú pháp bởi con trỏ

INSERT câu lệnh

Phần này thảo luận về câu lệnh INSERT. Ví dụ đầu tiên sử dụng các biến liên kết để chèn một hàng mới vào bảng DEPT

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
2

Trong ví dụ này, các giá trị được cung cấp dưới dạng tham số cho con trỏ. phương thức thực thi ()

Lưu ý tuyên bố cam kết khi kết thúc giao dịch

Ví dụ sau sử dụng từ điển thay vì danh sách tham số

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
3

Trong ví dụ trên, một từ điển được chuyển đến con trỏ. phương thức thực thi (). Từ điển chứa các cặp tên-giá trị cho các giá trị cột được chèn vào hàng mới

Ví dụ tiếp theo minh họa việc sử dụng câu lệnh INSERT đã chuẩn bị

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
4

Như với ví dụ câu lệnh SELECT, con trỏ. phương thức thực thi có thể sử dụng con trỏ. statement() thay vì Không có, như hình bên dưới

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
5

CẬP NHẬT Tuyên bố

Phần này thảo luận về các câu lệnh CẬP NHẬT. Ví dụ đầu tiên sử dụng các biến liên kết

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
6

Trong ví dụ trên, các giá trị biến liên kết được chỉ định trong các đối số của lệnh gọi tới con trỏ. exec() Ví dụ tiếp theo sử dụng một câu lệnh chuẩn bị

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
7

Như với ví dụ câu lệnh INSERT, Con trỏ. phương thức thực thi có thể sử dụng Con trỏ. tuyên bố thay vì Không, như hình dưới đây

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
8

Tuyên bố XÓA

Phần này thảo luận về các câu lệnh DELETE. Sau đây là một ví dụ về thao tác xóa sử dụng biến liên kết

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORACLE_SID=TARGET
9

Cũng như các ví dụ trước, Con trỏ. thực thi có thể sử dụng Con trỏ. tuyên bố thay vì Không, như hình dưới đây

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
0

Hoạt động mảng

Cho đến nay, chúng tôi đã tập trung vào các câu lệnh chỉ thực hiện một lần truy cập cơ sở dữ liệu cho mỗi lần thực hiện. Tuy nhiên, nếu chúng tôi muốn ứng dụng của mình mở rộng quy mô, tại một số giai đoạn, chúng tôi sẽ cần xem xét các hoạt động hàng loạt để giảm số chuyến đi khứ hồi từ máy khách đến máy chủ. Trong phần này, chúng ta sẽ kiểm tra các kỹ thuật tạo khối cho các câu lệnh SELECT cũng như các câu lệnh INSERT, UPDATE và DELETE

câu lệnh CHỌN

Đối với các câu lệnh CHỌN, chúng ta có thể kiểm soát số lượng câu lệnh được truy xuất cho mỗi lần tìm nạp bằng Con trỏ. kích thước mảng

Câu lệnh sau đặt kích thước mảng thành 4 và sau đó truy vấn bảng EMP

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
1

Ví dụ trên bao gồm việc tạo con trỏ bằng kết nối. con trỏ () vì con trỏ phải tồn tại trước khi kích thước mảng có thể được sửa đổi

Trong ví dụ này, chúng tôi đang sử dụng Con trỏ. phương thức fetchmany để tìm nạp các hàng. Mỗi lần tìm nạp ngoại trừ lần tìm nạp cuối cùng sẽ trả về bốn hàng cho ứng dụng

Đầu ra của đoạn script trên là

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
2

Có 14 hàng trong bảng EMP

Ưu điểm của việc chỉ định kích thước mảng là máy khách có nhiều quyền kiểm soát hơn đối với việc sử dụng bộ nhớ. Chỉ các hàng được truy xuất bởi một lệnh gọi tới hàm tìm nạp, trong trường hợp này là bốn, sẽ được lưu trữ trong bộ nhớ trên máy khách. Nếu chúng ta đã sử dụng Con trỏ. tìm nạp thay vì tìm nạp nhiều, thì tất cả các hàng sẽ được trả về và sẽ cần được lưu trữ trong bộ nhớ máy khách

Tác động đến máy chủ cơ sở dữ liệu phụ thuộc vào bản chất của truy vấn. Nếu truy vấn là một thao tác đã đặt thì tất cả các hàng kết quả sẽ cần được lưu trữ trong bộ nhớ cục bộ trên máy chủ cơ sở dữ liệu cho đến khi chúng được ứng dụng tìm nạp hoặc con trỏ đã được đóng. Nếu truy vấn là thao tác hàng thì có thể chỉ cần lưu trữ đủ kết quả để đáp ứng yêu cầu tìm nạp mới nhất

Vì truy vấn trên bao gồm một mệnh đề ORDER by, nên gần như chắc chắn nó đang thực thi như một thao tác đã đặt vì không có chỉ mục trên cột ENAME

Đặt kích thước mảng sẽ kiểm soát số lượng thông báo mạng được trao đổi giữa máy khách và máy chủ

API DB khuyến nghị rằng kích thước mảng mặc định là 1. Tuy nhiên, cx_oracle bỏ qua đề xuất này và đặt giá trị mặc định là 50. Chúng ta có thể kiểm tra điều này bằng cách sử dụng

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
3

Nếu con trỏ. kích thước mảng không được đặt, thì truy vấn sẽ tìm nạp tất cả các hàng. Đầu ra sẽ là

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
4

Nếu con trỏ. kích thước mảng được đặt thành 1, thì truy vấn sẽ tìm nạp từng hàng một. Đầu ra sẽ là

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
5

Câu lệnh INSERT mảng

Ví dụ trước đã nghiên cứu việc sử dụng kích thước mảng để quản lý các lần tìm nạp từ các câu lệnh SELECT. Trong các phần sau, chúng ta sẽ thảo luận về việc sử dụng mảng với các câu lệnh INSERT, UPDATE và DELETE. Trong phần này, chúng ta sẽ đề cập đến các câu lệnh INSERT mảng

Sau đây là một ví dụ về một mảng INSERT ba hàng vào bảng DEPT

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
6

Lưu ý rằng chúng tôi đang sử dụng Con trỏ. phương thức execmany() thay vì Cursor. hành hình ()

Nếu chúng tôi bật theo dõi cho câu lệnh trên, chúng tôi có thể xác minh rằng việc chèn mảng đã được thực hiện trên máy chủ cơ sở dữ liệu

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
7

Ở trên, dòng EXEC bao gồm r=3 cho biết rằng ba hàng đã được chèn vào

Chúng ta cũng có thể gọi hàm thực thi bằng cách sử dụng con trỏ. tuyên bố như là tham số đầu tiên

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
8

Tuyên bố CẬP NHẬT mảng

Chúng ta cũng có thể sử dụng mảng với câu lệnh CẬP NHẬT. Trong ví dụ sau, chúng tôi đang sử dụng một từ điển để truyền các giá trị biến liên kết cho con trỏ. phương thức thực thi

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory
9

Một lần nữa, dấu vết cho thấy rằng cả ba hàng đã được cập nhật bằng một lần thực thi câu lệnh CẬP NHẬT

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
0

Như với ví dụ trước, dòng EXEC bao gồm r=3 cho biết rằng ba hàng đã được cập nhật

Câu lệnh DELETE mảng

Mảng cũng có thể được sử dụng với câu lệnh DELETE. Như với các câu lệnh CẬP NHẬT, ví dụ này sử dụng từ điển để chỉ định các biến liên kết

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
1

Trong ví dụ trên, mảng được sử dụng để chỉ định deptno cho từng hàng trong số ba hàng sẽ bị xóa

Như trong các ví dụ DML trước, dòng EXEC trong tệp theo dõi bao gồm r=3 chỉ ra rằng ba hàng đã bị xóa

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
2

Gọi chương trình con PL/SQL

Các thủ tục và hàm PL/SQL có thể được gọi bằng Con trỏ. callproc và con trỏ. phương thức callfunc

Thủ tục PL/SQL

Giả sử chúng ta đã tạo thủ tục PL/SQL sau

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
3

Chúng ta có thể gọi thủ tục bằng đoạn mã sau

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
4

Con trỏ. phương thức callproc chỉ định tên của thủ tục và cũng là danh sách các tham số biến liên kết

Lưu ý rằng trong ví dụ này, các biến liên kết là các tham số đầu vào

Hàm PL/SQL

Giả sử chúng ta đã tạo hàm PL/SQL sau để trả về số lượng nhân viên với một công việc cụ thể trong một bộ phận cụ thể

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
5

Để gọi hàm chúng ta sử dụng con trỏ. phương thức callfunc

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
6

Đoạn mã trên tạo một biến kết quả bằng cách sử dụng con trỏ. phương pháp var. Sau đó, nó gọi hàm PL/SQL FUNC1 chuyển công việc và deptno dưới dạng biến liên kết. Kết quả được trả về trong một đối tượng Biến và sau đó được chuyển đổi thành một số bằng cách sử dụng Biến. phương thức getvalue

Các thủ tục có tham số OUT

Nếu chương trình con PL/SQL chỉ trả về một giá trị thì nó thường được viết dưới dạng hàm. Tuy nhiên, nếu chương trình con PL/SQL cần trả về nhiều hơn một giá trị, nó thường sẽ trả về chúng dưới dạng tham số OUT

Thủ tục sau đây trả về tên nhân viên và công việc cho một mã số nhân viên cụ thể

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
7

Quy trình có một tham số đầu vào (p_empno) và hai tham số đầu ra (p_ename và p_job)

Đoạn mã sau gọi PROC2

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
8

Đoạn mã trên tạo một tham số đầu vào cho empno và hai tham số đầu ra để nhận kết quả cho ename và job. Thủ tục được gọi bằng con trỏ. phương thức callproc chỉ định tên của thủ tục (PROC2) và danh sách các tham số

Các tham số OUT được trả về dưới dạng các đối tượng Biến. biến. phương thức getvalue phải được gọi để trích xuất giá trị từ đối tượng

Các thủ tục có tham số IN-OUT

Có thể tranh luận liệu các tham số IN-OUT cho các kiểu dữ liệu đơn giản có hợp lý hay không và do đó rất khó để đưa ra một ví dụ đáng tin cậy cho cơ sở dữ liệu scott/tiger. Tuy nhiên, thường cần phải gọi các chương trình con do người khác phát triển, trong trường hợp đó chúng có thể tuân theo các tiêu chuẩn khác nhau.

Quy trình PL/SQL sau đây thêm các giá trị đã chỉ định cho SAL và COMM vào các giá trị hiện có trong bảng cho EMPNO đã chỉ định. Thủ tục PL/SQL trả về các giá trị mới trong cùng một tham số

TARGET=
(DESCRIPTION=
  (ADDRESS=(HOST=vm16)(PROTOCOL=TCP)(PORT=1521))
  (CONNECT_DATA=
    (SERVER=DEDICATED)
    (SERVICE_NAME=TARGET)
  )
)
9

Đoạn mã sau gọi thủ tục PROC3 cho EMPNO 7499

#!/usr/bin/python
# Example of fetchone

import sys
import cx_Oracle

def printf (format,*args):
  sys.stdout.write (format % args)

def printException (exception):
  error, = exception.args
  printf ("Error code = %s\n",error.code);
  printf ("Error message = %s\n",error.message);

username = 'scott'
password = 'tiger'
databaseName = "TARGET"

try:
  connection = cx_Oracle.connect (username,password,databaseName)
except cx_Oracle.DatabaseError, exception:
  printf ('Failed to connect to %s\n',databaseName)
  printException (exception)
  exit (1)

cursor = connection.cursor ()

try:
  cursor.execute ('SELECT COUNT(*) FROM emp')
except cx_Oracle.DatabaseError, exception:
  printf ('Failed to select from EMP\n')
  printException (exception)
  exit (1)

count = cursor.fetchone ()[0]
printf ('Count = %d\n',count)

cursor.close ()

connection.close ()

exit (0)
0

Đoạn mã trên đặt giá trị cho EMPNO là tham số đầu vào. Sau đó, nó tạo các đối tượng Biến cho hai tham số đầu ra và đặt giá trị ban đầu cho các tham số này bằng cách sử dụng Biến. phương pháp đặt giá trị. Tham số đầu tiên trong Con trỏ. cuộc gọi var thường sẽ là 0

Sau đó, thủ tục gọi PROC3 bằng Con trỏ. phương thức callproc. Khi thủ tục trả về, các giá trị của tham số SAL và COMM được trích xuất từ ​​các đối tượng Biến bằng cách sử dụng Biến. phương thức getvalue

Làm cách nào để chèn dữ liệu vào Oracle bằng Python?

Chèn dữ liệu vào bảng từ Python .
username = 'OT' password = '' dsn = 'localhost/pdborcl' port = 1512 encoding = 'UTF-8' .. .
sự liên quan. làm().
insert_billing(ngày giờ. bây giờ (), 1200, 1, Không có).
CHỌN * TỪ billing_headders;

Chúng ta có thể sử dụng chức năng chèn trong Oracle không?

Chèn dữ liệu . Lệnh này sẽ lấy tên bảng, cột bảng và giá trị cột làm đầu vào và chèn giá trị vào bảng cơ sở. we can insert the data into any table using the SQL command INSERT INTO. This command will take the table name, table column and column values as the input and insert the value in the base table.

Chèn Oracle là gì?

Câu lệnh INSERT thêm một hoặc nhiều hàng dữ liệu mới vào bảng cơ sở dữ liệu . Để biết mô tả đầy đủ về câu lệnh INSERT, hãy xem Tham khảo cơ sở dữ liệu SQL của Oracle.

Làm cách nào để chạy truy vấn Oracle trong Python?

Các bước kết nối Python với Oracle bằng cx_Oracle connect .
Bước 1. Cài đặt gói cx_Oracle. Nếu bạn chưa làm như vậy, hãy cài đặt gói cx_Oracle. .
Bước 2. Truy xuất thông tin kết nối. Tiếp theo, lấy thông tin kết nối. .
Bước 3. Kết nối Python với Oracle bằng cx_Oracle connect