Stored procedures 值可以';无法分配给主机变量,因为它';不在范围内的数据类型

Stored procedures 值可以';无法分配给主机变量,因为它';不在范围内的数据类型,stored-procedures,db2,runtime,local-variables,Stored Procedures,Db2,Runtime,Local Variables,我得到了错误代码: SQLCODE=-304,SQLSTATE=22003 DEC/DECIMAL数据类型与假设的不同。数据类型信息可以在DB2手册中的以下位置找到: 十进制(精度整数,比例整数)或十进制(精度整数,比例整数) 对于十进制数。第一个整数是数字的精度,即总位数,范围为1到31。第二个整数是数字的刻度,即小数点右侧的位数,范围为0到数字的精度。 如果未指定精度和小数位数,则使用默认值5,0。NUMERIC和NUM可以用作DECIMAL和DEC的同义词。“ 因此,在您的情况下,要保留百

我得到了错误代码:

SQLCODE=-304,SQLSTATE=22003


DEC/DECIMAL数据类型与假设的不同。数据类型信息可以在DB2手册中的以下位置找到:

十进制(精度整数,比例整数)或十进制(精度整数,比例整数) 对于十进制数。第一个整数是数字的精度,即总位数,范围为1到31。第二个整数是数字的刻度,即小数点右侧的位数,范围为0到数字的精度。 如果未指定精度和小数位数,则使用默认值5,0。NUMERIC和NUM可以用作DECIMAL和DEC的同义词。“

因此,在您的情况下,要保留百分比,请更改变量声明:

CREATE PROCEDURE ADMINIST.STUDENT_CUSTOM_PROCEDURE1 (
  IN p_id INTEGER,
  IN p_maths INTEGER, 
  IN p_science INTEGER, 
  Out p_obtain_marks INTEGER, 
  out p_percentage decimal(3,2), 
  out p_status char(4)
)

P1: BEGIN

        DECLARE p_total INTEGER;
        SET p_total = 200;
        SET p_obtain_marks = p_maths + p_science;
        SET p_percentage = ((p_obtain_marks * 100)/p_total);

        IF (p_percentage > 35) THEN
            SET p_status = 'PASS';
        ELSE
            SET p_status = 'FAIL';  
        END IF;

        insert into ADMINIST.STUDENT_RESULT values(p_id, p_maths, p_science, p_obtain_marks, p_percentage, p_status);

END P1

我通过对dacimal进行赋值得到了这个答案

设置p_百分比=小数((p_获得分数*100)/p_总数),3,2

感谢Henrik Loeser和Alex。

十进制(3,2)
不够大,无法容纳
[0..100]
值(其声明不是
(3位数字,小数点后2位)
  out p_percentage decimal(5,2),