PL/SQL 过程和 Toad 执行?

Posted

技术标签:

【中文标题】PL/SQL 过程和 Toad 执行?【英文标题】:PL/SQL Procedures and Toad execution? 【发布时间】:2018-09-18 01:11:18 【问题描述】:

我最近开始使用 Toad for Oracle 处理许多大型 Oracle PL/SQL 存储过程。这些过程的数量会更新并将内容插入表中。我的问题是,有没有办法在不永久修改任何表的情况下“安全地”执行 PL/SQL 过程?另外,如何在不实际更改数据库的情况下安全地修改和执行存储过程以进行实验?

【问题讨论】:

PL/SQL procedures 用于执行某些操作。这些可能包括填充和修改表格。如果您不想在表格中看到这些更改,那么运行该过程有什么意义。 @XING 当然,我明白这一点。但是其中一些程序的长度远远超过 3000 行——作为一个新手,如果不了解是否有任何表会处于不一致的状态,我会觉得仅仅运行它们会感到不舒服...... 【参考方案1】:

无论您是否拥有 Toad 或 SQ*Plus 或其他任何东西,都与代码有关。

首先 - 您的程序在存储过程中是否有任何提交或回滚?

第二个——你的程序是否做任何 DDL 工作:创建一个表?这将执行一个隐式 COMMIT。请注意,如果您的程序调用了另一个程序并且该程序有一个 COMMIT 或 DDL - 您在一个会话中就被 COMMITTED 作为它的全部。

第三 - 当你去执行你的存储过程时,你的匿名块是否有 COMMIT 或 ROLLBACK 那里?

您的工具开始发挥作用。检查“执行”按钮后面的代码。

在 SQL Developer 中(这方面类似于 Toad)...

在这种情况下,我的 SP 在代码中有一个提交 - 所以除非该行之前出现异常...这是一个永久性更改。

在生成的匿名块中,有一个 ROLLBACK,但是被注释掉了。当您点击 GUI 中的执行按钮时,请查看那里的代码。如有必要,请更改它。

【讨论】:

【参考方案2】:

您可以创建数据库的副本,然后在那里玩。另一件事是,您可以创建涉及的过程/函数、包和表的副本并使用它。

让你有这个程序,

CREATE PROCEDURE proc1
IS
BEGIN
    INSERT INTO table1
    (col1, col2)
    VALUES
    ('actual data', 'hello');
    UPDATE table2
       SET col1 = 'actual'
     WHERE col2 = 1;
    COMMIT;
END;

您将在其中创建具有相同逻辑的新过程。

CREATE PROCEDURE proc1_test
IS
BEGIN
    INSERT INTO table1_test
    (col1, col2)
    VALUES ('test', 'hello');
    UPDATE table2_test
       SET col1 = 'test2'
     WHERE col2 = 1;
    COMMIT;
END;
/

这样做,您可以将实际数据与测试数据进行比较。

【讨论】:

当你说“创建一个副本”时,我以为你是在建议一个新用户,在开发环境中。您建议的“副本”有些可疑;如果您“忘记”修改其中一个表名怎么办? 我们会的,这很好,谢谢。如果 OP 遵循我的回答,他/她应该在执行那些“复制”的过程或函数之前检查过程中的所有表是否已经被修改。 当然,但“如果”仍然存在。就个人而言,我宁愿有一个开发环境,但我们只是在讨论。 我同意这一点。这就是为什么我在回答的第一句话中说:“您可以创建数据库的副本,然后在那里播放。”【参考方案3】:

您可以将回滚放在过程的末尾并注释任何 Commits/DDL 语句。如果有的话,你还需要小心 Pragma 语句。

【讨论】:

以上是关于PL/SQL 过程和 Toad 执行?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Toad 在 PL/SQL 中进行数据迁移

我的 pl sql 块只执行了 15 分钟我需要增加蟾蜍的执行时间

如何使用 Toad 工具显示 sys_refcursor 输出 pl sql

如何在 Toad 中使用 PL/SQL 提交 HTML 表单?

PL/SQL 过程 DBMS_OBFUSCATION_TOOLKIT.MD5 的异常函数行为

循环体中的占位符和无参数 Toad 中的执行过程