解密dbms_rowid -for 10g

PACKAGE BODY dbms_rowid IS
  PROCEDURE ROWIDBUILD(ROW_ID   OUT ROWID,
                       TYPE     IN NUMBER,
                       OBJNUM   IN NUMBER,
                       FILENUM  IN NUMBER,
                       BLOCKNUM IN NUMBER,
                       ROWNUM   IN NUMBER);
  PRAGMA INTERFACE(C, ROWIDBUILD);
  PROCEDURE ROWIDINFO(ROW_ID     IN ROWID,
                      TYPE       OUT NUMBER,
                      OBJNUM     OUT NUMBER,
                      FILENUM    OUT NUMBER,
                      BLOCKNUM   OUT NUMBER,
                      ROWNUM     OUT NUMBER,
                      TS_TYPE_IN IN VARCHAR2 DEFAULT 'SMALLFILE');
  PRAGMA INTERFACE(C, ROWIDINFO);

  PROCEDURE ROWIDAFN(ROW_ID       IN ROWID,
                     SCHEMA_NAME  IN VARCHAR2,
                     OBJECT_NAME  IN VARCHAR2,
                     ABSOLUTE_FNO OUT NUMBER);
  PRAGMA INTERFACE(C, ROWIDAFN);

  PROCEDURE ROWIDCNVTE(NEW_ROWID       OUT ROWID,
                       OLD_ROWID       IN ROWID,
                       SCHEMA_NAME     IN VARCHAR2,
                       OBJECT_NAME     IN VARCHAR2,
                       CONVERSION_TYPE IN INTEGER);
  PRAGMA INTERFACE(C, ROWIDCNVTE);

  PROCEDURE ROWIDCNVTR(NEW_ROWID       OUT ROWID,
                       OLD_ROWID       IN ROWID,
                       CONVERSION_TYPE IN INTEGER);
  PRAGMA INTERFACE(C, ROWIDCNVTR);

  FUNCTION ROWID_CREATE(ROWID_TYPE    IN NUMBER,
                        OBJECT_NUMBER IN NUMBER,
                        RELATIVE_FNO  IN NUMBER,
                        BLOCK_NUMBER  IN NUMBER,
                        ROW_NUMBER    IN NUMBER) RETURN ROWID IS
    ROW_ID ROWID;
  BEGIN

    ROWIDBUILD(ROW_ID,
               ROWID_TYPE,
               OBJECT_NUMBER,
               RELATIVE_FNO,
               BLOCK_NUMBER,
               ROW_NUMBER);

    RETURN(ROW_ID);
  END;

  PROCEDURE ROWID_INFO(ROWID_IN      IN ROWID,
                       ROWID_TYPE    OUT NUMBER,
                       OBJECT_NUMBER OUT NUMBER,
                       RELATIVE_FNO  OUT NUMBER,
                       BLOCK_NUMBER  OUT NUMBER,
                       ROW_NUMBER    OUT NUMBER,
                       TS_TYPE_IN    IN VARCHAR2 DEFAULT 'SMALLFILE') IS
  BEGIN

    ROWIDINFO(ROWID_IN,
              ROWID_TYPE,
              OBJECT_NUMBER,
              RELATIVE_FNO,
              BLOCK_NUMBER,
              ROW_NUMBER,
              TS_TYPE_IN);
  END;

  FUNCTION ROWID_TYPE(ROW_ID IN ROWID) RETURN NUMBER IS
    ROWID_TYPE    NUMBER;
    OBJECT_NUMBER NUMBER;
    RELATIVE_FNO  NUMBER;
    BLOCK_NUMBER  NUMBER;
    ROW_NUMBER    NUMBER;
  BEGIN

    ROWIDINFO(ROW_ID,
              ROWID_TYPE,
              OBJECT_NUMBER,
              RELATIVE_FNO,
              BLOCK_NUMBER,
              ROW_NUMBER);

    RETURN(ROWID_TYPE);
  END;

  FUNCTION ROWID_OBJECT(ROW_ID IN ROWID) RETURN NUMBER IS
    ROWID_TYPE    NUMBER;
    OBJECT_NUMBER NUMBER;
    RELATIVE_FNO  NUMBER;
    BLOCK_NUMBER  NUMBER;
    ROW_NUMBER    NUMBER;
  BEGIN

    ROWIDINFO(ROW_ID,
              ROWID_TYPE,
              OBJECT_NUMBER,
              RELATIVE_FNO,
              BLOCK_NUMBER,
              ROW_NUMBER);

    RETURN(OBJECT_NUMBER);
  END;

  FUNCTION ROWID_RELATIVE_FNO(ROW_ID     IN ROWID,
                              TS_TYPE_IN IN VARCHAR2 DEFAULT 'SMALLFILE')
    RETURN NUMBER IS
    ROWID_TYPE    NUMBER;
    OBJECT_NUMBER NUMBER;
    RELATIVE_FNO  NUMBER;
    BLOCK_NUMBER  NUMBER;
    ROW_NUMBER    NUMBER;
  BEGIN

    ROWIDINFO(ROW_ID,
              ROWID_TYPE,
              OBJECT_NUMBER,
              RELATIVE_FNO,
              BLOCK_NUMBER,
              ROW_NUMBER,
              TS_TYPE_IN);

    RETURN(RELATIVE_FNO);
  END;

  FUNCTION ROWID_BLOCK_NUMBER(ROW_ID     IN ROWID,
                              TS_TYPE_IN IN VARCHAR2 DEFAULT 'SMALLFILE')
    RETURN NUMBER IS
    ROWID_TYPE    NUMBER;
    OBJECT_NUMBER NUMBER;
    RELATIVE_FNO  NUMBER;
    BLOCK_NUMBER  NUMBER;
    ROW_NUMBER    NUMBER;
  BEGIN

    ROWIDINFO(ROW_ID,
              ROWID_TYPE,
              OBJECT_NUMBER,
              RELATIVE_FNO,
              BLOCK_NUMBER,
              ROW_NUMBER,
              TS_TYPE_IN);

    RETURN(BLOCK_NUMBER);
  END;

  FUNCTION ROWID_ROW_NUMBER(ROW_ID IN ROWID) RETURN NUMBER IS
    ROWID_TYPE    NUMBER;
    OBJECT_NUMBER NUMBER;
    RELATIVE_FNO  NUMBER;
    BLOCK_NUMBER  NUMBER;
    ROW_NUMBER    NUMBER;
  BEGIN

    ROWIDINFO(ROW_ID,
              ROWID_TYPE,
              OBJECT_NUMBER,
              RELATIVE_FNO,
              BLOCK_NUMBER,
              ROW_NUMBER);

    RETURN(ROW_NUMBER);
  END;

  FUNCTION ROWID_TO_ABSOLUTE_FNO(ROW_ID      IN ROWID,
                                 SCHEMA_NAME IN VARCHAR2,
                                 OBJECT_NAME IN VARCHAR2) RETURN NUMBER IS
    ABSOLUTE_FNO NUMBER;
  BEGIN

    ROWIDAFN(ROW_ID, SCHEMA_NAME, OBJECT_NAME, ABSOLUTE_FNO);

    RETURN(ABSOLUTE_FNO);
  END;

  FUNCTION ROWID_TO_EXTENDED(OLD_ROWID       IN ROWID,
                             SCHEMA_NAME     IN VARCHAR2,
                             OBJECT_NAME     IN VARCHAR2,
                             CONVERSION_TYPE IN INTEGER) RETURN ROWID IS
    NEW_ROWID ROWID;
  BEGIN

    ROWIDCNVTE(NEW_ROWID,
               OLD_ROWID,
               SCHEMA_NAME,
               OBJECT_NAME,
               CONVERSION_TYPE);

    RETURN(NEW_ROWID);
  END;

  FUNCTION ROWID_TO_RESTRICTED(OLD_ROWID       IN ROWID,
                               CONVERSION_TYPE IN INTEGER) RETURN ROWID IS
    NEW_ROWID ROWID;
  BEGIN

    ROWIDCNVTR(NEW_ROWID, OLD_ROWID, CONVERSION_TYPE);

    RETURN(NEW_ROWID);
  END;

  FUNCTION ROWID_VERIFY(ROWID_IN        IN ROWID,
                        SCHEMA_NAME     IN VARCHAR2,
                        OBJECT_NAME     IN VARCHAR2,
                        CONVERSION_TYPE IN INTEGER) RETURN NUMBER IS
    NEW_ROWID ROWID;
  BEGIN

    ROWIDCNVTE(NEW_ROWID,
               ROWID_IN,
               SCHEMA_NAME,
               OBJECT_NAME,
               CONVERSION_TYPE);
    RETURN(0);
  EXCEPTION
    WHEN ROWID_INVALID OR ROWID_BAD_BLOCK THEN
      RETURN(1);
  END;

END;

评论

  1. Hi, this is a well written post. I just bookmarked your site. To be truthful, although I read a lot in this area. I still picked up quite a lot today. Kindly continue the amazingly good post and I will tell my friends about it.

  2. I learned a lot from this post, much appreciated!! 🙂

  3. you obtained a instead excellent website, Glad I seen it via yahoo.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注