PLW-07202:绑定类型将导致从列类型转换



我正试图在15年内编写我的第一个PL/SQL存储过程。我得到一个类型转换警告:

2 PLW-07202: bind type would result in conversion away from column type SQL1.sql 11 60 

当尝试将当前系统时间分配给以下列时:

CRET_TIMESTMP TIMESTAMP(6)      NOT NULL

这是记录的整个表定义。

CREATE TABLE FIN_IT_RPT.COGNOS_RPTNG_SCHEDLNG_STAT
    (
        JOB_NM        VARCHAR2(20 BYTE) NOT NULL
       ,JOB_STAT_CD   VARCHAR2(1 BYTE)  NOT NULL
       ,CRET_TIMESTMP TIMESTAMP(6)      NOT NULL
       ,CRET_OPER_ID  VARCHAR2(10 BYTE) NOT NULL
       ,UPDT_TIMESTMP TIMESTAMP(6)
       ,UPDT_USR_ID   VARCHAR2(10 BYTE)
    )
    TABLESPACE USERS
    STORAGE (INITIAL 64 K
             NEXT 1 M
             MAXEXTENTS UNLIMITED)
    LOGGING;

步骤如下:

CREATE OR REPLACE PROCEDURE FIN_IT_RPT.UPDATE_FINODS_COGNOS_STATUS
    (
     P_JOB_STAT_CD IN COGNOS_RPTNG_SCHEDLNG_STAT.JOB_NM % TYPE
    )
    AS
    BEGIN
        UPDATE COGNOS_RPTNG_SCHEDLNG_STAT
            SET
                COGNOS_RPTNG_SCHEDLNG_STAT.JOB_STAT_CD   = P_JOB_STAT_CD
               ,COGNOS_RPTNG_SCHEDLNG_STAT.UPDT_TIMESTMP = CAST(CURRENT_TIMESTAMP AS TIMESTAMP(6))
            WHERE
                COGNOS_RPTNG_SCHEDLNG_STAT.JOB_NM = 'FINODS';
        COMMIT;
    END UPDATE_FINODS_COGNOS_STATUS;

为什么我得到警告,我如何防止类型转换?我知道这只是一个警告,但我是否应该能够显式地将其转换为目标类型,或者使用一个以适当格式本地获取时间的函数?

下面是我使用的:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production    

这似乎是一个错误,没有修复或真正的解决方案。如果您可以访问My Oracle Support,请查找文档ID 445136.1。

这个论坛的帖子建议一个解决方案:

在创建或替换出现此问题的包、函数或过程之前运行此块:

BEGIN
DBMS_WARNING.SET_WARNING_SETTING_STRING('ENABLE:ALL', 'SESSION');
DBMS_WARNING.ADD_WARNING_SETTING_NUM(warning_number => 7202, warning_value => 'DISABLE', scope => 'SESSION');
END;
/

或者您可以使用文档中描述的ALTER SESSION语法:

ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL,DISABLE:07202';

这个SQL Fiddle显示了警告;这个PLW-07202用DBMS_WARNING抑制,这个用ALTER SESSION抑制,不需要。所以这种方法是有效的,但当然也抑制了该类型的任何合法警告

最新更新