CREATE DBPROC DBADMIN.BILLING(IN ID_KWR INT,IN ID_PAGE INT, IN ID_ZONE INT,IN PART_SITE INT,IN HOST CHAR(250),IN IP CHAR(100),IN REFERER CHAR(1024),IN ID_USER INT,IN R_USER CHAR(100),IN STATISTIC INT, IN PAYMENT INT, IN EVENT INT,OUT VAR_OUT CHAR(512)) AS VAR ID_CAMP INT; R_SUM FLOAT; PAY_TYPE INT; ID_MOVES INT; NUM_ROWS INT; ID_AUC INT; ID_ACC INT; ID_REKLAMA INT; PROMO_TYPE INT; TYPE_REK INT; /* STATISTIC - выполнять ли статистику для объекта PAYMENT - выполнять ли проплату для объекта EVENT - событие. Т.е процедура вызывается с: 2 - Клик 3 - Просмтор */
IF PART_SITE!=0 THEN BEGIN IF PART_SITE = 1 THEN BEGIN SELECT BI_REF_KEYWORD.ID FROM DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_KEYW WHERE BI_REF_KEYWORD.ID_EO=:ID_KWR AND BI_REF_KEYWORD.ID=BI_PAGE_KEYW.ID_PAGE AND BI_PAGE_KEYW.ID_PAGE=:id_page ; END; IF PART_SITE = 2 THEN BEGIN SELECT BI_REF_KEYWORD.ID FROM DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_KEYW WHERE BI_REF_KEYWORD.ID_PB=:ID_KWR AND BI_REF_KEYWORD.ID=BI_PAGE_KEYW.ID_PAGE AND BI_PAGE_KEYW.ID_PAGE=:id_page ; END; IF PART_SITE = 3 THEN BEGIN SELECT BI_REF_KEYWORD.ID FROM DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_KEYW WHERE BI_REF_KEYWORD.ID_COMP=:ID_KWR AND BI_REF_KEYWORD.ID=BI_PAGE_KEYW.ID_PAGE AND BI_PAGE_KEYW.ID_PAGE=:id_page ; END; FETCH INTO :ID_KWR; END; /*Ранжируем рекламы для заданной стр, ключ. слова и зоны. Возвращаем одну из них*/ DECLARE TEMP_CURSOR CURSOR FOR SELECT BI_REKLAMA.ID AS ID_REK, BI_CAMP.ID_ACCOUNT AS ID_ACC, BI_CAMP.ID AS ID_CAMP, BI_REK_AUC.R_SUM, BI_ZONE.ID_PAY_TYPE AS PAY_TYPE, BI_PROMO.ID_TYPE_PROMO AS PROMO_TYPE, BI_AUCTION.ID AS ID_AUC, BI_REKLAMA.ID_TYPE_REK FROM DBADMIN.BI_REKLAMA, DBADMIN.BI_REK_AUC, DBADMIN.BI_PZ_AUC, DBADMIN.BI_AUCTION, DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE, DBADMIN.BI_PAGE_ZONE, DBADMIN.BI_CAMP, DBADMIN.INV_ACCOUNTS, DBADMIN.BI_ZONE, DBADMIN.BI_PROMO WHERE ROWNO<=1 AND BI_REF_KEYWORD.ID=:ID_KWR AND BI_PAGE.OUT_ID=:ID_PAGE AND BI_PAGE_ZONE.ID_PAGE=BI_PAGE.ID AND BI_PAGE_ZONE.ID_ZONE=:ID_ZONE AND BI_ZONE.ID=BI_PAGE_ZONE.ID_ZONE AND BI_PZ_AUC.ID_KEYWORD=BI_REF_KEYWORD.ID AND BI_PZ_AUC.ID_PAGE_ZONE=BI_PAGE_ZONE.ID AND BI_AUCTION.ID_PZ_AUC=BI_PZ_AUC.ID AND BI_AUCTION.ID=BI_REK_AUC.ID_AUCTION AND (BI_REK_AUC.R_SUM/(SELECT SUM(BI_REK_AUC.R_SUM) FROM DBADMIN.BI_REK_AUC, DBADMIN.BI_AUCTION, DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_ZONE, DBADMIN.BI_PAGE, DBADMIN.BI_PZ_AUC WHERE BI_REF_KEYWORD.ID=:ID_KWR AND BI_PAGE.OUT_ID=:ID_PAGE AND BI_PAGE_ZONE.ID_PAGE=BI_PAGE.ID AND BI_PAGE_ZONE.ID_ZONE=:ID_ZONE AND BI_PZ_AUC.ID_KEYWORD=BI_REF_KEYWORD.ID AND BI_PZ_AUC.ID_PAGE_ZONE=BI_PAGE_ZONE.ID AND BI_AUCTION.ID_PZ_AUC=BI_PZ_AUC.ID AND BI_REK_AUC.ID_AUCTION=BI_AUCTION.ID)>=BI_REK_AUC.NUM_VIEW/BI_PZ_AUC.AUC_VIEW) AND BI_REK_AUC.R_SUM!=0 AND BI_REKLAMA.ID=BI_REK_AUC.ID_REKLAMA AND BI_PROMO.ID_REKLAMA(+)=BI_REKLAMA.ID AND BI_CAMP.ID=BI_REKLAMA.ID_CAMP AND BI_CAMP.IS_ACTIVE=1 AND DATE(NOW())>=DATE(BI_CAMP.DT_CREATE) AND DATE(NOW())<=DATE(BI_CAMP.DT_END) AND DATE(NOW())>=DATE(BI_REKLAMA.DT_CREATE) AND DATE(NOW())<=DATE(BI_REKLAMA.DT_END) AND INV_ACCOUNTS.ID=BI_CAMP.ID_ACCOUNT AND INV_ACCOUNTS.BALANCE>BI_REK_AUC.R_SUM ORDER BY NUM_VIEW ASC; SET NUM_ROWS=0; WHILE NUM_ROWS<=$COUNT DO BEGIN FETCH TEMP_CURSOR INTO :id_reklama, :id_acc,:id_camp,:r_sum,:pay_type,:promo_type,:ID_AUC, :TYPE_REK; IF PROMO_TYPE IS NULL THEN SET PROMO_TYPE=0; SET VAR_OUT=ID_REKLAMA&'-'&PROMO_TYPE&'-'&TYPE_REK; /* Если необходимо провести стату */ IF STATISTIC=1 THEN BEGIN /* Если событие - клик, региструем клик */ IF EVENT=2 THEN BEGIN INSERT INTO DBADMIN.BI_STAT_CLICK SET ID_REKLAMA=:id_reklama, ID_PAGE=:id_page,ID_AUCTION=:ID_AUC,HOST=:host,REFERER=:referer,IP=:ip,USER=:r_user,ID_USER=:id_user; END; /* Если событие - просмотр, региструем просмтор */ IF EVENT=3 THEN BEGIN INSERT INTO DBADMIN.BI_STAT_VIEW SET ID_REKLAMA=:id_reklama, ID_PAGE=:id_page,ID_AUCTION=:ID_AUC,HOST=:host,REFERER=:referer,IP=:ip,USER=:r_user,ID_USER=:id_user; END; END; /* Если необходимо оплатить */ IF PAYMENT=1 THEN BEGIN /* Если тип оплаты объекта свопадает с событием, делаем проплаты*/ IF EVENT=PAY_TYPE THEN BEGIN SELECT INV_MOV_SEQ.NEXTVAL FROM DBADMIN.INV_MOVES; FETCH INTO :id_moves; INSERT INTO DBADMIN.INV_MOVES SET ID=:id_moves,ID_ACC_FROM=:id_acc,ID_ACC_TO=1,DATE_EXEC=NOW(),AMOUNT=:r_sum,ID_INV=NULL,BAL_AMOUNT=:r_sum; INSERT INTO DBADMIN.BI_PAY SET ID_PAY=:id_moves,ID_REKLAMA=:id_reklama,ID_CAMP=:id_camp; END; END; SET NUM_ROWS=NUM_ROWS+1; END; --------------------------------------------------------------------- CALL BILLING(920,1124,802,0,'pc3.nettle.ru','212.17.4.86','no referer',0,'anonymous',1,1,3,:out) Everthing work; We use PHP-ODBC. ODBC can't get result from "CALL BILLING(920,1124,802,0,'pc3.nettle.ru','212.17.4.86','no referer',0,'anonymous',1,1,3,:out)" I wrote function CALL_BILLING: ---------------------------------------------------------------------- CREATE FUNCTION DBADMIN.CALL_BILLING (ID_KWR INT,ID_PAGE INT,ID_ZONE INT,PART_SITE INT,HOST CHAR(250),IP CHAR(100),REFERER CHAR(1024),ID_USER INT,R_USER CHAR(100),STATISTIC INT,PAYMENT INT,EVENT INT) RETURNS varchar AS VAR VAR_OUT varchar; CALL DBADMIN.BILLING(:ID_KWR,:ID_PAGE, :ID_ZONE,:PART_SITE,':HOST',':IP',':REFERER',:ID_USER,':R_USER',:STATISTIC,:PAYMENT, :EVENT,:VAR_OUT); RETURN VAR_OUT; ------------------------------------------------------------------------- Type VAR_CHAR i try CHAR and VARCHAR; Error: Auto Commit: On, SQL Mode: Internal, Isolation Level: Committed General error;800 Implicit SERVERDB restart (connection aborted) SELECT CALL_BILLING(920,1124,802,0,'pc3.nettle.ru','212.17.4.86','no referer',0,'anonymous',1,1,3) FROM DUAL I replace in function "CALL DBADMIN.BILLING(:ID_KWR,:ID_PAGE, :ID_ZONE,:PART_SITE,':HOST',':IP',':REFERER',:ID_USER,':R_USER',:STATISTIC,:PAYMENT, :EVENT,:VAR_OUT);"->"CALL BILLING(920,1124,802,0,'pc3.nettle.ru','212.17.4.86','no referer',0,'anonymous',1,1,3,:var_out);" Nothing chenged; I wrote function without subquery: ---------------------------------------------------------------------- CREATE FUNCTION DBADMIN.FUNC_BILLING (ID_KWR INT,ID_PAGE INT,ID_ZONE INT,PART_SITE INT,HOST CHAR(250),IP CHAR(100),REFERER CHAR(1024),ID_USER INT,R_USER CHAR(100),STATISTIC INT,PAYMENT INT,EVENT INT) RETURNS CHAR(512) AS VAR ID_CAMP INT; R_SUM FLOAT; PAY_TYPE INT; ID_MOVES INT; NUM_ROWS INT; ID_AUC INT; ID_ACC INT; ID_REKLAMA INT; PROMO_TYPE INT; TYPE_REK INT; ALL_SUM FLOAT; VAR_OUT CHAR(512); /* STATISTIC - выполнять ли статистику для объекта PAYMENT - выполнять ли проплату для объекта EVENT - событие. Т.е процедура вызывается с: 2 - Клик 3 - Просмтор */ IF PART_SITE!=0 THEN BEGIN IF PART_SITE = 1 THEN BEGIN SELECT BI_REF_KEYWORD.ID FROM DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_KEYW WHERE BI_REF_KEYWORD.ID_EO=:ID_KWR AND BI_REF_KEYWORD.ID=BI_PAGE_KEYW.ID_PAGE AND BI_PAGE_KEYW.ID_PAGE=:id_page ; END; IF PART_SITE = 2 THEN BEGIN SELECT BI_REF_KEYWORD.ID FROM DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_KEYW WHERE BI_REF_KEYWORD.ID_PB=:ID_KWR AND BI_REF_KEYWORD.ID=BI_PAGE_KEYW.ID_PAGE AND BI_PAGE_KEYW.ID_PAGE=:id_page ; END; IF PART_SITE = 3 THEN BEGIN SELECT BI_REF_KEYWORD.ID FROM DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_KEYW WHERE BI_REF_KEYWORD.ID_COMP=:ID_KWR AND BI_REF_KEYWORD.ID=BI_PAGE_KEYW.ID_PAGE AND BI_PAGE_KEYW.ID_PAGE=:id_page ; END; FETCH INTO :ID_KWR; END; SELECT SUM(BI_REK_AUC.R_SUM) FROM DBADMIN.BI_REK_AUC, DBADMIN.BI_AUCTION, DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE_ZONE, DBADMIN.BI_PAGE, DBADMIN.BI_PZ_AUC WHERE BI_REF_KEYWORD.ID=:ID_KWR AND BI_PAGE.OUT_ID=:ID_PAGE AND BI_PAGE_ZONE.ID_PAGE=BI_PAGE.ID AND BI_PAGE_ZONE.ID_ZONE=:ID_ZONE AND BI_PZ_AUC.ID_KEYWORD=BI_REF_KEYWORD.ID AND BI_PZ_AUC.ID_PAGE_ZONE=BI_PAGE_ZONE.ID AND BI_AUCTION.ID_PZ_AUC=BI_PZ_AUC.ID AND BI_REK_AUC.ID_AUCTION=BI_AUCTION.ID; FETCH INTO :ALL_SUM; /*Ранжируем рекламы для заданной стр, ключ. слова и зоны. Возвращаем одну из них*/ DECLARE TEMP_CURSOR CURSOR FOR SELECT BI_REKLAMA.ID AS ID_REK, BI_CAMP.ID_ACCOUNT AS ID_ACC, BI_CAMP.ID AS ID_CAMP, BI_REK_AUC.R_SUM, BI_ZONE.ID_PAY_TYPE AS PAY_TYPE, BI_PROMO.ID_TYPE_PROMO AS PROMO_TYPE, BI_AUCTION.ID AS ID_AUC, BI_REKLAMA.ID_TYPE_REK FROM DBADMIN.BI_REKLAMA, DBADMIN.BI_REK_AUC, DBADMIN.BI_PZ_AUC, DBADMIN.BI_AUCTION, DBADMIN.BI_REF_KEYWORD, DBADMIN.BI_PAGE, DBADMIN.BI_PAGE_ZONE, DBADMIN.BI_CAMP, DBADMIN.INV_ACCOUNTS, DBADMIN.BI_ZONE, DBADMIN.BI_PROMO WHERE ROWNO<=1 AND BI_REF_KEYWORD.ID=:ID_KWR AND BI_PAGE.OUT_ID=:ID_PAGE AND BI_PAGE_ZONE.ID_PAGE=BI_PAGE.ID AND BI_PAGE_ZONE.ID_ZONE=:ID_ZONE AND BI_ZONE.ID=BI_PAGE_ZONE.ID_ZONE AND BI_PZ_AUC.ID_KEYWORD=BI_REF_KEYWORD.ID AND BI_PZ_AUC.ID_PAGE_ZONE=BI_PAGE_ZONE.ID AND BI_AUCTION.ID_PZ_AUC=BI_PZ_AUC.ID AND BI_AUCTION.ID=BI_REK_AUC.ID_AUCTION AND (BI_REK_AUC.R_SUM/:ALL_SUM>=BI_REK_AUC.NUM_VIEW/BI_PZ_AUC.AUC_VIEW) AND BI_REK_AUC.R_SUM!=0 AND BI_REKLAMA.ID=BI_REK_AUC.ID_REKLAMA AND BI_PROMO.ID_REKLAMA(+)=BI_REKLAMA.ID AND BI_CAMP.ID=BI_REKLAMA.ID_CAMP AND BI_CAMP.IS_ACTIVE=1 AND DATE(NOW())>=DATE(BI_CAMP.DT_CREATE) AND DATE(NOW())<=DATE(BI_CAMP.DT_END) AND DATE(NOW())>=DATE(BI_REKLAMA.DT_CREATE) AND DATE(NOW())<=DATE(BI_REKLAMA.DT_END) AND INV_ACCOUNTS.ID=BI_CAMP.ID_ACCOUNT AND INV_ACCOUNTS.BALANCE>BI_REK_AUC.R_SUM ORDER BY NUM_VIEW ASC; SET NUM_ROWS=0; WHILE NUM_ROWS<=$COUNT DO BEGIN FETCH TEMP_CURSOR INTO :id_reklama, :id_acc,:id_camp,:r_sum,:pay_type,:promo_type,:ID_AUC, :TYPE_REK; IF PROMO_TYPE IS NULL THEN SET PROMO_TYPE=0; SET VAR_OUT=id_reklama&'-'&promo_type&'-'&TYPE_REK; /* Если необходимо провести стату */ IF STATISTIC=1 THEN BEGIN /* Если событие - клик, региструем клик */ IF EVENT=2 THEN BEGIN INSERT INTO DBADMIN.BI_STAT_CLICK SET ID_REKLAMA=:id_reklama, ID_PAGE=:id_page,ID_AUCTION=:ID_AUC,HOST=:host,REFERER=:referer,IP=:ip,USER=:r_user,ID_USER=:id_user; END; /* Если событие - просмотр, региструем просмтор */ IF EVENT=3 THEN BEGIN INSERT INTO DBADMIN.BI_STAT_VIEW SET ID_REKLAMA=:id_reklama, ID_PAGE=:id_page,ID_AUCTION=:ID_AUC,HOST=:host,REFERER=:referer,IP=:ip,USER=:r_user,ID_USER=:id_user; END; END; /* Если необходимо оплатить */ IF PAYMENT=1 THEN BEGIN /* Если тип оплаты объекта свопадает с событием, делаем проплаты*/ IF EVENT=PAY_TYPE THEN BEGIN SELECT INV_MOV_SEQ.NEXTVAL FROM DBADMIN.INV_MOVES; FETCH INTO :id_moves; INSERT INTO DBADMIN.INV_MOVES SET ID=:id_moves,ID_ACC_FROM=:id_acc,ID_ACC_TO=1,DATE_EXEC=NOW(),AMOUNT=:r_sum,ID_INV=NULL,BAL_AMOUNT=:r_sum; INSERT INTO DBADMIN.BI_PAY SET ID_PAY=:id_moves,ID_REKLAMA=:id_reklama,ID_CAMP=:id_camp; END; END; SET NUM_ROWS=NUM_ROWS+1; END; IF $RC <> 100 THEN STOP ($RC, 'unexpected error'); RETURN VAR_OUT; ----------------------------------------------------------------------- Return unexpected error; What is wrong?