根据记录生成唯一编号

时间:2018-08-27 07:27:52

标签: oracle plsql oracle11g

我这里有个情况。我有一个表,可以从我的应用程序中查询。该表中没有唯一的标识符。

我只需要根据记录的内容(例如ORA_HASH)生成唯一编号。我知道ORA_HASH返回可重复的值。所以我想知道是否还有其他选择。

我想要这个,因为在我的应用程序中,我们将数据从表加载到网格。假设用户在网格中进行一些选择,然后进行排序。我希望保留选择。我尝试使用ROW_NUM作为标识符。但是它随着各种变化而变化。因此,如果我能找到其他方法,它将对我有很大帮助。

谢谢。

2 个答案:

答案 0 :(得分:1)

您经常提到“重复的数据”(然后是重复的?),这就是表中没有唯一标识符的原因。

如果可能(为什么不这样做),请更改表并添加新列,我们将其称为“ ID”。为现有行填充其值 now ,并创建一个数据库触发器,该触发器将处理将来的插入操作。

这是一个例子:

SQL> create table test as select ename, job, sal from emp;

Table created.

SQL> alter table test add id number;

Table altered.

SQL> create sequence seq_id;

Sequence created.

SQL> update test set id = seq_id.nextval;

12 rows updated.

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4  begin
  5    :new.id := nvl(:new.id, seq_id.nextval);
  6  end;
  7  /

Trigger created.

SQL> insert into test (ename, job, sal) values ('Littlefoot', 'loser', 100);

1 row created.

SQL> select * from test order by id;

ENAME      JOB              SAL         ID
---------- --------- ---------- ----------
SMITH      CLERK            800          1
ALLEN      SALESMAN        1600          2
WARD       SALESMAN        1250          3
JONES      MANAGER         2975          4
MARTIN     SALESMAN        1250          5
BLAKE      MANAGER         2850          6
CLARK      MANAGER         2450          7
KING       PRESIDENT       5000          8
TURNER     SALESMAN        1500          9
JAMES      CLERK            950         10
FORD       ANALYST         3000         11
MILLER     CLERK           1300         12
Littlefoot loser            100         13

13 rows selected.

SQL>

现在,您已经有了“固定的唯一标识符”,该标识符已被固定,并且在查询数据时不会更改。

答案 1 :(得分:1)

oracle数据库中的每个表都有一个名称为ROWID的伪列,该伪列存储表记录的唯一键。您应该为此目的使用此密钥:

.//x:Attributes/x:Attribute[@Name = 'A-AssetFileName']/x:Values/x:Value

这将为您提供以下数据:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:x="http://schemas.riversand.com/mdmcenter">
    <xsl:output omit-xml-declaration="yes" indent="yes" encoding="UTF-8"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/x:Data/x:Entities/x:Entity">

        <xsl:copy> <!--copy the matched Entity-->
            <xsl:apply-templates select="@*"/> <!--preserve existing attributes-->

            <xsl:attribute name="ProductImage"> 
                <!--Sele the attribute value using a relative path from the matched Entity -->
                <xsl:value-of select="x:Attributes/x:Attribute/x:Attributes/x:Attribute/x:Attributes/x:Attribute[@Name = 'A-AssetFileName']/x:Values/x:Value"/>
<!--If you aren't sure what the nesting structure of the Attributes will be, 
    then just use the descendant axis to look down as many levels as it needs to find it
                <xsl:value-of select=".//x:Attributes/x:Attribute[@Name = 'A-AssetFileName']/x:Values/x:Value"/>
-->
            </xsl:attribute>

            <!--if you don't want to preserve the Attribute elements, remove the line below -->
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>