存储过程中的插入语句失败

时间:2018-07-03 12:54:02

标签: sql oracle

我编写了一个oracle存储过程,并创建了一个错误日志表(如果不存在)。

SELECT COUNT(*)  
       INTO v_count  
       FROM all_tables  
       WHERE TABLE_NAME = 'ERROR_LOG';  
       IF v_count       =0 THEN  
     cr_table := 'CREATE TABLE ERROR_LOG ( ERROR_LOG_ID  NUMBER GENERATED BY DEFAULT ON         NULL AS IDENTITY, IDENTIFIER VARCHAR2(100), ERROR_MESSAGE VARCHAR2(1000),created_by varchar2(100        ), created_date TIMESTAMP DEFAULT systimestamp )';  
execute immediate cr_table;

然后在代码中以

的形式在下面发布插入语句
INSERT
INTO error_log
(
identifier,
error_message,
created_by
)
VALUES
(
v_identifier,
'Success',
v_user
);

但是SP抛出

编译错误
  

PL / SQL:ORA-00942:表或视图不存在

如果我手动,离线创建表并进行编译,则它可以工作。 有什么帮助吗?

3 个答案:

答案 0 :(得分:0)

如果您使用execute immediate创建表,该表存在于PL / SQL上下文中,而不存在于SQL上下文中,则您也必须使用执行模仿来执行INSERT。 或者,您必须在另一个BEGIN .. END块内插入插入物。

答案 1 :(得分:0)

这个评论太长了。

编译代码后,该表不存在。因此,您会遇到编译时错误。在编译时,Oracle不知道该表在执行时将存在。

一种解决方案是对insert也使用动态SQL。

一个更好的解决方案是在可以执行代码之前,在适当的表 中设置数据库。通常使用条件代码动态创建永久表通常是设计不良的应用程序的标志。

答案 2 :(得分:0)

在使用存储过程之前,请创建一个视图或表,您将在其中使用SP插入值。这样可以避免在运行时出现编译器错误。