AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18223
Accepted
a1ex07
a1ex07
Asked: 2012-05-22 06:11:22 +0800 CST2012-05-22 06:11:22 +0800 CST 2012-05-22 06:11:22 +0800 CST

如何在 Oracle 中模仿 SQL Server `TYPE` 的功能?

  • 772

如果问题标题含糊不清,我深表歉意,但我无法更好地表述它。我想要的是 TSQL 的替代方法CREATE TYPE,因此我可以在列定义中使用它。

例如,我需要 Oracle 中的“money”类型,这在技术上是NUMBER(18,4)在我的系统中,并且每个表都会有“money”列而不是底层NUMBER以保持一致性。还有一些其他“类型”我想有别名而不是直接使用它们。

不幸的是,我还没有找到可接受的解决方案,除了放弃并为每列使用具有约束(或大小规范)的标准类型。似乎唯一可行的方法是创建OBJECT类型,但它会为我试图避免的系统增加不必要的复杂性。

一个非常好的 Oracle 特性,SUBTYPE在这种情况下不起作用。据我所知,SUBTYPE(和来自 的子类型STANDARD)创建了不能在 SQL 中使用的 PL/SQL 数据类型。我知道这有多种原因。

我想知道解决此类问题的最佳做法是什么。

谢谢你。

更新
到目前为止,我似乎已经列出了所有可能的方法,我宁愿关闭这个问题。不确定它是否对任何人有用;如果是,我暂时不删除这个问题。

oracle feature-comparison
  • 2 2 个回答
  • 233 Views

2 个回答

  • Voted
  1. Best Answer
    Leigh Riffel
    2012-05-23T10:47:10+08:002012-05-23T10:47:10+08:00

    这是一个非常好的问题,不仅仅是因为它显示了您为回答问题所做的努力。感谢您的询问,请不要删除它。

    正如您已经发现的那样,答案是——您不能那样做。

    您已经正确识别了几个相似的概念,包括...

    • 使用带约束的标准类型。
    • 行为不同于标准类型的对象类型。
    • 适用于 PL/SQL 而不是 SQL 的子类型。

    为什么 SQL 子类型可能有用?你提到了一致性。这里有一些想法:

    • 将一个表中的字段插入到另一个表中时可以避免错误。

    • 不必记住或查找字段的定义。

    • 打字少了。

    • 更改定义可以在一个地方完成。

    • 数据类型名称提供文档。

    以下是解决这些问题的一些想法:

    • 表定义不会经常更改。是的,它们确实发生了变化,但变化量远小于 PL/SQL(您可以在其中使用子类型和 %types)或应用程序端代码。

    • 数据库通常被规范化以消除数据重复并限制多个表具有具有相同定义的字段的要求。当然,像 Money 类型这样通用的东西会在很多地方使用,但有些类型会被移到查找表中,只有键在多个地方重复。

    • 对不同的表使用不同的大小通常会有好处。一家折扣店可能有一个产品表,其中的一个字段定义为 Number(4,2),因为他们的售价从不超过 10 美元。该定义本身就是对数据的约束——提高准确性、记录系统、速度快、无法规避并且比任何应用程序端约束都更好的约束。如果企业决定通过增加字段大小来移除此约束,这并不一定意味着它需要更改其他字段的大小,例如 Salary、SalesAmount 等。

    • 非规范化数据通常是聚合的,可能需要不同的字段大小。薪资列不必是 Number(18,4),甚至公司范围内所有薪资列的总和也不必是 Number(18,4)(接近 100 万亿)。即使由于公司的发展需要增加包含薪资信息的聚合字段,您仍然不一定需要同时增加薪资字段,但如果它们基于相同的 SQL 子类型,那么您将有没有选择。适当大小的字段具有使用更少存储和内存以及具有更快的索引和表查找的好处。

    • 记住或查找自定义类型与记住或查找以前使用的字段定义的难度相似。

    • Oracle 在使用10.2 Transparent Gateway时将 SQL Server Money 类型转换为 Number(19,4) ,因此在使用网关时即使对 Number(18,4) 进行标准化也是错误的。

    • 在 Oracle 中,经常创建表列,其中包含可能在其他系统的数据类型名称中的定义。例如,数据类型为 Money 的 Wholesale 在 Oracle 中可能是 WholesaleCost,因此很明显该字段与金钱相关。有时这种消歧是必要的,例如如果有 UnitCount、UnitVolume 和 UnitCosts 字段。其他时候,名称本身会泄露类型(例如 Salary)。最后,如有必要,可以在表格列上添加注释以提供进一步的说明。

    我说这一切并不是说 SQL 子类型的概念不好,只是它不像看起来那么有用。

    • 4
  2. a_horse_with_no_name
    2012-05-23T11:40:45+08:002012-05-23T11:40:45+08:00

    另一种方法(但在更高层次上)可能是使用支持域的 ER 建模工具。

    然后,您可以在模型中定义一个域“money”(或任何您需要的),当您对模型进行正向工程时,该工具将在域外创建相应的“本地”类型。

    • 3

相关问题

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

  • 何时使用 NULL 以及何时使用空字符串?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve