检查表是否存在

时间:2017-10-29 07:04:57

标签: java sybase sybase-ase

我正在使用jdbc从数据库中检索数据。在我的代码中,我使用3-4个表来获取数据。但有时如果数据库中没有表,我的代码会给出异常。如何处理这种情况。即使一个表不存在,我希望我的代码继续为其他表工作。请帮忙。

我写了这样的代码

sql="select * from table"
now Result set and all.

如果数据库中没有表,则表示没有这样的表的异常。我想处理它。在这段代码中,我不能提取已经提前存在的表格。如果有桌子,我想在这里查看。

请不要将其标记为重复的问题。您共享的链接没有给我所需的答案,因为在该问题中他们正在数据库中执行查询而不是通过JDBC代码

3 个答案:

答案 0 :(得分:0)

这是检查表是否存在并删除它的方法:

IF EXISTS (
  SELECT 1
  FROM sysobjects
  WHERE name = 'a_table'
  AND type = 'U'
)
DROP TABLE a_table
GO

这是检查表是否存在并创建它的方法。

IF NOT EXISTS (
  SELECT 1
  FROM sysobjects
  WHERE name = 'a_table'
  AND type = 'U'
)
EXECUTE("CREATE TABLE a_table (
  col1 int not null,
  col2 int null
)")
GO

(它们是不同的,因为在表格中创建一个临时表,所以如果你尝试创建一个新的,你会得到一个它已经存在的异常)

答案 1 :(得分:0)

在运行不存在表中存在风险的查询之前,运行以下sql查询并检查结果数是否> = 1.如果是> = 1则可以安全地执行常规查询。否则,做一些事情来处理这种情况。

month+1

我不是Sybase的专家,但看看这个,

cal.set

Sybase Admin

答案 2 :(得分:0)

对于Sybase ASE,最简单/最快捷的方法是查询数据库中您期望(用户定义的)表驻留的sysobjects表:

select 1 from sysobjects where name = 'table-name' and type = 'U'
  • 如果返回记录=>表存在
  • 如果没有返回记录=>表不存在

您如何使用(上述)查询取决于您......

  • 将0/1行结果集返回给您的客户
  • 为@variable
  • 分配值
  • 放置在if [not] exists(...)构造
  • case声明中使用

如果你知道在数据库中没有任何其他对象类型(例如,proc,trigger,view,UDF),那么你也可以使用object_id()函数,例如:

select object_id('table-name')
  • 如果您收到一个数字=>对象存在
  • 如果您收到NULL =>该对象不存在

虽然object_id()将从sysobjects表中获取对象的id,但它不会检查对象type,例如,如果存在,则(上面)查询将返回一个数字存储过程名为'table-name'。

select/sysobjects查询一样,您在代码中如何使用函数调用取决于您(例如,结果集,填充@variable,if [not] exists()构造,case语句)

所以,解决评论中提供的其他细节......

假设您在运行所需查询之前提交了需要确定表存在的单个批处理:

-- if table exists, run query(s); obviously if table does not exist then query(s) is not run

if exists(select 1 from sysobjects where name = 'table-name' and type = 'U')
begin
     execute("select * from table-name")
end
  • execute()需要保持优化器不会生成表不存在的错误,即除非实际调用execute(),否则不会解析/编译查询

如果您的应用程序可以编写为使用多个批次,则以下内容也应该有效:

# application specific code; I don't work with java but the gist of the operation would be ...
run-query-in-db("select 1 from sysobjects where name = 'table-name' and type = 'U'")
if-query-returns-a-row
then
    run-query-in-db("select * from table-name")
fi
相关问题