level 1
1K1024by
楼主
有时会出现这种错误,但数据又更新成功!
ERROR [HY010] [IBM][CLI Driver] CLI0125E 函数顺序错误。 SQLSTATE=HY010
数据库版本 DB2 9.7
我写的个存储过程:
CREATE PROCEDURE SP_OPCHARGE(IN RequestXml XML)--, OUT fDebitSum DECIMAL(12, 4), OUT sSerId VARCHAR(22))
LANGUAGE SQL
MODIFIES SQL DATA
RESULT SETS 1
BEGIN ATOMIC
DECLARE ErrorId CONDITION FOR SQLSTATE *90001*;
DECLARE ErrorMsg VARCHAR(1000); --错误信息
DECLARE sUserId VARCHAR(8);
DECLARE sCardNo VARCHAR(10);
DECLARE sFlowNo VARCHAR(20);
DECLARE sDay VARCHAR(10);
DECLARE sTime VARCHAR(8);
DECLARE sBankNo VARCHAR(20);
DECLARE sState VARCHAR(10);
DECLARE dOperDT TIMESTAMP; --操作时间
DECLARE iBillNo INTEGER; --发票号
DECLARE iMaxBillNo INTEGER; --取大发票号
DECLARE sOpuseno VARCHAR(8); --票本号
DECLARE fDebitSum DECIMAL(12, 2);
DECLARE sSerId VARCHAR(22);
DECLARE sCRcpNo VARCHAR(12);
DECLARE sTerminalno VARCHAR(12); --机器号
SET sCardNo = XMLCAST(XMLQUERY(*$A/Request/CardNo* passing requestXml AS "A") AS VARCHAR(10));
SET sUserId = XMLCAST(XMLQUERY(*$A/Request/UserId* passing requestXml AS "A") AS VARCHAR(8));
SET sFlowNo = XMLCAST(XMLQUERY(*$A/Request/FlowNo* passing requestXml AS "A") AS VARCHAR(22));
SET sDay = XMLCAST(XMLQUERY(*$A/Request/Day* passing requestXml AS "A") AS VARCHAR(10));
SET sTime = XMLCAST(XMLQUERY(*$A/Request/Time* passing requestXml AS "A") AS VARCHAR(8));
SET sBankNo = XMLCAST(XMLQUERY(*$A/Request/BankNo* passing requestXml AS "A") AS VARCHAR(20));
SET sTerminalno = XMLCAST(XMLQUERY(*$A/Request/Terminalno* passing requestXml AS "A") AS VARCHAR(12));
SET dOperDT = CAST(sDay||* *||sTime AS TIMESTAMP);
SET fDebitSum = 0;
SET sSerId = sFlowNo;
FOR c_Charge AS SELECT NULLIF(t.CaseNo,**) AS CaseNo,
NULLIF(t.ChargeNo,**) AS ChargeNo,
NULLIF(t.ChargeId,**) AS ChargeId,
NULLIF(t.DebitSum,**) AS DebitSum,
t.ChargeType AS ChargeType
FROM xmltable(*$A/Request/ChargeList/Item* passing requestXml AS "A"
COLUMNS
CaseNo VARCHAR(12) PATH *CaseNo*,
ChargeNo VARCHAR(20) PATH *ChargeNo*,
ChargeId VARCHAR(12) PATH *ChargeId*,
DebitSum VARCHAR(10) PATH *DebitSum*,
ChargeType INTEGER PATH *ChargeType*
) AS t DO
--取门诊发票号
select EndNum, NowNum, OPUSENO INTO iMaxBillNo, iBillNo, sOpuseno from NL_OpUse WHERE OPMANID = sUserId and BillID =*01*
and INUSEMK=*是* and ValidMk=*是* and NowNum <= EndNum;
IF (sOpuseno = NULL) OR (sOpuseno = **) THEN
SET ErrorMsg =*当前无可用收据或收据已用完!(本机无法收费)*;
SIGNAL SQLSTATE *90001* SET MESSAGE_TEXT = ErrorMsg;
END IF;
IF c_Charge.ChargeType = 1 THEN
--检验检查收费
SELECT STATE INTO sState FROM CL_CHARGE WHERE CLCHECKNO = c_Charge.ChargeNo fetch first 1 rows only;
IF sState <> *开单* THEN
SET ErrorMsg =*缴费失败,当前单据号:*||c_Charge.ChargeNo||*的状态:*||sState ;
SIGNAL SQLSTATE *90001* SET MESSAGE_TEXT = ErrorMsg;
END IF;
--更新收费操作
UPDATE CL_CHARGE SET BILLNO=iBillNo,billid = *01*, opuseno=sOpuseno, payeeid=sUserId, payeetm=dOperDT,
billvldmk=*是*, remarks=*自动发卡机收费*,flowno=sFlowNo,STATE = *缴费*,BankNo=sBankNo,
Terminalno = sTerminalno, PAYMODE=*转帐*
WHERE CLCHECKNO = c_Charge.ChargeNo;
--更新检验检查项目状态
UPDATE TH_CHECK SET STATE = *缴费* WHERE CLCHECKNO = c_Charge.ChargeNo;
--取金额
SELECT coalesce(sum(DEBITSUM), 0) + fDebitSum INTO fDebitSum FROM CL_CHARGE WHERE CLCHECKNO = c_Charge.ChargeNo;
ELSE
--处方与普通收费项目
SELECT STATE INTO sState FROM CL_CHARGE WHERE CCHARGENO = c_Charge.ChargeNo;
IF sState <> *开单* THEN
SET ErrorMsg =*缴费失败,当前单据号:*||c_Charge.ChargeNo||*的状态:*||sState ;
SIGNAL SQLSTATE *90001* SET MESSAGE_TEXT = ErrorMsg;
END IF;
--更新收费操作
UPDATE CL_CHARGE SET BILLNO=iBillNo,billid = *01*, opuseno=sOpuseno, payeeid=sUserId, payeetm=dOperDT,
billvldmk=*是*, remarks=*自动发卡机收费*,flowno=sFlowNo,STATE = *缴费*,BankNo=sBankNo,
Terminalno = sTerminalno, PAYMODE=*转帐*
WHERE CCHARGENO = c_Charge.ChargeNo;
--更新药品状态
IF c_Charge.ChargeType = 2 THEN
UPDATE CL_RCP SET CHARGEMK = *是* WHERE CRCPNO = (SELECT CRCPNO FROM CL_CHARGE WHERE CCHARGENO = c_Charge.ChargeNo);
END IF;
--取金额
SELECT coalesce(DEBITSUM, 0) + fDebitSum INTO fDebitSum FROM CL_CHARGE WHERE CCHARGENO = c_Charge.ChargeNo;
END IF;
--票据号加1
SET iBillNo = iBillNo + 1;
--更新发票号
UPDATE NL_OPUSE SET NOWNUM = iBillNo WHERE OPMANID = sUserId and BillID =*01*
and INUSEMK=*是* and ValidMk=*是* and NowNum <= EndNum;
END FOR;
--<CaseNo>门诊号</CaseNo>
-- <ChargeName>收费项目名称</ChargeName>
-- <ExecDeptName>执行科室</ExecDeptName>
-- <CrcpNo>处方号</CrcpNo>
-- <BillNo>发票号</BillNo>
-- <ChargeNum>数量</ChargeNum>
-- <PriceSum>金额</PriceSum>
-- <PayeeTM>交费时间</PayeeTM>
-- <PayeeId>收费人员编码</PayeeId>
-- <PayeeName>收费人员名称</PayeeName>
-- <DoctorName>开单医生</DoctorName>
----存储过程2段 返回数据
P2: BEGIN
--定义返回数据集游标
DECLARE c_chback CURSOR WITH RETURN FOR
SELECT a.CCASENO AS CaseNo, d.CHARGE AS ChargeName,b.DEPT AS ExecDeptName, a.CRCPNO AS CrcpNo,
a.BILLNO AS BillNo, a.CHARGENUM AS ChargeNum, a.DEBITSUM AS PriceSum, a.PAYEEID AS PayeeId,
a.PAYEETM AS PayeeTM, c.EMP AS DoctorName, f.EMP AS PayeeName, sSerId AS SerId, fDebitSum AS DebitSum
FROM CL_CHARGE a
INNER JOIN ST_DEPT b ON a.EXECDEPTID = b.DEPTID
INNER JOIN ST_EMP c ON a.DOCTORID = c.EMPID
INNER JOIN ST_EMP f ON a.PAYEEID = f.EMPID
INNER JOIN ST_CHARGE d ON a.CHARGEID = d.CHARGEID
WHERE a.FLOWNO = TRIM(sFlowNo) AND a.BANKNO = TRIM(sBankNo) AND (a.CLCHECKNO IS NULL OR a.CLCHECKNO = **)
UNION ALL
SELECT a.CCASENO AS CaseNo, h.checkitem AS ChargeName,b.DEPT AS ExecDeptName, ** AS CrcpNo,
a.BILLNO AS BillNo, 1 AS ChargeNum, sum(a.DEBITSUM) AS PriceSum, a.PAYEEID AS PayeeId,
a.PAYEETM AS PayeeTM, c.EMP AS DoctorName, f.EMP AS PayeeName, sSerId AS SerId, fDebitSum AS DebitSum
FROM CL_CHARGE a
INNER JOIN ST_DEPT b ON a.EXECDEPTID = b.DEPTID
INNER JOIN ST_EMP c ON a.DOCTORID = c.EMPID
INNER JOIN ST_EMP f ON a.PAYEEID = f.EMPID
INNER JOIN TH_CHECK g ON a.CLCHECKNO = g.CLCHECKNO
INNER JOIN ST_CHECKITEM h ON g.CHECKITEMID=h.CHECKITEMID
WHERE a.FLOWNO = TRIM(sFlowNo) AND a.BANKNO = TRIM(sBankNo) AND a.CLCHECKNO IS NOT NULL
GROUP BY a.CCASENO, h.checkitem,b.DEPT, a.BILLNO, a.PAYEEID,
a.PAYEETM, c.EMP, f.EMP;
--执行查询并返回游标数据集
OPEN c_chback;
END P2;
END;
2014年08月11日 06点08分
1
ERROR [HY010] [IBM][CLI Driver] CLI0125E 函数顺序错误。 SQLSTATE=HY010
数据库版本 DB2 9.7
我写的个存储过程:
CREATE PROCEDURE SP_OPCHARGE(IN RequestXml XML)--, OUT fDebitSum DECIMAL(12, 4), OUT sSerId VARCHAR(22))
LANGUAGE SQL
MODIFIES SQL DATA
RESULT SETS 1
BEGIN ATOMIC
DECLARE ErrorId CONDITION FOR SQLSTATE *90001*;
DECLARE ErrorMsg VARCHAR(1000); --错误信息
DECLARE sUserId VARCHAR(8);
DECLARE sCardNo VARCHAR(10);
DECLARE sFlowNo VARCHAR(20);
DECLARE sDay VARCHAR(10);
DECLARE sTime VARCHAR(8);
DECLARE sBankNo VARCHAR(20);
DECLARE sState VARCHAR(10);
DECLARE dOperDT TIMESTAMP; --操作时间
DECLARE iBillNo INTEGER; --发票号
DECLARE iMaxBillNo INTEGER; --取大发票号
DECLARE sOpuseno VARCHAR(8); --票本号
DECLARE fDebitSum DECIMAL(12, 2);
DECLARE sSerId VARCHAR(22);
DECLARE sCRcpNo VARCHAR(12);
DECLARE sTerminalno VARCHAR(12); --机器号
SET sCardNo = XMLCAST(XMLQUERY(*$A/Request/CardNo* passing requestXml AS "A") AS VARCHAR(10));
SET sUserId = XMLCAST(XMLQUERY(*$A/Request/UserId* passing requestXml AS "A") AS VARCHAR(8));
SET sFlowNo = XMLCAST(XMLQUERY(*$A/Request/FlowNo* passing requestXml AS "A") AS VARCHAR(22));
SET sDay = XMLCAST(XMLQUERY(*$A/Request/Day* passing requestXml AS "A") AS VARCHAR(10));
SET sTime = XMLCAST(XMLQUERY(*$A/Request/Time* passing requestXml AS "A") AS VARCHAR(8));
SET sBankNo = XMLCAST(XMLQUERY(*$A/Request/BankNo* passing requestXml AS "A") AS VARCHAR(20));
SET sTerminalno = XMLCAST(XMLQUERY(*$A/Request/Terminalno* passing requestXml AS "A") AS VARCHAR(12));
SET dOperDT = CAST(sDay||* *||sTime AS TIMESTAMP);
SET fDebitSum = 0;
SET sSerId = sFlowNo;
FOR c_Charge AS SELECT NULLIF(t.CaseNo,**) AS CaseNo,
NULLIF(t.ChargeNo,**) AS ChargeNo,
NULLIF(t.ChargeId,**) AS ChargeId,
NULLIF(t.DebitSum,**) AS DebitSum,
t.ChargeType AS ChargeType
FROM xmltable(*$A/Request/ChargeList/Item* passing requestXml AS "A"
COLUMNS
CaseNo VARCHAR(12) PATH *CaseNo*,
ChargeNo VARCHAR(20) PATH *ChargeNo*,
ChargeId VARCHAR(12) PATH *ChargeId*,
DebitSum VARCHAR(10) PATH *DebitSum*,
ChargeType INTEGER PATH *ChargeType*
) AS t DO
--取门诊发票号
select EndNum, NowNum, OPUSENO INTO iMaxBillNo, iBillNo, sOpuseno from NL_OpUse WHERE OPMANID = sUserId and BillID =*01*
and INUSEMK=*是* and ValidMk=*是* and NowNum <= EndNum;
IF (sOpuseno = NULL) OR (sOpuseno = **) THEN
SET ErrorMsg =*当前无可用收据或收据已用完!(本机无法收费)*;
SIGNAL SQLSTATE *90001* SET MESSAGE_TEXT = ErrorMsg;
END IF;
IF c_Charge.ChargeType = 1 THEN
--检验检查收费
SELECT STATE INTO sState FROM CL_CHARGE WHERE CLCHECKNO = c_Charge.ChargeNo fetch first 1 rows only;
IF sState <> *开单* THEN
SET ErrorMsg =*缴费失败,当前单据号:*||c_Charge.ChargeNo||*的状态:*||sState ;
SIGNAL SQLSTATE *90001* SET MESSAGE_TEXT = ErrorMsg;
END IF;
--更新收费操作
UPDATE CL_CHARGE SET BILLNO=iBillNo,billid = *01*, opuseno=sOpuseno, payeeid=sUserId, payeetm=dOperDT,
billvldmk=*是*, remarks=*自动发卡机收费*,flowno=sFlowNo,STATE = *缴费*,BankNo=sBankNo,
Terminalno = sTerminalno, PAYMODE=*转帐*
WHERE CLCHECKNO = c_Charge.ChargeNo;
--更新检验检查项目状态
UPDATE TH_CHECK SET STATE = *缴费* WHERE CLCHECKNO = c_Charge.ChargeNo;
--取金额
SELECT coalesce(sum(DEBITSUM), 0) + fDebitSum INTO fDebitSum FROM CL_CHARGE WHERE CLCHECKNO = c_Charge.ChargeNo;
ELSE
--处方与普通收费项目
SELECT STATE INTO sState FROM CL_CHARGE WHERE CCHARGENO = c_Charge.ChargeNo;
IF sState <> *开单* THEN
SET ErrorMsg =*缴费失败,当前单据号:*||c_Charge.ChargeNo||*的状态:*||sState ;
SIGNAL SQLSTATE *90001* SET MESSAGE_TEXT = ErrorMsg;
END IF;
--更新收费操作
UPDATE CL_CHARGE SET BILLNO=iBillNo,billid = *01*, opuseno=sOpuseno, payeeid=sUserId, payeetm=dOperDT,
billvldmk=*是*, remarks=*自动发卡机收费*,flowno=sFlowNo,STATE = *缴费*,BankNo=sBankNo,
Terminalno = sTerminalno, PAYMODE=*转帐*
WHERE CCHARGENO = c_Charge.ChargeNo;
--更新药品状态
IF c_Charge.ChargeType = 2 THEN
UPDATE CL_RCP SET CHARGEMK = *是* WHERE CRCPNO = (SELECT CRCPNO FROM CL_CHARGE WHERE CCHARGENO = c_Charge.ChargeNo);
END IF;
--取金额
SELECT coalesce(DEBITSUM, 0) + fDebitSum INTO fDebitSum FROM CL_CHARGE WHERE CCHARGENO = c_Charge.ChargeNo;
END IF;
--票据号加1
SET iBillNo = iBillNo + 1;
--更新发票号
UPDATE NL_OPUSE SET NOWNUM = iBillNo WHERE OPMANID = sUserId and BillID =*01*
and INUSEMK=*是* and ValidMk=*是* and NowNum <= EndNum;
END FOR;
--<CaseNo>门诊号</CaseNo>
-- <ChargeName>收费项目名称</ChargeName>
-- <ExecDeptName>执行科室</ExecDeptName>
-- <CrcpNo>处方号</CrcpNo>
-- <BillNo>发票号</BillNo>
-- <ChargeNum>数量</ChargeNum>
-- <PriceSum>金额</PriceSum>
-- <PayeeTM>交费时间</PayeeTM>
-- <PayeeId>收费人员编码</PayeeId>
-- <PayeeName>收费人员名称</PayeeName>
-- <DoctorName>开单医生</DoctorName>
----存储过程2段 返回数据
P2: BEGIN
--定义返回数据集游标
DECLARE c_chback CURSOR WITH RETURN FOR
SELECT a.CCASENO AS CaseNo, d.CHARGE AS ChargeName,b.DEPT AS ExecDeptName, a.CRCPNO AS CrcpNo,
a.BILLNO AS BillNo, a.CHARGENUM AS ChargeNum, a.DEBITSUM AS PriceSum, a.PAYEEID AS PayeeId,
a.PAYEETM AS PayeeTM, c.EMP AS DoctorName, f.EMP AS PayeeName, sSerId AS SerId, fDebitSum AS DebitSum
FROM CL_CHARGE a
INNER JOIN ST_DEPT b ON a.EXECDEPTID = b.DEPTID
INNER JOIN ST_EMP c ON a.DOCTORID = c.EMPID
INNER JOIN ST_EMP f ON a.PAYEEID = f.EMPID
INNER JOIN ST_CHARGE d ON a.CHARGEID = d.CHARGEID
WHERE a.FLOWNO = TRIM(sFlowNo) AND a.BANKNO = TRIM(sBankNo) AND (a.CLCHECKNO IS NULL OR a.CLCHECKNO = **)
UNION ALL
SELECT a.CCASENO AS CaseNo, h.checkitem AS ChargeName,b.DEPT AS ExecDeptName, ** AS CrcpNo,
a.BILLNO AS BillNo, 1 AS ChargeNum, sum(a.DEBITSUM) AS PriceSum, a.PAYEEID AS PayeeId,
a.PAYEETM AS PayeeTM, c.EMP AS DoctorName, f.EMP AS PayeeName, sSerId AS SerId, fDebitSum AS DebitSum
FROM CL_CHARGE a
INNER JOIN ST_DEPT b ON a.EXECDEPTID = b.DEPTID
INNER JOIN ST_EMP c ON a.DOCTORID = c.EMPID
INNER JOIN ST_EMP f ON a.PAYEEID = f.EMPID
INNER JOIN TH_CHECK g ON a.CLCHECKNO = g.CLCHECKNO
INNER JOIN ST_CHECKITEM h ON g.CHECKITEMID=h.CHECKITEMID
WHERE a.FLOWNO = TRIM(sFlowNo) AND a.BANKNO = TRIM(sBankNo) AND a.CLCHECKNO IS NOT NULL
GROUP BY a.CCASENO, h.checkitem,b.DEPT, a.BILLNO, a.PAYEEID,
a.PAYEETM, c.EMP, f.EMP;
--执行查询并返回游标数据集
OPEN c_chback;
END P2;
END;