当前位置: 首页 > 面试题库 >

从不存在的表中选择

龚鸿羽
2023-03-14
问题内容

我有一个关于ORACLE的问题,我写了一个PLSQL CODE来检查一个表是否存在,如果存在,那么我从该表中选择一些东西。

如果(表存在)从表中选择…。

问题是,即使表条件不存在且select语句从不执行,即使表不存在,我也总是会收到错误消息。

我认为这是因为在编译时检查了我的代码:“ select from
..”,如果表不存在,则会打印错误。我该如何解决这样的问题?..这是我的代码的样子(我使用了通用名称):

     DECLARE
          v_table_exists NUMBER;
       BEGIN

          SELECT NVL(MAX(1), 0)
            INTO v_table_exists
            FROM ALL_TABLES
           WHERE TABLE_NAME = 'TABLE_TEST';

          IF v_table_exists = 1 THEN
             INSERT INTO MY_TABLE(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
             SELECT 1234,
                    5678,
                    T.COLUMN_TEST1,
                    T.COLUMN_TEST2


    FROM  TABLE_TEST T
          WHERE T.FLAG = 1;
      END IF;
   END;

问题答案:

问题的确切原因在于,您的过程没有被编译,因为它引用了不存在的对象。为此,您可能需要一些动态SQL;例如:

create or replace procedure checkTable is
    vCheckExists  number;
    vNum          number;
begin
    -- check if the table exists
    select count(1)
    into vCheckExists
    from user_tables
    where table_name = 'NON_EXISTING_TABLE';
    -- 
    if vCheckExists = 1 then
        -- query the table with dynamic SQL
        execute immediate 'select count(1) from NON_EXISTING_TABLE'
        into vNum;
    else
        vNum := -1;
    end if;

    dbms_output.put_line(vNum);
end;

即使表不存在,该过程也会编译;如果立即致电,您将获得:

SQL> select count(1) from NON_EXISTING_TABLE;
select count(1) from NON_EXISTING_TABLE
                     *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> exec checkTable;
-1

PL/SQL procedure successfully completed.

然后,如果您创建表并再次调用该过程:

SQL> create table NON_EXISTING_TABLE(a) as select 1 from dual;

Table created.

SQL> exec checkTable;
1

PL/SQL procedure successfully completed.

与我显示的方式相同SELECT,您可以执行所需的UPDATESQL查询;如果您执行的操作不同于SELECT,则INTO必须删除该子句。

例如,假设您需要插入另一个表中,则应以这种方式编辑上面的代码:

if vCheckExists = 1 then
    execute immediate 'insert into target(a, b, c) select a, 1, 100 from NON_EXISTING_TABLE';
end if;


 类似资料:
  • 问题内容: 我有2张桌子。一个是一张桌子,上面有可以学习的东西。有一个JID描述了每种类型的行,并且对于每一行都是唯一的。第二张表是已经学习过的东西的日志(JID)以及学习它的人的用户ID。我目前正在使用它来选择JID的所有数据,但是只能选择用户根据userid学到的那些数据。 现在,我需要选择要学习的东西行,但只选择用户ID尚未学习的东西。我显然对此很陌生,请忍受。:)我尝试使用IS NULL,

  • 问题内容: 我有两个postgresql表: 我想获取其中没有一行的每个IP地址。 我尝试了此查询,但它引发了语法错误。 我也想知道此查询(进行调整以使其工作)是否是为此目的性能最佳的查询。 问题答案: 基本上有4种技术可以完成此任务,所有这些技术都是标准SQL。 在Postgres中通常最快。 [](https://www.postgresql.org/docs/current/queries-

  • 我有两个postgresql表: 我想从登录日志中获取每个IP地址,它在IP\U位置中没有一行 我尝试了此查询,但它引发了语法错误。 我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。

  • 问题内容: 我得到了一个带有自动公司常规设置的桌子。ID。一些行已被删除,因此ID列表可能如下所示: (1,2,3,5,8,…) 然后,从另一个来源( 编辑:另一个来源=数据库中不存在 ),我得到了这个数组: (1、3、4、5、7、8) 我正在寻找我可以在数据库上使用的查询,以从我拥有的数组中获取表中未包含的ID:s的列表。可能是: (4、7) 是否存在?我现在的解决方案是创建一个临时表,以便命令

  • 问题内容: 有没有一种方法可以检查表是否存在 而无需 从表中选择和检查值? 也就是说,我知道我可以检查返回的字段数,但是似乎必须有一种更直接/更优雅的方法。 问题答案: 您无需计数。 如果没有错误,则表存在。 或者,如果您想正确,请使用INFORMATION_SCHEMA。 或者,您可以使用 如果结果集中有一行,则表存在。

  • 问题内容: 如何选择一个表中所有未出现在另一表中的行? 表格1: 表2: 表1中不在表2中的行的示例输出: 也许这样的事情应该工作: 问题答案: 如果您在另一条注释中提到有300列,并且想要对所有列进行比较(假设这些列的名称相同),则可以使用a 隐式联接两个表之间所有匹配的列名称,以便不必繁琐地手动输入所有加入条件: