【问题标题】:Get DDL command from oracle database objects without using dbms_metadata不使用 dbms_metadata 从 oracle 数据库对象获取 DDL 命令
【发布时间】:2020-03-10 18:50:08
【问题描述】:

我在oracle数据库中做了一个procedure,它的功能是对数据库的对象进行一种清点。

基本上我必须得到table类型对象的DDL。

为此,我使用来自银行本身的查询

select * from user_objects; 
select * from user_constraints;
select * from user_source;

我的库存必须包含以下信息:

Inventory information here.

如何在不使用函数的情况下从对象中获取 DDL 命令:

dbms_metadata.get_ddl(); 

元数据库中没有其他现成的函数。

也试过这个

SELECT 
(CASE WHEN line = 1 THEN 'create or replace ' || text ELSE text END) texto 
FROM user_source
WHERE NAME = '....'
ORDER BY line

但是这个命令没有得到表对象的ddl。

【问题讨论】:

  • 你为什么要重新发明轮子?您可以查询dba_tablesdba_tab_columnsdba_constraints 等以获取有关表和列的信息并手动为表构建 DDL,但这可能是一项重大工作,特别是如果您需要支持所有最后一个选项在create table
  • @JustinCave 我不想重新发明轮子,这是一项学术工作,我正在努力按照老师的要求去做
  • 从头开始创建 DDL 语句远远超出了学术课程的范围,您可能需要花费数周时间。
  • DBMS_METADATA 是在Oracle 9 中引入的,所以也许你的导师最后一次使用Oracle 8 - 尝试将他指向包。与 Oracle 合作时,一项重要的技能是能够找到工作所需的工具和功能,而不是解决方法您知道存在但无法使用的功能(好吧,假设许可证不起作用;)

标签: sql database oracle plsql procedure


【解决方案1】:

获取视图的 DDL 非常简单:

SELECT VIEW_NAME, TEXT FROM ALL_VIEWS; 

如果您希望它只返回特定视图的文本,请执行以下操作:

SELECT TEXT FROM ALL_VIEWS
WHERE VIEW_NAME LIKE '[name_of_view]';

获取表的 DDL 比较麻烦,但可以通过从多个系统视图中查询数据来完成:

ALL_TABLES
ALL_TAB_COLUMNS
ALL_COL_COMMENTS
ALL_CONSTRAINTS
ALL_CONS_COLUMNS
ALL_INDEXES
ALL_IND_COMMENTS

例如,如果您想获取 TABLE1 的所有列名及其数据类型,您可以:

SELECT COLUMN_NAME, DATA_TYPE FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME LIKE 'TABLE1';

要获取表上所有约束的列表,查询是:

SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME LIKE 'TABLE1';

要获得完整的表定义,需要对如何使用这些系统视图有相当好的了解。可以在这里找到一个非常有用的页面:6 Useful Oracle Data Dictionary Queries Every DBA Should Have

【讨论】:

  • 理论上是的。但是你会处理索引组织/外部/嵌套/对象表吗?虚拟列,defaultdefault on null,时间戳/间隔精度,column-level collation 怎么样?也许练习的目的是让 OP 知道这是一项不平凡的任务。
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 2019-04-06
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多