截断和重新填充表的PLSQL过程



我的模式中有一些表和视图,我正在尝试创建一个存储过程,该过程将接受两个参数(table_name,view_name(来截断表并从视图中重新填充它。

这是我的程序代码:

CREATE OR REPLACE 
PROCEDURE PROC_NAME (TABLE_NAME IN VARCHAR2, VIEW_NAME IN VARCHAR2) 
IS 
BEGIN 
EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_NAME'; 
EXECUTE IMMEDIATE 'INSERT INTO TABLE_NAME
SELECT * FROM VIEW_NAME';
END; 
/

现在,当我运行以下代码时:

BEGIN
PROC_NAME('SOME_TABLE', 'SOME_VIEW');
END;
/

我得到以下错误:

ORA-00942: table or view does not exist
ORA-06512: at "SCHEMA.PROC_NAME", line 4
ORA-06512: at line 2
00942. 00000 -  "table or view does not exist"

你们觉得问题出在哪里?

提前感谢!

尝试:

CREATE OR REPLACE 
PROCEDURE PROC_NAME (TABLE_NAME IN VARCHAR2, VIEW_NAME IN VARCHAR2) 
IS 
BEGIN 
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||TABLE_NAME; 
EXECUTE IMMEDIATE 'INSERT INTO '||TABLE_NAME||'
SELECT * FROM '||VIEW_NAME;
END; 
/

您的基本问题是您正确地传递了参数,但没有在过程中使用它们。修复方法是在EXECUTE IMMEDIATE使用的字符串中使用串联运算符||将参数组合到正在执行的字符串中。

另外一个选项是使用DELETE FROM而不是TRUNCATE TABLE。当Oracle第一次实现Materialized Views时,他们也犯了同样的错误。TRUNCATE TABLE非常快,但在Oracle实现中,它是一个DDL(数据定义语言(语句,这意味着它将通过隐式提交来完成。因此,在INSERT完成(并提交(之前的一段时间内,您的表将为空。如果Oracle认为改变其底层技术足够重要,那么您也应该考虑这样做。

如果不更改为DELETE技术,则应在过程结束时添加COMMIT。使用TRUNCATE TABLE将保证提交删除数据,因此如果INSERT成功,那么您也应该提交该语句。

我对Materialized Views的引用是相关的,因为它可能是您试图为自己编写的内容的内置替代品。它的问题在于它有太多的细节,以至于很难找到一篇关于如何在简单用例中使用它的文章。我欢迎对这样一篇文章发表评论。

最新更新