108 lines
4.2 KiB
Python
108 lines
4.2 KiB
Python
#------------------------------------------------------------------------------
|
|
# Copyright 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
|
#
|
|
# Portions Copyright 2007-2015, Anthony Tuininga. All rights reserved.
|
|
#
|
|
# Portions Copyright 2001-2007, Computronix (Canada) Ltd., Edmonton, Alberta,
|
|
# Canada. All rights reserved.
|
|
#------------------------------------------------------------------------------
|
|
|
|
#------------------------------------------------------------------------------
|
|
# Editioning.py
|
|
# This script demonstrates the use of editioning, available in Oracle
|
|
# Database 11.2 and higher. See the Oracle documentation on the subject for
|
|
# additional information. Adjust the contants at the top of the script for
|
|
# your own database as needed.
|
|
#------------------------------------------------------------------------------
|
|
|
|
from __future__ import print_function
|
|
|
|
import cx_Oracle
|
|
|
|
# define constants used throughout the script; adjust as desired
|
|
USER_NAME = "CX_ORACLE_TESTEDITIONS"
|
|
PASSWORD = "dev"
|
|
DBA_USER_NAME = "system"
|
|
DBA_PASSWORD = ""
|
|
DSN = ""
|
|
EDITION_NAME = "CX_ORACLE_E1"
|
|
|
|
# create user dropping it first, if necessary
|
|
connection = cx_Oracle.Connection(DBA_USER_NAME, DBA_PASSWORD, DSN)
|
|
cursor = connection.cursor()
|
|
cursor.execute("""
|
|
select username
|
|
from dba_users
|
|
where username = :name""",
|
|
name = USER_NAME)
|
|
names = [n for n, in cursor]
|
|
for name in names:
|
|
print("Dropping user", name)
|
|
cursor.execute("drop user %s cascade" % name)
|
|
print("Creating user", USER_NAME)
|
|
cursor.execute("create user %s identified by %s" % (USER_NAME, PASSWORD))
|
|
cursor.execute("grant create session, create procedure to %s" % USER_NAME)
|
|
cursor.execute("alter user %s enable editions" % USER_NAME)
|
|
|
|
# create edition, dropping it first, if necessary
|
|
cursor.execute("""
|
|
select edition_name
|
|
from dba_editions
|
|
where edition_name = :name""",
|
|
name = EDITION_NAME)
|
|
names = [n for n, in cursor]
|
|
for name in names:
|
|
print("Dropping edition", name)
|
|
cursor.execute("drop edition %s" % name)
|
|
print("Creating edition", EDITION_NAME)
|
|
cursor.execute("create edition %s" % EDITION_NAME)
|
|
cursor.execute("grant use on edition %s to %s" % (EDITION_NAME, USER_NAME))
|
|
|
|
# now connect to the newly created user and create a procedure
|
|
connection = cx_Oracle.Connection(USER_NAME, PASSWORD, DSN)
|
|
print("Edition should be None at this point, actual value is",
|
|
connection.edition)
|
|
cursor = connection.cursor()
|
|
cursor.execute("""
|
|
create or replace function TestEditions return varchar2 as
|
|
begin
|
|
return 'Base Edition';
|
|
end;""")
|
|
result = cursor.callfunc("TestEditions", str)
|
|
print("Function call should return Base Edition, actually returns", result)
|
|
|
|
# next, change the edition and recreate the procedure in the new edition
|
|
cursor.execute("alter session set edition = %s" % EDITION_NAME)
|
|
print("Edition should be %s at this point, actual value is" % EDITION_NAME,
|
|
connection.edition)
|
|
cursor.execute("""
|
|
create or replace function TestEditions return varchar2 as
|
|
begin
|
|
return 'Edition 1';
|
|
end;""")
|
|
result = cursor.callfunc("TestEditions", str)
|
|
print("Function call should return Edition 1, actually returns", result)
|
|
|
|
# next, change the edition back to the base edition and demonstrate that the
|
|
# original function is being called
|
|
cursor.execute("alter session set edition = ORA$BASE")
|
|
result = cursor.callfunc("TestEditions", str)
|
|
print("Function call should return Base Edition, actually returns", result)
|
|
|
|
# the edition can be set upon connection
|
|
connection = cx_Oracle.Connection(USER_NAME, PASSWORD, DSN,
|
|
edition = EDITION_NAME)
|
|
cursor = connection.cursor()
|
|
result = cursor.callfunc("TestEditions", str)
|
|
print("Function call should return Edition 1, actually returns", result)
|
|
|
|
# it can also be set via the environment variable ORA_EDITION
|
|
os.environ["ORA_EDITION"] = EDITION_NAME
|
|
connection = cx_Oracle.Connection(USER_NAME, PASSWORD, DSN)
|
|
print("Edition should be %s at this point, actual value is" % EDITION_NAME,
|
|
connection.edition)
|
|
cursor = connection.cursor()
|
|
result = cursor.callfunc("TestEditions", str)
|
|
print("Function call should return Edition 1, actually returns", result)
|
|
|