Domanda

I have the following stored proc:

SET TERM ^ ;
CREATE PROCEDURE SP_OUTWARD_ACCOUNTS (
STARTDATE Timestamp,
ENDDATE Timestamp )
RETURNS (
DATEX Timestamp,
PERSONNAME Varchar(50),
FILENO Varchar(30),
ACCOUNTTYPE Smallint,
AMOUNT Decimal(9,2),
DUEDATE Timestamp,
BANKNAME Varchar(50),
CHECKNO Varchar(10),
NOTES Varchar(200),
PAIDINFULL Smallint,
PAIDSF Decimal(9,2),
BANKACCNO Varchar(20),
CHECKOWNER Varchar(50),
ENDORSEDTO Integer,
STATE Integer,
ID Integer,
MYTRANSID Integer,
MYTRANSTYP Smallint,
PERSONID Integer,
CHECKGIVER Varchar(50) )
AS
BEGIN
for
select * from (
SELECT        ACCOUNTS.DATEX, PEOPLE.NAME as personname, ACCOUNTS.ACCOUNTTYPE, ACCOUNTS.AMOUNT, ACCOUNTS.DUEDATE, BANKS.BANKNAME, ACCOUNTS.CHECKNO, 
                     ACCOUNTS.NOTES, ACCOUNTS.PAIDINFULL, SUM(PAYMENTS.AMOUNTPAID) AS PAIDSF, ACCOUNTS.BANKACCNO, ACCOUNTS.CHECKOWNER, 
                     ACCOUNTS.ENDORSEDTO, ACCOUNTS.STATE, 
                      ACCOUNTS.OUTTRANSID  AS MYTRANSID, 
                     ACCOUNTS.OUTTRANSTYP  AS MYTRANSTYP, ACCOUNTS.ID, 
                     ACCOUNTS.PERSONID, ACCOUNTS.FILENO,'' as checkgiver
FROM            ACCOUNTS LEFT OUTER JOIN
                     PEOPLE ON ACCOUNTS.PERSONID = PEOPLE.ID LEFT OUTER JOIN
                     BANKS ON ACCOUNTS.BANKID = BANKS.BANKID LEFT OUTER JOIN
                     PAYMENTS ON ACCOUNTS.ID = PAYMENTS.ACCOUNTID
WHERE       (ACCOUNTS.DATEX BETWEEN :STARTDATE AND :ENDDATE)  AND (ACCOUNTS.OUTTRANSTYP<>-1) and accounts.ACCOUNTTYPE<>2
GROUP BY ACCOUNTS.DATEX, personname, ACCOUNTS.FILENO, ACCOUNTS.ACCOUNTTYPE, ACCOUNTS.AMOUNT, ACCOUNTS.DUEDATE, BANKS.BANKNAME, ACCOUNTS.CHECKNO, 
                     ACCOUNTS.NOTES, ACCOUNTS.PAIDINFULL, ACCOUNTS.BANKACCNO, ACCOUNTS.CHECKOWNER, ACCOUNTS.ENDORSEDTO, ACCOUNTS.STATE, ACCOUNTS.ID, 
                     MYTRANSID, MYTRANSTYP, ACCOUNTS.PERSONID,checkgiver
union SELECT        ACCOUNTS.DATEX, PEOPLE.NAME as personname, ACCOUNTS.ACCOUNTTYPE, ACCOUNTS.AMOUNT, ACCOUNTS.DUEDATE , BANKS.BANKNAME, ACCOUNTS.CHECKNO, 
                     ACCOUNTS.NOTES, ACCOUNTS.PAIDINFULL, SUM(PAYMENTS.AMOUNTPAID) AS PAIDSF, ACCOUNTS.BANKACCNO, ACCOUNTS.CHECKOWNER, 
                     ACCOUNTS.ENDORSEDTO, ACCOUNTS.STATE, 
                      ACCOUNTS.OUTTRANSID  AS MYTRANSID, 
                     ACCOUNTS.OUTTRANSTYP  AS MYTRANSTYP, ACCOUNTS.ID, 
                     ACCOUNTS.PERSONID, ACCOUNTS.FILENO, x.name as checkgiver
FROM            ACCOUNTS LEFT OUTER JOIN
                     PEOPLE ON ACCOUNTS.ENDORSEDTO = PEOPLE.ID LEFT OUTER JOIN
                     BANKS ON ACCOUNTS.BANKID = BANKS.BANKID LEFT OUTER JOIN
                     PAYMENTS ON ACCOUNTS.ID = PAYMENTS.ACCOUNTID
                    left outer join (select ACCOUNTS.id, PEOPLE.name from PEOPLE inner join ACCOUNTS on people.id=accounts.PERSONID) x on x.ID=accounts.ID
WHERE       (ACCOUNTS.DATEX BETWEEN :STARTDATE AND :ENDDATE)  AND (ACCOUNTS.OUTTRANSTYP<>-1) and accounts.ACCOUNTTYPE=2
GROUP BY ACCOUNTS.DATEX, personname, ACCOUNTS.FILENO, ACCOUNTS.ACCOUNTTYPE, ACCOUNTS.AMOUNT,ACCOUNTS.DUEDATE, BANKS.BANKNAME, ACCOUNTS.CHECKNO, 
                     ACCOUNTS.NOTES, ACCOUNTS.PAIDINFULL, ACCOUNTS.BANKACCNO, ACCOUNTS.CHECKOWNER, ACCOUNTS.ENDORSEDTO, ACCOUNTS.STATE, ACCOUNTS.ID, 
                     MYTRANSID, MYTRANSTYP, ACCOUNTS.PERSONID,checkgiver
           )          
                     order by DATEX
into
:DATEX,
:personname,
:FILENO,
:ACCOUNTTYPE,
:AMOUNT,
:DUEDATE,
:BANKNAME,
:CHECKNO,
:NOTES,
:PAIDINFULL,
:PAIDSF,
:BANKACCNO,
:CHECKOWNER,
:ENDORSEDTO,
:STATE,
:ID,
:MYTRANSID,
:MYTRANSTYP,
:PERSONID,
:checkgiver
DO
begin
suspend;
end
END^
SET TERM ; ^
GRANT EXECUTE
 ON PROCEDURE SP_OUTWARD_ACCOUNTS TO  SYSDBA;

This code works when I run it on the query screen, and it compiles as stored proc, but when I try to run the stored proc as :

SELECT p.XX, p.PERSONNAME, p.FILENO, p.ACCOUNTTYPE, p.AMOUNT, p.YY, p.BANKNAME,     p.CHECKNO, p.NOTES, p.PAIDINFULL, p.PAIDSF, p.BANKACCNO, p.CHECKOWNER, p.ENDORSEDTO, p.STATE, p.ID, p.MYTRANSID, p.MYTRANSTYP, p.PERSONID, p.CHECKGIVER
FROM SP_OUTWARD_ACCOUNTS('2014-03-01', '2014-03-20') p

An IBPP error occurred.

* IBPP::SQLException * Context: Statement::Fetch Message: isc_dsql_fetch failed.

SQL Message : -413 Overflow occurred during data type conversion.

Engine Code : 335544334 Engine Message : conversion error from string "2014-02-28 00:00:00.0000" At procedure 'SP_OUTWARD_ACCOUNTS' line: 28, col: 1


OK

What is wrong? please help. tables structre:

    TABLE ACCOUNTS
(
  ACCOUNTTYPE Smallint,
  PERSONID Integer,
  DUEDATE Timestamp,
  NOTES Varchar(200) DEFAULT '',
  AMOUNT Decimal(9,2) DEFAULT 0,
  BANKID Integer,
  DIRECTION Smallint,
  TRANSID Integer DEFAULT -1,
  DATEX Timestamp,
  ID Integer NOT NULL,
  PAIDINFULL Smallint DEFAULT 0,
  CHECKNO Varchar(10),
  TRANSTYPE Smallint DEFAULT -1,
  BANKACCNO Varchar(20) CHARACTER SET ASCII,
  CHECKOWNER Varchar(50),
  ENDORSEDTO Integer DEFAULT 0,
  STATE Integer DEFAULT 0,
  OUTTRANSID Integer DEFAULT -1,
  OUTTRANSTYP Smallint DEFAULT -1,
  DEPOSITBANK Integer DEFAULT -1,
  PARENT Integer DEFAULT -1,
  FILENO Varchar(30),
  CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ID)
);

PEOPLE:

TABLE PEOPLE
(
  CTYPE Smallint,
  NAME Varchar(50),
  COMPANY Varchar(50),
  PHONE Varchar(30),
  MOBILE Varchar(30),
  EMAIL Varchar(40),
  ADDRESS Varchar(120),
  NOTES Varchar(200),
  ID Integer NOT NULL,
  HIDDEN Smallint DEFAULT 0
);

BANKS:

TABLE BANKS
(
  BANKNAME Varchar(50),
  BANKBALANCE Decimal(9,2) DEFAULT 0,
  BANKID Integer NOT NULL
);

PAYMENTS:

TABLE PAYMENTS
(
  ACCOUNTID Integer,
  NOTES Varchar(200),
  AMOUNTPAID Decimal(9,2) DEFAULT 0,
  PAYMENTDATE Timestamp,
  ID Integer NOT NULL,
  RECORDDATETIME Timestamp DEFAULT CURRENT_TIMESTAMP,
  DIRECTION Smallint
);
È stato utile?

Soluzione

The problem is that the columns in your select do not match the output columns in the INTO clause. The mapping of INTO is based on position, not on name!

If you look closely they map like:

ACCOUNTS.DATEX -------------> :DATEX,
PEOPLE.NAME as personname --> :personname,
ACCOUNTS.ACCOUNTTYPE -------> :FILENO,      <==== Mismatch starts here
ACCOUNTS.AMOUNT ------------> :ACCOUNTTYPE,
ACCOUNTS.DUEDATE -----------> :AMOUNT,
BANKS.BANKNAME -------------> :DUEDATE,
....

The problem occurs when ACCOUNTS.DUEDATE is assigned to AMOUNT (which is a DECIMAL(9,2)). This is a conversion that is not supported, so Firebird attempts TIMESTAMP => string (VARCHAR/CHAR) => DECIMAL(9,2). And this conversion fails.

Note that it looks like this isn't the only mixup in column order you have, so only fixing this one isn't going to solve the problem.

The best solution is probably to replace the SELECT * with an explicit list in the same order as your INTO clause.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top