我有这样一个问题,我编写了一个代码,首先使用 select 来检查表是否存在,如果存在,它会写入 dbms '它存在'并继续,如果不存在,它会创建它EXECUTE IMMEDIATE 部分。 之后,应将 2 个插入插入到表中以加载数据。 但是,如果该表不存在,则代码将忽略所有内容并立即打印一条错误,指出该表不存在。
DECLARE
table_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO table_count
FROM user_tables
WHERE table_name = 'test_table';
IF table_count > 0 THEN
DBMS_OUTPUT.PUT_LINE('The Table is exist');
ELSE
EXECUTE IMMEDIATE 'CREATE TABLE test_table (column1 NUMBER, column2 VARCHAR2(50))';
COMMIT;
END IF;
INSERT INTO test_table (column1, column2) VALUES (1, 'Value1');
INSERT INTO test_table (column1, column2) VALUES (2, 'Value2');
COMMIT;
END;
知道为什么会发生这种情况吗?谢谢您的帮助。 :)
i 尝试重构代码。将插入放入另一个 if else 状态;但如果表不存在,代码将忽略所有内容。 。 .
在代码编译之前,PL/SQL 块中静态引用的所有内容都必须存在。正如 p3Consulting 建议的那样,您必须将 TEST_TABLE 的 all 引用更改为动态。例如,下面的代码也使 INSERT 变得动态:
DECLARE
table_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO table_count
FROM user_tables
WHERE table_name = 'test_table';
IF table_count > 0 THEN
DBMS_OUTPUT.PUT_LINE('The Table is exist');
ELSE
EXECUTE IMMEDIATE 'CREATE TABLE test_table (column1 NUMBER, column2 VARCHAR2(50))';
COMMIT;
END IF;
EXECUTE IMMEDIATE q'[INSERT INTO test_table (column1, column2) VALUES (1, 'Value1')]';
EXECUTE IMMEDIATE q'[INSERT INTO test_table (column1, column2) VALUES (2, 'Value2')]';
COMMIT;
END;
/
此外,您可能想检查一下您是如何得到错误的。整个错误堆栈包含有用的错误消息,并指出错误的确切行和列。这应该有足够的信息来认识到 INSERT 语句是问题所在。不幸的是,许多错误处理程序通常会切断大部分错误堆栈。确保您用来运行 SQL 的任何程序都显示整个错误堆栈,如下所示:
ORA-06550: line 15, column 15:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 15, column 3:
PL/SQL: SQL Statement ignored
ORA-06550: line 16, column 15:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 16, column 3:
PL/SQL: SQL Statement ignored