介绍: 

cx_Oracle 包为 Python API 提供了访问 Oracle 数据库的工具。
您可以使用 pip 命令安装此软件包。
Python 程序调用 cx_Oracle 函数。python 和 oracle 之间的连接是使用 cx_oracle inbuild Oracle 客户端库建立的。
用户应在机器上安装 Oracle 客户端库。

cx_Oracle 包安装

给定的命令将用于安装 cx_Oracle 包。
需要 oracle 客户端库来执行与数据库的 python 应用程序连接。

pip install cx_Oracle

我们如何与 Oracle 建立联系?

要访问 oracle 数据库,我们需要导入 cx_Oracle 包。
与 oracle 建立连接需要用户名、密码和连接字符串。
cx_Oracle 连接方法将用于传递您在 tnsnames.ora 文件中配置的用户名、密码和连接字符串。

import cx_Oracle

# connection string 
con = cx_Oracle.connect('pydb/pydb@xe')
print(con.version)
con.close()

为什么要关闭连接?

需要关闭程序占用的资源。
资源需要显式关闭以释放数据库资源。
这是强制关闭所有资源的必要条件。

我们如何使用 cx_Oracle 在 Oracle 数据库中创建表?

从连接创建一个游标对象。
要在数据库中创建雇员表,需要准备 SQL 语句。
要执行 oracle SQL 语句,将使用 cx_Oracle 执行游标方法。

以下是创建表的步骤:

创建连接对象
定义游标
构造查询字符串以创建表
将 oracle 查询传递给游标的执行方法
定义异常以捕获错误。
关闭连接

import cx_Oracle

try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # Create a cursor
   cursor = con.cursor()
   sql = """create table emp
                  (emp_id number(3),
                  emp_name varchar(30),
                  salary number(6))"""
   #Execute sql statement
   cursor.execute(sql)
   print("Emp table created successfully")
   
except cx_Oracle.DatabaseError as e:
   print("Problem connecting to Oracle", e)
finally:
    # Close connection
    cursor.close()
    con.close()

我们如何使用 cx_Oracle 将单个和多个记录插入到 oracle 表中?

从连接创建一个游标对象。该游标将执行数据库插入操作。
将构建具有表和列名称的 SQL 插入语句以执行操作。

将单条记录插入数据库的步骤:

创建连接对象
定义游标
构造 oracle 查询以在表中执行插入记录操作
将 oracle 查询传递给 cx_Oracle 游标的执行方法
执行提交以保存更改

向数据库表中插入多条记录的步骤:

创建要插入数据库的记录列表。
创建一个循环并遍历每条记录。
执行插入语句一一
提交更改

import cx_Oracle

try:
   
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   # Define sql statement
   sql = "insert into emp values(100,'Martin',200)"
   # Execute the SQL statement
   cursor.execute(sql)
   # Do the commit operation
   con.commit()
   print("Table record created successfully")
   
   # create a cursor
   cursor = con.cursor()
   #Prepare record list
   employee_list = [(103, 'Neck', 5000), (104, 'Jones', 5500), (105,'Charl', 6000)]
   # Iterate loop over a single employee
   for emp_rec in employee_list:
        # Execute the SQL statement
        cursor.execute("""insert into emp(emp_id,emp_name,salary)
           values(:emp_id,:emp_name,:salary)"""
                       , {'emp_id': emp_rec[0], 'emp_name': emp_rec[1],
                       'salary': emp_rec[2]})
   # do the commit
   con.commit()
   print("Multiple records are created successfully")
   
except cx_Oracle.DatabaseError as e:
   print("Problem connecting to Oracle", e)

finally:
    # close connection
    cursor.close()
    con.close()

我们如何使用 cx_Oracle 从 python 中的数据库中获取记录?

以下是将单个记录插入表的步骤:

创建连接对象
定义游标
构造oracle查询以在数据库中执行选择记录操作。
将 oracle 查询字符串传递给 cx_Oracle 游标的执行方法
检索到的数据库记录存储在游标中。
使用 for 循环一次打印一条记录。
fetchall 方法将用于从游标中获取所有记录。
使用 fetchall 方法,所有数据库记录将在一次运行中显示。

import cx_Oracle

try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   # prepare the sql statement
   sql = "select * from emp"
   # execute the sql statement
   cursor.execute(sql)
   # Now print single result at a time
   for rows in cursor:
       print(rows)
   
   # display records using fetchall
   cursor.execute(sql)
   # using fetchall get all records from cursor
   result = cursor.fetchall()
   # display result
   print(result)
   
except cx_Oracle.DatabaseError as e:
   print("Problem in database operation", e)
finally:
   # Close connection
    cursor.close()
    con.close()

如何使用 cx_Oracle 在 python 中执行 oracle 匿名块?

以下是将一条记录插入到 oracle 表中的步骤:

创建一个 cx_Oracle 连接对象定义
一个游标
构造一个匿名块
执行

import cx_Oracle

try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   # develop anonymous block
   statement = """
    begin
        delete from emp;
        insert into emp (emp_id, emp_name,salary)
        values (201, 'Duke',9000);
        insert into emp (emp_id, emp_name,salary)
        values (202, 'Pepe',5000);
        commit;
        end;"""
   # execute commit statement 
   cursor.execute(statement)
   print("Anonymous block executed successfully")
   
except cx_Oracle.DatabaseError as e:
   print("Problem in database operation", e)
finally:
   # Close connection
    cursor.close()
    con.close()

我们如何从 python 调用 oracle 函数?

下面是我们从 emp 表中选择数据并返回员工姓名列值的 oracle 函数。
该函数接受员工 ID 作为输入参数,并根据该数据获取数据。

create or replace function get_emp_name(in_emp_id in number) 
   return varchar2
   is 
   vemp_name varchar2(30);
begin 
      -- fetch employee name based on passed employee id
      Select emp_name 
      into vemp_name
      from emp
      where emp.emp_id = in_emp_id;

      -- return employee name  
      return(vemp_name); 
end;

下面是 oracle 函数,其中员工 id 是输入参数,员工姓名是输出参数,并返回工资列值。
get_emp_details 将 emp 名称作为输出参数,将薪水作为返回参数。

create or replace function get_emp_details(in_emp_id in number,
                                           out_emp_name out varchar2) 
   return number
   is 
   vsalary number(5);
begin 
      -- fetch employee name based on passed employee id
      Select emp_name,salary 
      into out_emp_name,vsalary
      from emp
      where emp.emp_id = in_emp_id;

      -- return employee salary  
      return(vsalary); 
end;

调用oracle函数并显示输出结果的步骤:

创建一个 cx_Oracle 连接对象
定义一个游标
创建一个员工 ID cx_Oracle 对象以将其作为输入参数传递给函数。
创建一个 cx_Oracle 字符串对象变量来存储 oracle 返回的变量。
使用callfunc游标方法以 emp id 作为输入参数调用 oracle 函数,并接收 emp 名称作为输出参数。

以下是调用 oracle 函数并接受输出和返回参数的步骤。

创建一个 cx_Oracle 字符串对象变量来存储 oracle 返回的变量。
调用 get_emp_details 函数并接受函数返回和输出参数值。
我们可以使用 get value 方法显示接收到的输出参数。

import cx_Oracle

try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   # define employee id
   emp_id = 201
   # define object to store string return value
   vemp_name = cursor.var(cx_Oracle.STRING)
   # call procedure with parameter
   cursor.callfunc('get_emp_name',vemp_name,[emp_id])
   # print return employee name
   print('return emp_name:',vemp_name.getvalue())
   
   # define object to store integer return value
   vemp_name = cursor.var(cx_Oracle.STRING)
   # call procedure with parameter
   vemp_salary = cursor.callfunc('get_emp_details',int,[emp_id,vemp_name])
   # print the return employee name and salary
   print('return emp_name:',vemp_name.getvalue(),' and employee salary:',vemp_salary)
   
except cx_Oracle.DatabaseError as e:
   print("Problem in database operation", e)
finally:
    # Close connection
    cursor.close()
    con.close()

我们如何从 python 调用 oracle 过程?

下面是 oracle 过程 proc_get_emp_details 使用它,我们将为给定的 emp id、emp name 和salary 参数执行插入操作。
执行选择操作以获取员工详细信息。

create or replace procedure proc_get_emp_details(in_emp_id in number,
                                            in_emp_name in varchar2,
                                            in_emp_salary in number,
                                            out_emp_name out varchar2) 
is 
begin 
      -- perform the ins operation
      insert into emp(emp_id,emp_name,salary)
      values(in_emp_id,in_emp_name,in_emp_salary);
      commit;

      -- fetch employee name based on passed employee id
      Select emp_name 
      into out_emp_name
      from emp
      where emp.emp_id = in_emp_id;
      
end;

调用 oracle 过程并显示输出的步骤:

创建cx_Oracle 连接对象
定义连接游标
定义emp id、emp name 和salary cx_Oracle 对象以在数据库中执行插入操作。
存储返回输出变量,请创建一个 cx_Oracle 字符串对象。
使用员工 ID、员工姓名和薪水输入参数调用过程 proc_get_emp_details,并接受员工姓名输出参数。

import cx_Oracle
try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   
   # Defined objects for insert statement
   emp_id = 203
   emp_name = 'Pep'
   emp_salary = 6000
   
   # define object to store string return value
   vemp_name = cursor.var(cx_Oracle.STRING)
   
   # add a new employee
   cursor.callproc('proc_get_emp_details',[emp_id, emp_name, emp_salary,vemp_name])
   print('Return emp_name:',vemp_name.getvalue())
   
except cx_Oracle.DatabaseError as e:
   print("Problem in DB operation", e)
finally:
    # close db connections
    cursor.close()
    con.close()

我们如何从 python 调用 oracle 包?

在 oracle 包 pkg_emp_details 中,我们在包规范部分定义了一个过程和一个函数。
在 oracle 包正文中,在一个过程中,我们正在更新给定员工 id 输入参数的薪水。
在函数中,我们根据员工 ID 检索员工姓名。

create or replace package pkg_emp_details
as
procedure update_record (in_emp_id in number,
                         in_emp_salary in number);
function fn_get_emp_name (in_emp_id in number) return varchar2;
end pkg_emp_details;
/

create or replace package body pkg_emp_details IS
  
   procedure update_record (in_emp_id in number,
                            in_emp_salary in number)
      as
   begin
      update emp
        set salary = in_emp_salary
       where emp_id = in_emp_id;

      commit;
   end update_record;

  
   function fn_get_emp_name (
      in_emp_id       in number
   ) return varchar2 
   IS
      vemp_name   varchar2(30);
   begin

      -- fetch employee name based on passed employee id
      Select emp_name
      into vemp_name
      from emp
      where emp_id = in_emp_id;

      -- return employee name  
      return(vemp_name); 

   end fn_get_emp_name;

end pkg_emp_details;
/

调用 oracle 包并显示输出结果的步骤:

创建连接对象
定义游标
定义员工 ID 和薪水对象变量以更新员工数据。
使用emp id 和salary 输入参数调用oracle 过程。
创建一个 cx_Oracle 字符串对象变量来存储函数输出变量。
fn_get_emp_name 函数检索给定 emp id 的 emp 名称。

import cx_Oracle
try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   # Defined objects for update statement
   emp_id = 203
   emp_salary = 25000
   
   # update a employee salary
   cursor.callproc('pkg_emp_details.update_record',[emp_id,emp_salary])
   # define object to store string return value
   vemp_name = cursor.var(cx_Oracle.STRING)
   # call procedure with parameter
   cursor.callfunc('pkg_emp_details.fn_get_emp_name',vemp_name,[emp_id])
   # print return employee name
   print('return emp_name:',vemp_name.getvalue())
   
except cx_Oracle.DatabaseError as e:
   print("Problem in DB operation", e)
finally:
    # close db connections
    cursor.close()
    con.close()

我们如何在python中处理oracle ref cursor?

Oracle 函数 get_emp_data 返回引用游标中的值。
在这个函数中,我们正在获取员工表记录。

create or replace FUNCTION get_emp_data
   RETURN SYS_REFCURSOR
AS
   c_employee SYS_REFCURSOR;
BEGIN

   OPEN c_employee FOR 
   SELECT 
      emp_id, 
      emp_name, 
      salary
   FROM 
      emp 
   ORDER BY 
         emp_id;

   RETURN c_employee;
END;

以下是调用 oracle 包的步骤:

创建一个 cx_Oracle 连接对象
定义一个游标
创建一个 cx_Oracle 游标对象来存储get_emp_data函数返回记录。
创建一个 emp_data 对象来存储返回的员工数据。
使用 for 循环,我们遍历每条记录并显示记录。

import cx_Oracle

try:
   # Connecting to DB
   con = cx_Oracle.connect('pydb/pydb@xe')
   # create a cursor
   cursor = con.cursor()
   
   # define object to store string return value
   vemp_data = cursor.var(cx_Oracle.CURSOR)
   
   # add a new pet
   cursor.callfunc('get_emp_data',vemp_data)
   emp_data = vemp_data.getvalue()
   
   for emp_rec in emp_data:
       print('emp_id:',emp_rec[0],' emp_name: ',emp_rec[1], 'salary:',emp_rec[2])
       
except cx_Oracle.DatabaseError as e:
   print("Problem in database operation", e)
   
finally:
    # close the connection
    cursor.close()
    con.close()
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐