PL/SQL 插入忽略一切

问题描述 投票:0回答:1

我有这样一个问题,我编写了一个代码,首先使用 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 状态;但如果表不存在,代码将忽略所有内容。 。 .

plsql compiler-errors
1个回答
0
投票

在代码编译之前,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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.