对存储过程的一些更改似乎不是......呃... 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
答案 0 :(得分:0)
尝试:
create or replace procedure ...
我猜测是你没有从创建过程中捕获错误,所以你认为你正在"更新"使用更新定义的过程,但它实际上只是错误的。通过使用"创建或替换"如果new else使用新代码更新现有过程,则告诉Oracle创建。
我肯定不知道这一点(我没有运行脚本),但是当我看到"创建程序"而不是"创建或替换",它会引发一个标志。
希望有所帮助!