我正试图使用Dapper调用一些需要运行的Oracle SQL语句,但收到了这个错误
ORA-06502: PL/SQL: numeric or value error: DML Returning: Error writing to host variable
ORA-06512: at line 11
我目前有下面的代码,我只是在获取生成的新Key时遇到问题NewNameAddRKey我将其作为输出项传递到参数中,但我得到了上面的错误,R_Key列是VARCHAR2(5 BYTE(列,所以出于某种原因,它无法将其转换为字符串?,我真的需要一些帮助,因为进展非常缓慢。
var parameters = new DynamicParameters(rowToAdd);
parameters.Add(name: "NewNameAddRKey", dbType: DbType.String, direction: ParameterDirection.Output);
parameters.Add(name: "firstCharacterOfName", value: rowToAdd.FirstCharacterOfName, dbType: DbType.String, direction: ParameterDirection.Input);
await context.Connection.ExecuteAsync(
@"
DECLARE
initialChar VARCHAR2(1) := :firstCharacterOfName;
startsWith VARCHAR2(1) := 'L';
newKey VARCHAR2(5);
status NUMBER;
message VARCHAR2(200);
BEGIN
CUSTOMER_PKG.name_add_key(initialChar, startsWith, newKey, status, message);
INSERT INTO NAME_ADD(R_KEY, ADDRESS_1, ADDRESS_2,ADDRESS_3, ADDRESS_4, POST_CODE, CONTACT, FAX_NO, NAME, PHONE_NO, TELEX_NO)
VALUES(newKey, :AddressLine1, :AddressLine2, :AddressLine3, :AddressLine4, :PostCode, :OfficeContact, :Fax, :Name, :HomePhone, :Telex)
RETURNING R_KEY INTO :NewNameAddRKey;
END;",
parameters,
context.Transaction);
在您发布的代码中,没有定义字符串变量的大小,而在Oracle中,这种类型的每个变量都必须具有预定义的长度。
Dapper可能定义了一些默认长度,这在您的情况下是不够的。
正如我们在评论中所讨论的,这就是解决方案:
parameters.Add(name: "NewNameAddRKey",
dbType: DbType.String,
/* --> */ size: 5, /* <--- */
direction: ParameterDirection.Output);