我正试图在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
抑制,不需要。所以这种方法是有效的,但当然也抑制了该类型的任何合法警告