sql - 用于截断和重新填充表的 PLSQL 过程
问题描述
我的架构中有一些表和视图,我正在尝试创建一个存储过程,该过程将采用 2 个参数(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 第一次实现物化视图时,这是您试图实现的成熟版本,他们犯了同样的错误。TRUNCATE TABLE
非常快,但在 Oracle 实现中,它是一个 DDL(数据定义语言)语句,这意味着它将以隐式提交完成。INSERT
因此,在完成(并提交)之前的一段时间内,您的表将是空的。如果 Oracle 认为改变他们的底层技术足够重要,那么您应该考虑这样做。
如果您不更改该DELETE
技术,那么您应该COMMIT
在程序结束时添加一个。的使用TRUNCATE TABLE
将保证数据的删除被提交,所以如果你INSERT
成功了,那么你也应该提交该语句。
我对物化视图的引用是相关的,因为它可能是您尝试为自己编写的内容的内置替代品。它的问题是它有太多的花里胡哨,很难找到一篇关于如何在你的简单用例中使用它的文章。我欢迎评论引用此类文章。
推荐阅读
- sql - 如何在插入和选择之间刷新数据库
- docker - 带有 Ubuntu 的 GCP VM 实例上的“gcloud auth configure-docker”设置不正确?
- prometheus - 我是否正确理解 Prometheus 的速率与增加函数?
- python - Python - 如果没有存储在变量中,输入是否会保留一个值?
- css - Youtube 视频在 Windows 上正常播放,但在 Linux 服务器上不正常
- python-3.6 - OCI(Oracle 云)子分区
- dart - InheritedWidget 混淆
- javascript - 这个高阶函数是如何工作的?
- asp.net - 如何在有条件的同一页面上正确指定链接中的路径
- terraform - 条件运算符适用于一种条件但不适用于其他条件