T-SQL到Oracle:复杂的表列

时间:2015-11-27 15:16:06

标签: sql oracle tsql ddl oracle12c

我想将下表转换为PL-SQL。

CREATE TABLE [SchemaName].[TableName] (
    [value]         VARBINARY (2000) NULL,
    [valueAsString] AS               (CONVERT([nvarchar](1000),[value],0))
);

有没有人知道如何在PL中重新创建valueAsString伪列?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是

HUSQVIK@hq_pdb_tcp> CREATE OR REPLACE FUNCTION convert_raw_to_nvarchar(bin RAW) RETURN NVARCHAR2 DETERMINISTIC
  2  IS
  3  BEGIN
  4     RETURN utl_raw.cast_to_nvarchar2(bin);
  5  END;
  6  /

Function created.

HUSQVIK@hq_pdb_tcp> CREATE TABLE SchemaName.TableName (
  2      value         RAW(2000) NULL,
  3      valueAsString AS (convert_raw_to_nvarchar(value))
  4  );

Table created.

HUSQVIK@hq_pdb_tcp> insert into tablename (value) values (utl_raw.cast_to_raw(n'123344čřžžýřžý'));

1 row created.

HUSQVIK@hq_pdb_tcp> select * from tablename;

VALUE                                                        VALUEASSTRING
------------------------------------------------------------ --------------------
00310032003300330034003400630072007A007A00EC0072007A00EC     123344cržžýržý

如果二进制列的限制是2000字节,则不需要BLOB。

遗憾的是,

utl_raw.cast_to_nvarchar2不是确定性的,因此需要将其包含在确定性函数中以便在表定义中使用。

但我不喜欢这样的解决方案。没有模式级别功能,视图可以解决此问题。此外,当您希望始终将二进制数据转换为字符串时,数据类型建议您使用不适当的数据类型存储信息。