gpt4 book ai didi

sql - 从不存在的表中选择

转载 作者:行者123 更新时间:2023-12-02 07:22:33 24 4
gpt4 key购买 nike

我有一个关于 ORACLE 的问题,我写了一个 PLSQL 代码来检查一个表是否存在,如果它存在,那么我从这个表中选择一些东西。伪代码就像:

如果(表存在)
从表中选择...

问题是,如果表不存在,我总是会出错,即使 if 条件从未满足并且 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;

最佳答案

问题恰恰在于您的过程 con 没有被编译,因为它引用了一个不存在的对象;为此,您可能需要一些动态 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 的方式相同,你可以做一个 UPDATE或您需要的任何 SQL 查询;如果你做的事情不同于 SELECT , INTO条款必须被删除。

例如,假设您需要插入到不同的表中,上面的代码应该这样编辑:
if vCheckExists = 1 then
execute immediate 'insert into target(a, b, c) select a, 1, 100 from NON_EXISTING_TABLE';
end if;

关于sql - 从不存在的表中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41855482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com