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

截断和重新填充表的PLSQL过程,sql,database,oracle,plsql,Sql,Database,Oracle,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 '

我的模式中有一些表和视图,我正在尝试创建一个存储过程,它将接受两个参数(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; 
/
您的基本问题是您已经正确地传递了参数,但没有在过程中使用它们。修复方法是在
executeimmediate
使用的字符串中使用连接运算符
|
,将参数组合到正在执行的字符串中

另一个选项是使用
DELETE FROM
而不是
TRUNCATE TABLE
。当Oracle第一次实现Materialized Views时(这是您试图实现的成熟版本),他们犯了同样的错误
TRUNCATE TABLE
非常快,但在Oracle实现中,它是一个DDL(数据定义语言)语句,这意味着它将通过隐式提交完成。因此,在
INSERT
完成(并提交)之前的一段时间内,您的表将为空。如果Oracle认为它的重要性足以改变其底层技术,那么你也应该考虑做同样的事情。 如果不更改为
DELETE
技术,则应在过程末尾添加
COMMIT
。使用
TRUNCATE TABLE
将保证数据的删除已提交,因此如果
INSERT
成功,则还应提交该语句


我对具体化视图的引用是相关的,因为它是一个潜在的内置替代品,可以替代您试图为自己编写的内容。它的问题在于它有太多的细节,以至于很难找到一篇关于如何在您的简单用例中使用它的文章。我欢迎有人提及这样一篇文章

您还需要将
TABLE_NAME
移出第二个
EXECUTE IMMEDIATE
中的字符串文字。您好,感谢您的回复。我试过了,但还是犯了同样的错误!是的,将它从字符串文字中删除,现在它正按照预期的方式工作!非常感谢。有什么理由不为此使用物化视图吗?