带有 Python 的 Oracle - 如何检查列是否已存在?
Oracle with Python - How to check if column already exists?
我正在尝试从具有 python 的属性列表创建 Oracle table。遗憾的是,我有多个同名属性,因此无法将它们添加到 table。我也不希望我的程序因此而停止。
现在我正在尝试这个解决方案:
connection = cx_Oracle.connect('user/password')
cursor = connection.cursor()
if not tableExists(connection, 'TableName'):
first_column_name = next(iter(attributes), None)
query_table = 'CREATE TABLE TableName ("{}" VARCHAR2(255))'.format(first_column_name)
cursor.execute(query_table)
for attribute in attributes[1:]:
query_column= '''
DECLARE
v_column_exists number := 0;
BEGIN
Select count(*) into v_column_exists
from user_tab_cols
where upper(column_name) = "{}"
and upper(table_name) = 'TableName';
if (v_column_exists = 0) then
execute immediate 'alter table TableName add ("{}" VARCHAR2(255)))';
end if;
end;
'''.format(attribute, attribute)
cursor.execute(query_column)
我粘贴了来自 this answer. 的长查询代码 table 是按预期使用第一个属性创建的,但是当我开始添加更多列时,我得到:
Traceback (most recent call last):
File "main.py", line 52, in <module>
cursor.execute(query_column)
cx_Oracle.DatabaseError: ORA-06550: line 7, column 41:
PL/SQL: ORA-00904: "Order count [A221]": invalid identifier
ORA-06550: line 5, column 9:
PL/SQL: SQL Statement ignored
我错过了什么?
我建议简单地构建 create table 语句而不是构建 table 然后更改它以向其中添加列!
您可以使用以下代码删除列表中的重复项:
listWithoutDups = list(dict.fromkeys(listWithDups))
然后,您可以按如下方式构建语句:
columns = ['"%s" varchar2(255)' % n for n in listWithoutDups]
sql = "create table SomeTableName (%s)" % ",".join(columns)
cursor.execute(sql)
您会注意到我在列名称周围加上了双引号——如果您要创建不遵循 Oracle 标准的列(包括特殊字符、空格等),这是必要的,但请注意,这也使得名称区分大小写,当您对 table.
执行任何操作时,您还需要指定引号
我正在尝试从具有 python 的属性列表创建 Oracle table。遗憾的是,我有多个同名属性,因此无法将它们添加到 table。我也不希望我的程序因此而停止。 现在我正在尝试这个解决方案:
connection = cx_Oracle.connect('user/password')
cursor = connection.cursor()
if not tableExists(connection, 'TableName'):
first_column_name = next(iter(attributes), None)
query_table = 'CREATE TABLE TableName ("{}" VARCHAR2(255))'.format(first_column_name)
cursor.execute(query_table)
for attribute in attributes[1:]:
query_column= '''
DECLARE
v_column_exists number := 0;
BEGIN
Select count(*) into v_column_exists
from user_tab_cols
where upper(column_name) = "{}"
and upper(table_name) = 'TableName';
if (v_column_exists = 0) then
execute immediate 'alter table TableName add ("{}" VARCHAR2(255)))';
end if;
end;
'''.format(attribute, attribute)
cursor.execute(query_column)
我粘贴了来自 this answer. 的长查询代码 table 是按预期使用第一个属性创建的,但是当我开始添加更多列时,我得到:
Traceback (most recent call last):
File "main.py", line 52, in <module>
cursor.execute(query_column)
cx_Oracle.DatabaseError: ORA-06550: line 7, column 41:
PL/SQL: ORA-00904: "Order count [A221]": invalid identifier
ORA-06550: line 5, column 9:
PL/SQL: SQL Statement ignored
我错过了什么?
我建议简单地构建 create table 语句而不是构建 table 然后更改它以向其中添加列!
您可以使用以下代码删除列表中的重复项:
listWithoutDups = list(dict.fromkeys(listWithDups))
然后,您可以按如下方式构建语句:
columns = ['"%s" varchar2(255)' % n for n in listWithoutDups]
sql = "create table SomeTableName (%s)" % ",".join(columns)
cursor.execute(sql)
您会注意到我在列名称周围加上了双引号——如果您要创建不遵循 Oracle 标准的列(包括特殊字符、空格等),这是必要的,但请注意,这也使得名称区分大小写,当您对 table.
执行任何操作时,您还需要指定引号