对存储过程的一些更改似乎不会生效

时间:2017-02-07 17:31:27

标签: oracle stored-procedures oracle11g procedure

对存储过程的一些更改似乎不是......呃... Oracle承认。

例如,我在我的程序中添加了一个参数,重新编译它(在DataGrip-speak中),并从我的代码中调用它。它似乎有效,它接受了新的参数。

但是我错误地给它类型" INT",它似乎不是有效的类型。我尝试将其更改为" NUMBER",但行为仍然相同。

让我解释一下。我在表格中添加了一个主键(嘿,不要判断我,我事后走进去,我从不会创建没有主键的表),并将其作为参数添加到以前的存储过程中程序员已经插入或更新。然而,它们作为唯一约束使用的值已经变得不再是唯一的,所以我添加了主键。

但是,每次我运行该过程时,由于一个字段具有相同的值,而不是添加新行,它将更新现有行。它就好像永远不会识别ID参数那样说这是一个新行。请参阅下面的代码以获得说明。

幸运的是,一位同事之前遇到过这个问题并通知我,如果我要复制程序定义,重命名,提交,运行它,它就可以了。所以我做了。确实如此。

那么,有没有人知道为什么Oracle会识别存储过程的某些更改,而某些更改却没有?如果这与缓存或Oracle存储这些程序的方式有关?是否有命令我可以运行"刷新"程序的存储,因为它似乎不会自动执行?

谢谢大家!

这里有三个版本的程序:原件,我的第一个改变得到认可,而我的第二个改变没有得到认可。请注意v_ID参数

原件:

create PROCEDURE      proc_name_removed_for_privacy
   (  v_Month_Year IN VARCHAR2,
    v_Title IN VARCHAR2,
    v_UserID IN VARCHAR2,
    v_Visible IN CHAR
    )
  as

v_IsNew CHAR(1):= 'T';

BEGIN
     SELECT DECODE(COUNT(Month_Year),0,'T','F') INTO v_IsNew
      FROM table_name_removed_for_privacy
     WHERE Month_Year = v_Month_Year;

      IF UPPER(TRIM(v_IsNew)) = 'T' THEN
        INSERT INTO table_name_removed_for_privacy
        (
            Month_Year,
            Title,
            created_by,
            date_added,
            modified_by,
            date_modified,
            visible
        )
        VALUES(v_Month_Year,v_Title,v_UserID,SYSDATE,v_UserID,SYSDATE,v_Visible);
        COMMIT;
    ELSE
        UPDATE table_name_removed_for_privacy
           SET Title = v_Title,
               modified_by = v_UserID,
               date_modified = SYSDATE,
               visible = v_Visible
        WHERE Month_Year = v_Month_Year;
        COMMIT;

    END IF;

END; -- Procedure

第二

create PROCEDURE      proc_name_removed_for_privacy
(
    v_Month_Year IN VARCHAR2,
    v_Title IN VARCHAR2,
    v_UserID IN VARCHAR2,
    v_Visible IN CHAR,
    v_ID IN INT DEFAULT -1
) as

BEGIN
    IF v_ID = -1 THEN
        INSERT INTO table_name_removed_for_privacy
        (
            Month_Year,
            Title,
            created_by,
            date_added,
            modified_by,
            date_modified,
            visible
        )
        VALUES(v_Month_Year,v_Title,v_UserID,SYSDATE,v_UserID,SYSDATE,v_Visible);
        COMMIT;
    ELSE
        UPDATE table_name_removed_for_privacy
        SET Title = v_Title,
            modified_by = v_UserID,
            date_modified = SYSDATE,
            visible = v_Visible
        WHERE ID = v_ID;
        COMMIT;
    END IF;
END; -- Procedure

第三

create PROCEDURE      proc_name_removed_for_privacy
(
    v_Month_Year IN VARCHAR2,
    v_Title IN VARCHAR2,
    v_UserID IN VARCHAR2,
    v_Visible IN CHAR,
    v_ID IN NUMBER DEFAULT -1
) as

BEGIN
    IF v_ID = -1 THEN
        INSERT INTO table_name_removed_for_privacy
        (
            Month_Year,
            Title,
            created_by,
            date_added,
            modified_by,
            date_modified,
            visible
        )
        VALUES(v_Month_Year,v_Title,v_UserID,SYSDATE,v_UserID,SYSDATE,v_Visible);
        COMMIT;
    ELSE
        UPDATE table_name_removed_for_privacy
        SET Title = v_Title,
            modified_by = v_UserID,
            date_modified = SYSDATE,
            visible = v_Visible
        WHERE ID = v_ID;
        COMMIT;
    END IF;
END; -- Procedure

1 个答案:

答案 0 :(得分:0)

尝试:

create or replace procedure ...

猜测是你没有从创建过程中捕获错误,所以你认为你正在"更新"使用更新定义的过程,但它实际上只是错误的。通过使用"创建或替换"如果new else使用新代码更新现有过程,则告诉Oracle创建。

我肯定不知道这一点(我没有运行脚本),但是当我看到"创建程序"而不是"创建或替换",它会引发一个标志。

希望有所帮助!