gpt4 book ai didi

sql - SQL Developer 中的存储过程问题 - 没有 "refreshing" block 中所做的更改

转载 作者:行者123 更新时间:2023-12-04 13:32:05 25 4
gpt4 key购买 nike

N.B, the problem I'm facing is not related to the business logic, but rather, with the stored procedured itself. it's a very weird problem I'm facing and I haven't had this kind of problem before.



我正在修改一个用 PL/SQL 编写的存储过程——称为“ MY_STORED_PROC”——并且,每次我更改其内容时,之前的更改仍然是执行 SP 的结果。
这是存储过程的示例:
create or replace PROCEDURE MY_STORED_PROC
(
V_USER IN VARCHAR2 DEFAULT NULL,
V_NUMBER_PARAM IN NUMBER DEFAULT 0,
V_ORIGIN IN NUMBER DEFAULT 0
)
AS
CV_1 SYS_REFCURSOR;
V_SAMPLE NUMBER;
BEGIN
SELECT BAP.APA_CNAME
INTO V_USER_DB
FROM BH_APPLICATION_PARAM BAP
WHERE BAP.APA_NCODE = 84;

INSERT INTO T_DEBUG (ERR_LINE, MESSAGE_INFO)
SELECT ID, 'EXAMPLE_MESSAGE'
FROM <my_table>
WHERE <ID = 1>;

END MY_STORED_PROC;
在之前的结构中,我有 EXAMPLE_MESSAGE插入在 T_DEBUG 中的字符串执行此 SP 并满足条件时的表。
现在,更改后 EXAMPLE_MESSAGE string sample 与另一个文本并编译并执行 SP,消息 EXAMPLE_MESSAGE仍然显示在结果中。

I don't understand why - if only this SP has the given string sampleand the table T_DEBUG is truncated before the SP is called.


我试过的:
  • 执行 DELETE FROM T_DEBUG;TRUNCATE TABLE T_DEBUG在调用 SP 之前。
  • 执行 DROP PROCEDURE MY_STORED_PROC ,然后执行 CREATE OR REPLACE PROCEDURE MY_STORED_PROC (有和没有声明模式名称)过程的逻辑完全改变了。
  • 编译并“编译调试”SP - 即:MY_STORED_PROC有和没有模式名称。

  • 例子:
    CREATE OR REPLACE PROCEDURE <SCHEMA>.MY_STORED_PROC ...
    CREATE OR REPLACE PROCEDURE MY_STORED_PROC ...
  • 修改 SP 以截断表 T_DEBUG “其中包含字符串样本” - 此操作(在 SP 执行任何操作“i.e. insert data in T_DEBUG”之前)。
  • 删除存储过程:DROP PROCEDURE MY_STORED_PROC;并执行:CREATE OR REPLACE PROCEDURE <SCHEMA>.MY_STORED_PROC ... .
  • 检查 T_DEBUG table 并且它不包含任何触发器 - 它是一个没有附加功能或特征的单个表( like indexes, triggers, back-up table(s), etc )。
  • 编译 (SP) 有以下有意的异常(exception):
     -- Generate intentional DivisionByZero unhandled exception: 
    /*SELECT 1/0
    INTO V_SAMPLE
    FROM DUAL;*/

  • 在后面一点,异常 ORA-01476提出,在我看来,SP 正在进行更改,但是,在所有这些更改之后,我无法解释为什么示例字符串保留(甚至更改 SP 的内容)。
  • 在 (30/10/2020) 我还添加了:'SAMPLE - ' || TO_CHAR(SYSDATE)作为一个字符串样本,然后删除,然后编译 SP - 没有这个代码 - 我仍然得到这个样本字符串的日期为 30/10/2020 - 我添加这样的样本的日期,尽管事实是 我在 05/11/2020 执行了这个 SP .

  • 有什么方法可以“刷新”存储过程或可以进行哪些其他测试来刷新此存储过程?

    我不是这个数据库的数据库管理员,但是,我可以获得更多信息与 DBA 共享 - 我已经向他们解释了我的问题,但是没有提供任何帮助。

    最佳答案

    好吧,这听起来很奇怪。
    应该不需要“刷新”,存储过程存储在数据库中,这就是执行的过程。只要您不使用 EBR,就没有调用不同版本的风险,只要您执行完全相同的过程。
    最可能的解释是您忽略了一些愚蠢的错误,因此请从进一步简化您的程序开始。您已经通过错误消息确认每次都会调用它。删除代码的其他部分,以便它只是插入到 t_debug 语句中,也许可以使它从 dual 而不是带有过滤器的其他表中进行选择。删除过程的参数。尝试插入不同的新表(也许您有触发器)。如果您在将其简化为以下行为后仍然设法复制该行为:

    drop table my_table;
    create table my_table (my_string varchar2(200));
    create or replace procedure my_proc
    is
    begin
    insert into my_table (my_string)
    select 'error 1' from dual;
    end;
    /
    exec my_proc
    select * from my_table;
    delete my_table;
    create or replace procedure my_proc
    is
    begin
    insert into my_table (my_string)
    select 'error 2' from dual;
    end;
    /
    exec my_proc
    select * from my_table;
    那么问题来了。

    关于sql - SQL Developer 中的存储过程问题 - 没有 "refreshing" block 中所做的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64507949/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com