首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PL/SQL Oracle ORA-24344

PL/SQL Oracle ORA-24344
EN

Stack Overflow用户
提问于 2014-05-23 01:58:18
回答 1查看 10.1K关注 0票数 1

我在创建PL/SQL函数时收到以下信息

代码语言:javascript
复制
Warning: compiled but with compilation errors
No errors.

当我查看TOAD中的消息时,我看到以下内容

代码语言:javascript
复制
[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命令来创建表

代码语言:javascript
复制
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函数是

代码语言:javascript
复制
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 create脚本以通常的方式成功执行

代码语言:javascript
复制
 PL/SQL procedure successfully completed.

并且在toad中在模式B2BOWNER.SSC_PAGE_MAP下被验证为存在并且看起来都很好。

作为明显的here,我是第一次使用MERGE过程,所以这可能是我的问题所在,尽管还不清楚该过程的哪一部分。

EN

回答 1

Stack Overflow用户

发布于 2014-05-23 02:37:46

您不能在F_SSC_Page_Map_Insert函数中捕获ORA-00942错误,至少在编写时是这样。如果在创建函数时表不存在,则函数将无法编译,因为在创建函数时,对表的静态引用将不存在。您无法在PL/SQL块中捕获编译错误,只能捕获运行时错误。

我想,您可以修改函数以独占地使用动态SQL来引用该表。这将导致编译器延迟将对象引用解析到运行时,而不是在编译时,这将允许您在函数中捕获异常。这也将允许函数在表不存在时成功编译。当然,这也会使您的函数更加复杂,更难编写,更难阅读,更难调试。几乎可以肯定的是,它还会施加一些性能损失。

在表存在之前需要创建过程有什么原因吗?通常,这是您并不真正需要的复杂性。因此,您应该避免复杂性,而不是添加代码来尝试处理它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23814081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档