Question

Here's a simple proc which defines 2 numeric fields, 1 as a Number, the other as Decimal, yet when I pass both to another procedures the decimal field is rounded to 0 dp, ie

IAMOUNT ends up with 9875.4321 but IUNITS ends up with 123

CREATE OR REPLACE PROCEDURE apex_public_user.badbdcall2
AS
  iamount NUMBER(15, 7);
  iunits  DECIMAL(15, 7);
  BEGIN
    iamount := 9875.4321;
    iunits := 123.567;

    BEGIN
      BADBDCALL2CALLME(
         IAMOUNT => iamount,
         IUNITS => iunits
      );
    END;
  END;

The receiving SQL:

CREATE OR REPLACE PROCEDURE badbdcall2callme(iamount IN OUT DECIMAL,
                                             iunits  IN OUT DECIMAL)
AS
  in_ds1 bde1000ds%ROWTYPE;
  BEGIN
    in_ds1.iamount := iamount;
    in_ds1.iunits := iunits;
  END;

If I debug the code, I can see that IUNITS becomes 38,0 which is the default for a decimal and IAMOUNT becomes a NUMBER (with out the 15,7), but I thought that parameters inherited the size of the field passed to it.

Was it helpful?

Solution

Procedure and function parameters with one of the simple data types (VARCHAR2, NUMBER, etc) don't have a size or precision and always take the maximum size/precision of the underlying data type (VARCHAR2 or NUMBER).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top