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

标签 sql database oracle plsql

我的模式中有一些表和 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/

相关文章:

java - 如何使用 TO_DATE 将 Oracle 中的变量转换为日期类型

sql - PostgreSQL 是否有内置功能来查找美国联邦假日?

java - 在两个字段上创建 Hibernate 标准以及类似查询

javascript - 如何根据传递给函数的值从javascript中的数据库中获取数据

regex - 如何从oracle的正则表达式中排除一个单词?

oracle - plsql函数可以返回对象吗

mysql - 嵌套更新查询中出现错误

java - SQLException 参数索引超出范围

mysql - 将 4 个表连接在一起

mysql - 需要在表中创建多少列来保存附件的 url 路径?