如何以输出生成“创建表语句”的方式格式化 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语句?