pl/sql ora-02296
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pl/sql ora-02296相关的知识,希望对你有一定的参考价值。
修改表 以后 保存 出错 提示 ORA-002296 无法启用Scott 应当怎么解决啊??
参考技术A 今天正好遇到换个问题,我朋友帮我解决了原因:如果一张表是新建的,你为某些字段设定为不可为空是可以的,但是你应该是表建好后,再次修改之后出的问题吧,你在修改字段的时候可能为某些字段设置成不能为空,但是之前的那张表里面对应的字段却是空的,所以系统显示无法启用
方法:1你可以修改不可为空的字段为可空,2你可以打开那张表,在对应的字段插入数值,然后然后记得保存
我就是这么解决的,希望对你有用
PL/SQL 甲骨文 ORA-24344
【中文标题】PL/SQL 甲骨文 ORA-24344【英文标题】:PL/SQL Oracle ORA-24344 【发布时间】:2014-05-22 17:58:18 【问题描述】:我在创建 PL/SQL FUNCTION 时收到以下信息
Warning: compiled but with compilation errors
No errors.
当我在 TOAD 中查看消息时,我看到以下内容
[Warning] ORA-24344: success with compilation error
17/43 PL/SQL: ORA-00904: "PAGE_DCPN": invalid identifier
2/48 PLS-00201: identifier 'B2BOWNER.SSC_PAGE_MAP' must be declared
16/5 PL/SQL: SQL Statement ignored
PL/SQL: Compilation unit analysis terminated
(2: 0): Warning: compiled but with compilation errors
我正在使用以下 PL/SQL 命令来创建表
DECLARE
v_create LONG;
v_drop LONG;
TABLE_DOES_NOT_EXIST exception;
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942
TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map';
BEGIN
BEGIN
v_drop := 'DROP TABLE ' || TABLE_NAME;
EXECUTE IMMEDIATE v_drop;
EXCEPTION
WHEN TABLE_DOES_NOT_EXIST THEN NULL;
END;
v_create := 'CREATE TABLE ' || TABLE_NAME || ' (
PAGE_ID_NBR NUMERIC(10) NOT NULL Check(Page_ID_NBR > 0),
PAGE_TYPE VARCHAR2(50) NOT NULL,
PAGE_DCPN VARCHAR2(100) NOT NULL,
PRIMARY KEY(Page_ID_NBR, Page_Type))';
EXECUTE IMMEDIATE v_create;
COMMIT WORK;
COMMIT COMMENT 'Create Table';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL; -- suppresses ORA-00955 exception
ELSE
RAISE;
END IF;
END;
我试图创建的 PL/SQL 函数是
CREATE OR REPLACE FUNCTION B2BOWNER.F_SSC_Page_Map_Insert(
p_page_id IN B2BOWNER.SSC_Page_Map.PAGE_ID_NBR%TYPE,
p_page_type IN B2BOWNER.SSC_Page_Map.PAGE_TYPE%TYPE,
p_page_dcpn IN B2BOWNER.SSC_Page_Map.PAGE_DCPN%TYPE)
RETURN INTEGER
IS
TABLE_DOES_NOT_EXIST exception;
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942
BEGIN
MERGE INTO B2BOWNER.SSC_PAGE_MAP
USING (SELECT PAGE_ID_NBR ,PAGE_TYPE ,PAGE_DCPN FROM dual)
ON (PAGE_ID_NBR = p_page_id AND PAGE_TYPE = p_page_type AND PAGE_DCPN = p_page_dcpn)
WHEN MATCHED THEN
UPDATE SET PAGE_ID_NBR = p_page_id, PAGE_TYPE = p_page_type, PAGE_DCPN = p_page_dcpn
WHEN NOT MATCHED THEN
INSERT (PAGR_ID_NBR, PAGE_TYPE, PAGE_DCPN)
VALUES(p_page_id, p_page_type, p_page_dcpn);
RETURN 0;
EXCEPTION
WHEN TABLE_DOES_NOT_EXIST THEN
RETURN -1;
WHEN DUP_VAL_ON_INDEX THEN
RETURN -2;
WHEN INVALID_NUMBER THEN
RETURN -3;
WHEN OTHERS THEN
RETURN -4;
END F_SSC_Page_Map_Insert;
SHOW ERRORS PROCEDURE B2BOWNER.F_SSC_Page_Map_Insert;
GRANT EXECUTE ON F_SSC_Page_Map_Insert TO B2B_USER_DBROLE;
PL/SQL 创建脚本正常执行成功
PL/SQL procedure successfully completed.
并在 B2BOWNER.SSC_PAGE_MAP
架构下的 toad 中验证为存在且一切正常。
显然,我不熟悉使用 MERGE
程序
here 所以这很可能是我的问题所在,尽管目前尚不清楚程序的哪一部分。
【问题讨论】:
【参考方案1】:您无法在 F_SSC_Page_Map_Insert
函数中捕获 ORA-00942 错误,至少不会像它所写的那样。如果在创建函数时表不存在,则函数将无法编译,因为在创建函数时对表的静态引用将不存在。您无法捕获 PL/SQL 块中的编译错误,只能捕获运行时错误。
我想,您可以修改函数以专门使用动态 SQL 来引用表。这将导致编译器延迟解析对象引用到运行时而不是在编译时,这将允许您在函数中捕获异常。这也将允许函数在表不存在时成功编译。当然,这也会使您的函数更复杂、更难编写、更难阅读和更难调试。它也几乎肯定会施加一些性能损失。
是否有理由需要在表存在之前创建过程?通常,这是您并不真正需要的复杂性。因此,您应该避免复杂性,而不是添加代码来尝试处理它。
【讨论】:
这就是我遇到 ORA-24344 的原因吗? @Mushy - 看起来是的,是的。 那么我应该把代码行注释掉,直到函数完成?你会建议吗? @Mushy - 从您的函数中删除TABLE_DOES_NOT_EXIST
异常和异常处理程序的那部分。该函数永远不会引发表在运行时不存在的错误。如果希望函数编译成功,则在尝试创建函数之前确保该表存在。或者,您可以允许创建有错误的函数,然后创建表,然后重新编译该函数,但这通常更费力。以上是关于pl/sql ora-02296的主要内容,如果未能解决你的问题,请参考以下文章
一个存储过程,报错如下 13 PL/SQL:ORA-00922:缺少或无效选项 13 PL/SQL:SQL Statement ignored
我用PL/SQL-Developer登录oracle时出现 ORA-12560:TNS:协议适配器错误怎么办?急!!!!!
ORA-06502: PL/SQL: 数字或值错误,我贴出来,大家帮我改一下,以前没怎么写过存储过程。。
oracle PL/SQL里面, tnsnames.ora文件里面配置了之后, 在下拉列表框里面没有显示
Oracle使用merge into 编写存储过程 遇编译错误:PL/SQL: ORA-00926: 缺失 VALUES 关键字
oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下: