我正在尝试在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
答案 0 :(得分:6)
这似乎是一个错误,没有修复或真正的解决方法。如果您有权访问My Oracle Support,请查找文档ID 445136.1。
This forum thread建议采用解决方法:
在创建或替换出现此问题的软件包,函数或过程之前运行此块:
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; /
或者您可以使用the ALTER SESSION
syntax described in the documentation:
ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL,DISABLE:07202';
This SQL Fiddle显示警告; this one with the PLW-07202 suppressed with DBMS_WARNING
和this one suppressing with ALTER SESSION
不会。所以这种方法有效,但当然也会抑制该类型的任何合法警告。