【问题标题】:How to check If column exists and table row count togather before running the query in PL/SQL?在 PL/SQL 中运行查询之前,如何检查列是否存在和表行计数?
【发布时间】:2018-03-24 03:36:36
【问题描述】:

我需要执行一个查询,在执行查询之前我需要检查以下两个条件, 1)表格行数为0 2) 存在一个表列。

所以根据我的要求,我写了如下程序,

DECLARE
   rowCount INT;
   column_not_exists exception;
   pragma exception_init (column_not_exists , -00904);
BEGIN
SELECT count(*) INTO rowCount FROM Settings;
IF (rowCount = 0) THEN
Insert into Settings (ID,PROCESSID,AREA) select ID,PROCESSID,AREA from POINT WHERE CLASSNAME = 'ENDPOINT' and PROCESSID IS NOT NULL;
END IF;
exception WHEN column_not_exists THEN NULL;
END;
/

但不知何故没有处理异常,我仍然可以在日志中看到错误消息

PL/SQL: ORA-00904: "PROCESSID": invalid identifier
ORA-06550: line 8, column 1:
PL/SQL: SQL Statement ignored

有人可以在这里帮我验证这两个条件吗?

【问题讨论】:

  • 关于行数,您可以使用 dba_tab_statistics (它显示来自最后一个数据库收集统计信息的表的统计信息,如果关闭行数很重要,则不合适)。关于列,您可以从 dba_tab_columns 查询表的列并检查该列是否存在。
  • 你能从你的数据库中扩展你的点(表)结构吗!!!
  • ora-00904 是编译时异常。异常部分捕获运行时异常。简单地说,ora-00904 不能被静态 SQL 捕获,但它可以被动态 SQL 捕获。无论如何,为静态 SQL 处理该异常没有任何意义。您应该知道要向/从中插入/选择数据的表的结构。

标签: sql oracle plsql oracle11g procedure


【解决方案1】:

你最好使用系统视图ALL_TAB_COLUMNS(当然,你需要有权限才能访问它)。另外你需要使用Oracle动态SQL语句“EXECUTE IMMEDIATE”,否则你的代码将无法编译。

我在这里修改了你的代码,请相应地替换这些地方: 较低(t.OWNER)='所有者', lower(t.TABLE_NAME)='点'

代码:

declare
  rowcount int;
  l_cnt number;
begin
  select count(*) into rowcount from settings;
  if (rowcount = 0) then
   select count(*) into l_cnt from ALL_TAB_COLUMNS t
             where lower(t.OWNER)='owner' and lower(t.TABLE_NAME)='point'
             and lower(t.COLUMN_NAME) in ('processid','area');
     if l_cnt = 2  then
      execute immediate 'insert into settings
        (id, processid, area)
        select id, processid, area
          from point
         where classname = ''ENDPOINT''
           and processid is not null';
    end if;
  end if;

end;

【讨论】:

  • 请注意:ALL_TAB_COLS 不需要权限。您自动有权访问它,它是您需要许可的 DBA_TAB_COLS。 USER_TAB_COLS 包括您拥有的所有表和视图,没有 OWNER 列。 ALL_TAB_COLS 包括您有权访问的所有表和视图,包括其他模式中的表。因此,有一个 OWNER 列。 DBA_TAB_COLS 包括数据库中的所有表和视图。
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多