PLS-00382:表达式类型错误
Posted
技术标签:
【中文标题】PLS-00382:表达式类型错误【英文标题】:PLS-00382: expression is of wrong type 【发布时间】:2014-03-13 17:47:36 【问题描述】:我有一个程序定义为:
create or replace
PACKAGE BODY PKG_BG_PRVDR_SCOPE_GROUP
AS
g_return_code NUMBER := 99;
g_return_text VARCHAR2(500) := '';
g_return_desc VARCHAR2(500) := '';
c_return_length CONSTANT NUMBER := 500;
g_revision_frozen NUMBER := -459;
g_timestamp_error NUMBER := -86;
c_invalid_row_count CONSTANT VARCHAR2(100) := 'database integrity check failed';
revision_frozen EXCEPTION;
duplicate_item EXCEPTION;
invalid_row_count EXCEPTION;
invalid_update_ts EXCEPTION;
PROCEDURE update_bg_provider_scope_group
(
p_region_id IN bg_prvdr_scope_group.region_id%TYPE,
p_revision_id IN bg_prvdr_scope_group.revision_id%TYPE,
p_bg_revision_id IN bg_prvdr_scope_group.bg_revision_id%TYPE,
p_classification_id IN bg_prvdr_scope_group.classification_id%TYPE,
p_facility_id IN bg_prvdr_scope_group.facility_id%TYPE,
p_user IN bg_prvdr_scope_group.create_user_id%TYPE,
p_current_timestamp IN bg_prvdr_scope_group.create_ts%TYPE,
p_group_name IN bg_prvdr_scope_group.group_nm%TYPE,
p_description IN bg_prvdr_scope_group.description%TYPE,
p_prvdr_scope_grp_id IN bg_prvdr_scope_group.provider_group_id%TYPE,
p_ora_rowscn IN NUMBER,
p_cur_out OUT g_cursor
)
IS
lv_count_name NUMBER(10) := 0;
lv_count NUMBER(10) := 0;
lv_last_update_user_id VARCHAR2(30) := '';
lv_user_first_and_last_nm VARCHAR2(100) := '';
lv_current_ts TIMESTAMP(6) WITH TIME ZONE;
lv_ora_row_scn NUMBER;
lv_error_desc VARCHAR2(300) := NULL;
BEGIN
DBMS_OUTPUT.PUT_LINE('1');
执行时出现错误: 连接到数据库 SA_Sandbox4。 ORA-06550:第 25 行,第 19 列: ORA-06550:第 25 行,第 3 列: PL/SQL:语句被忽略 进程退出。 与数据库 SA_Sandbox4 断开连接。
它没有进入Begin...
执行:
DECLARE
P_REGION_ID NUMBER;
P_REVISION_ID NUMBER;
P_BG_REVISION_ID NUMBER;
P_CLASSIFICATION_ID NUMBER;
P_FACILITY_ID VARCHAR2(10);
P_USER VARCHAR2(30);
P_CURRENT_TIMESTAMP TIMESTAMP;
P_GROUP_NAME VARCHAR2(50);
P_DESCRIPTION VARCHAR2(255);
P_PRVDR_SCOPE_GRP_ID NUMBER;
P_ORA_ROWSCN NUMBER;
P_CUR_OUT SA_SANDBOX4.PKG_BG_PRVDR_SCOPE_GROUP.g_cursor;
BEGIN
P_REGION_ID := 51;
P_REVISION_ID := 1;
P_BG_REVISION_ID := 1;
P_CLASSIFICATION_ID := 1;
P_FACILITY_ID := 'GIL';
P_USER := 'a12345';
P_CURRENT_TIMESTAMP := localtimestamp;
P_GROUP_NAME := 'modificationtest';
P_DESCRIPTION := 'modified successfully';
P_PRVDR_SCOPE_GRP_ID := 42;
P_ORA_ROWSCN := localtimestamp;
PKG_BG_PRVDR_SCOPE_GROUP.UPDATE_BG_PROVIDER_SCOPE_GROUP(
P_REGION_ID => P_REGION_ID,
P_REVISION_ID => P_REVISION_ID,
P_BG_REVISION_ID => P_BG_REVISION_ID,
P_CLASSIFICATION_ID => P_CLASSIFICATION_ID,
P_FACILITY_ID => P_FACILITY_ID,
P_USER => P_USER,
P_CURRENT_TIMESTAMP => P_CURRENT_TIMESTAMP,
P_GROUP_NAME => P_GROUP_NAME,
P_DESCRIPTION => P_DESCRIPTION,
P_PRVDR_SCOPE_GRP_ID => P_PRVDR_SCOPE_GRP_ID,
P_ORA_ROWSCN => P_ORA_ROWSCN,
P_CUR_OUT => P_CUR_OUT
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_CUR_OUT = ' || P_CUR_OUT);
*/
:P_CUR_OUT := P_CUR_OUT; --<-- Cursor
END;
【问题讨论】:
【参考方案1】:您的匿名块的第 25 行似乎是
P_ORA_ROWSCN := localtimestamp;
P_ORA_ROWSCN
定义为NUMBER
。 localtimestamp
返回 TIMESTAMP
。没有从 TIMESTAMP
到 NUMBER
的隐式转换,因此转换失败。你想用什么来初始化P_ORA_ROWSCN
对我来说并不明显。通常,我猜这应该来自特定表中特定行的ORA_ROWSCN
伪列。但也许你想要dbms_flashback.get_system_change_number
?或者,您可能正在使用 ROWSCN
,但并不是指 Oracle 系统更改号 (SCN)。
顺便说一句,您发布的包定义不会编译,因为它使用了包中未定义的类型g_cursor
。也许您在发布包定义时删除了它?因为您的匿名块似乎希望在该包中声明该类型。
【讨论】:
【参考方案2】:由于我们不知道您的表结构,因此我们无法说出给您带来此问题的确切字段,但我可以这样说:
很明显,您传递给过程的字段之一的数据类型存在问题。
我建议做一些工作以将相同类型的参数传递到您的表中的过程中。
你在你的程序中定义这个:
p_region_id IN bg_prvdr_scope_group.region_id%TYPE,
但是你传入这个变量:
P_REGION_ID NUMBER;
改成
p_region_id bg_prvdr_scope_group.region_id%TYPE
并对每个参数/变量执行此操作。
【讨论】:
以上是关于PLS-00382:表达式类型错误的主要内容,如果未能解决你的问题,请参考以下文章
PLS-00382:表达式类型错误,PL/SQL:语句被忽略
PL/SQL:PLS-00382:表达式类型错误。语句被忽略
PLS-00382:表达式类型错误,无法显示 DBMS_OUTPUT.PUT_LINE
ORA-06550:第 1 行,第 13 列:PLS-00382:表达式类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略