UNPACK_MESSAGE 过程 - 从本地消息缓冲区获取数据项

UNPACK_MESSAGE 过程从消息中检索下一个数据项并将其指定给变量。

调用其中一个 UNPACK_MESSAGE 过程之前,使用 RECEIVE_MESSAGE 过程将该消息放在本地消息缓冲区中。

语法

阅读语法图跳过直观语法图DBMS_PIPE.UNPACK_MESSAGE_NUMBER(item )
阅读语法图跳过直观语法图DBMS_PIPE.UNPACK_MESSAGE_CHAR (item)
阅读语法图跳过直观语法图DBMS_PIPE.UNPACK_MESSAGE_DATE(item )
阅读语法图跳过直观语法图DBMS_PIPE.UNPACK_MESSAGE_RAW (item)

过程参数

item
下列其中一种类型的输出自变量,用于指定从本地消息缓冲区接收数据项的变量。
例程 数据类型
UNPACK_MESSAGE_NUMBER DECFLOAT
UNPACK_MESSAGE_CHAR VARCHAR(4096)
UNPACK_MESSAGE_DATE DATE
UNPACK_MESSAGE_RAW BLOB(4096)

权限

对 DBMS_PIPE 模块的 EXECUTE 特权。

示例

在 proc1 中,将消息打包并发送。在 proc2 中,接收消息,根据该项的类型使用适当过程对其解包,然后将该消息显示至标准输出。

SET SERVEROUTPUT ON@ 

CREATE PROCEDURE proc1()
BEGIN
  DECLARE status INT;
  SET status = DBMS_PIPE.CREATE_PIPE( 'pipe1' );
  SET status = DBMS_PIPE.PACK_MESSAGE('message1');
  SET status = DBMS_PIPE.SEND_MESSAGE( 'pipe1' );
END@

CREATE PROCEDURE proc2()
BEGIN
  DECLARE status   INT;
  DECLARE num1     DECFLOAT;
  DECLARE date1    DATE;
  DECLARE raw1     BLOB(100);
  DECLARE varchar1 VARCHAR(100);
  DECLARE itemType INTEGER;
  
  SET status = DBMS_PIPE.RECEIVE_MESSAGE( 'pipe1' );
  IF( status = 0 ) THEN
    SET itemType = DBMS_PIPE.NEXT_ITEM_TYPE();
    CASE itemType
      WHEN 6 THEN
        CALL DBMS_PIPE.UNPACK_MESSAGE_NUMBER( num1 );
        CALL DBMS_OUTPUT.PUT_LINE( 'num1: ' || num1 );
      WHEN 9 THEN
        CALL DBMS_PIPE.UNPACK_MESSAGE_CHAR( varchar1 );
        CALL DBMS_OUTPUT.PUT_LINE( 'varchar1: ' || varchar1 );
      WHEN 12 THEN
        CALL DBMS_PIPE.UNPACK_MESSAGE_DATE( date1 );
        CALL DBMS_OUTPUT.PUT_LINE( 'date1:' || date1 );
      WHEN 23 THEN
        CALL DBMS_PIPE.UNPACK_MESSAGE_RAW( raw1 );
        CALL DBMS_OUTPUT.PUT_LINE( 'raw1: ' || VARCHAR(raw1) );
      ELSE
        CALL DBMS_OUTPUT.PUT_LINE( 'Unexpected value' );
    END CASE;
  END IF;
  SET status = DBMS_PIPE.REMOVE_PIPE( 'pipe1' );
END@

CALL proc1@

CALL proc2@

此示例生成以下输出:

varchar1: message1