如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?

Posted

技术标签:

【中文标题】如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?【英文标题】:How can I Format an Oracle SQL query in a way that the output makes a 'Create Table Statement'? 【发布时间】:2020-09-27 19:00:33 【问题描述】:

好的,所以我正在尝试创建一个运行“编译”Oracle SQL 文件的批处理文件。 “编译”文件将有 2 个过程,其中一个将从我的模式中提取表,另一个将提取该表中的列。然后,我将从我的批处理文件(称为“RUN”)中运行另一个 Oracle SQL 文件,该文件将运行这些过程并创建一个 Oracle SQL 类型的输出文件。此输出 SQL 文件的格式必须正确,因为它是一个报告。我创建了批处理文件,还创建了显示表和列的 2 个过程。但到目前为止,我无法以输出与提供的图像匹配的方式创建“RUN”文件。The Output SQL file

这是编译文件中两个过程的代码

DROP PROCEDURE Extract_Columns;

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE Extract_Tables
AS
BEGIN
    
    FOR CurrentRow IN(
    SELECT TABLE_NAME
    FROM USER_TABLES)
    LOOP
    DBMS_OUTPUT.PUT_LINE(CurrentRow.table_name || ', ' );
    extract_columns(CurrentRow.table_name);
    END LOOP;
END;
/
Show ERRORS;

EXEC extract_tables;

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE Extract_Columns(
    iTable IN USER_TABLES.table_name%TYPE
)
AS
BEGIN
    
    FOR CurrentRow IN ( SELECT COLUMN_NAME
        FROM USER_TAB_COLUMNS
        WHERE TABLE_NAME = iTable)
    LOOP
        DBMS_OUTPUT.PUT_LINE(CurrentRow.Column_Name || ', ' );
        END LOOP;
END;
/

EXEC extract_columns;

这是上述程序的输出

CUSTOMERS, 
CUSTNUM, 
COMPANY, 
CUSTREP, 
CREDITLIMIT, 
SALESREPS, 
SALESREP, 
NAME, 
AGE, 
REPOFFICE, 
TITLE, 
HIREDATE, 
MANAGER, 
QUOTA, 
SALES, 
OFFICES, 
OFFICE, 
CITY, 
REGION, 
MGR, 
TARGET, 
SALES, 
ORDERS, 
ORDERNUM, 
ORDERDATE, 
CUST, 
REP, 
MFR, 
PRODUCT, 
QTY, 
AMOUNT, 
PRODUCTS, 
MFR, 
PRODUCT, 
DESCRIPTION, 
PRICE, 
QTYONHAND, 

上述输出中的客户、办公室、订单、产品、销售代表是表格,每个表格后面的行是它们各自的列。我想要的只是把上面的输出转换成给定的图片。我应该如何实现这一目标?

【问题讨论】:

【参考方案1】:

截至 Oracle:我认为您并不打算在任何地方运行生成的“脚本”,因为它不起作用;你知道的,对吧?没有数据类型、精度、比例、大小、约束......如果你想要那个,请调查DBMS_METADATA.GET_DDL

在您的脚本中:看看这是否有帮助;我只提取两个表(仅作为示例)及其列。

SQL> set serveroutput on;
SQL> declare
  2    l_crt varchar2(32000);
  3  begin
  4    for cur_t in (select table_name
  5                  from user_tables
  6                  where table_name in ('EMP', 'DEPT')
  7                 )
  8    loop
  9      l_crt := 'create table ' || cur_t.table_name ||' (';
 10
 11      for cur_c in (select c.column_name
 12                    from user_tab_columns c
 13                    where c.table_name = cur_t.table_name
 14                    order by c.column_id
 15                   )
 16      loop
 17        l_crt := l_crt || chr(10) || cur_c.column_name ||',';
 18      end loop;
 19
 20        l_crt := rtrim(l_crt, ',') || ');';
 21        dbms_output.put_line(l_crt || chr(10) || '--' );
 22        l_crt := null;
 23    end loop;
 24  end;
 25  /
create table DEPT (
DEPTNO,
DNAME,
LOC);
--
create table EMP (
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO);
--

PL/SQL procedure successfully completed.

SQL>

【讨论】:

以上是关于如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

在SQLSERVER中怎么用命令行的方式查询建立表的SQL语句?

以编程方式格式化和缩进从 Java 自动生成的源代码

如何以 csv 格式导出 redhsift 卸载命令的输出?

Android开发-之数据的存储方式一

Mysql生成Sqlserver创建表语句

如何使用输入参数创建 PL/SQL 存储过程以返回数据集