Home » Developer & Programmer » Forms » OCI
OCI [message #81987] Mon, 07 April 2003 12:33
Flum
Messages: 1
Registered: April 2003
Junior Member
I have defined queue table and queue.
I have defined trigger that notify change of state of any attribute.
I want call a callback function by the oracle advanced queuing mechanism but when i call subscriver function in C language, i receive this message
ora-03120 : two task conversion routine : integer overflow.

I don't find solution for this question.
Note:
- i defined an objiect type with 3 attribute
- i have read all oracle manual

example of C code that retuirn error
status = OCIHandleAlloc((dvoid *) envhp, (dvoid **)subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION, (size_t) 0, (dvoid **) 0);
/* set subscription name in handle */
status = OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION, (dvoid *) subscriptionName,
(ub4) strlen((char *)subscriptionName), (ub4) OCI_ATTR_SUBSCR_NAME, errhp);
/* set callback function in handle */
status = OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION, (dvoid *) func, (ub4) 0,
(ub4) OCI_ATTR_SUBSCR_CALLBACK, errhp);
status =OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION,(dvoid *) &ctx, (ub4) sizeof(ctx),(ub4) OCI_ATTR_SUBSCR_CTX, errhp);
/* set namespace in handle */
status =OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION, (dvoid *) &Namespace, (ub4) 0,
(ub4) OCI_ATTR_SUBSCR_NAMESPACE, errhp);
status =OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION, (dvoid *) deqmesg, (ub4) sizeof(deqmesg),
(ub4) OCI_ATTR_SUBSCR_PAYLOAD, errhp);
printf("Begining Registration for subscription %sn", subscriptionName);
checkerr(errhp, OCISubscriptionRegister(svchp, subscrhp, 1, errhp, OCI_DEFAULT));
printf("donen");

and the pl/sql code

-- Creazione tipo di messaggio da inserire nella coda

create type oMessageType as object(
id_lotto NUMBER(8),
stato_exec NUMBER(8),
text VARCHAR2(80));
/
-------------------------------------- Creato tipo.

-- creazione tabella per la coda

begin
dbms_aqadm.create_queue_table (
Queue_table => 'qtLottiPronti',
Multiple_consumers => TRUE,
Queue_payload_type => 'oMessageType',
Compatible => '8.1.5');
end;
/
------------------------- Tabella per la coda creata

-- Creazione della coda

begin
dbms_aqadm.create_queue (
queue_name => 'qCodaLottiPronti',
queue_table => 'qtLottiPronti');
end;
/

--------------------------------------- Coda creata

-- Start della coda

begin
dbms_aqadm.start_queue (
queue_name => 'qCodaLottiPronti');
end;
/

----------------------------------- Coda attivata

---- Creazionme trigger

CREATE OR REPLACE TRIGGER LottoPronto
AFTER UPDATE OF FRM_LOTTI_STATO_EXEC
ON FRM_LOTTI
REFERENCING NEW newLOTTI
FOR EACH ROW
WHEN
( newLOTTI.FRM_LOTTI_STATO_EXEC = 2 )

DECLARE
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle RAW(16);
message oMessageType;

BEGIN
message := oMessageType(:newLotti.FRM_LOTTI_ID_LOTTO,:newLotti.FRM_LOTTI_STATO_EXEC,'ENQUEUED ON qCodaLottipronti');
/* Enqueue to msg_queue: */
dbms_aq.enqueue(
queue_name => 'qCodaLottiPronti',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => message,
msgid => message_handle);

insert into CAMBIORILEVATO values (1);
END;
/


Thanks
F.L.
Previous Topic: ANIMATED GIF
Next Topic: iterate through text items
Goto Forum:
  


Current Time: Wed Apr 24 02:12:23 CDT 2024