我的模式中有一些表和 View ,我正在尝试创建一个存储过程,它将接受 2 个参数(表名、 View 名)以截断表并从 View 中重新填充它。
这是我的程序代码:
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 首次实现物化 View (这是您要实现的目标的成熟版本)时,他们犯了同样的错误。 TRUNCATE TABLE
非常快,但在 Oracle 实现中它是一个 DDL(数据定义语言)语句,这意味着它将以隐式提交完成。因此,在 INSERT
完成(并提交)之前的一段时间内,您的表将为空。如果 Oracle 认为更改其底层技术非常重要,那么您应该考虑这样做。
如果您不更改为DELETE
技术,那么您应该在过程结束时添加一个COMMIT
。使用 TRUNCATE TABLE
将保证删除数据已提交,因此如果您的 INSERT
成功,那么您也应该提交该语句。
我对物化 View 的引用是相关的,因为它是您尝试为自己编写的内容的潜在内置替代品。它的问题是它有太多花里胡哨的东西,以至于很难找到一篇关于如何在你的简单用例中使用它的文章。我欢迎引用此类文章的评论。
关于sql - 截断和重新填充表的 PLSQL 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51641401/