【发布时间】:2017-01-19 11:37:11
【问题描述】:
我需要构建一个动态创建表的进程。
我有这个:
declare
type array is table of varchar2(30) index by binary_integer;
a array;
expression varchar2(2000);
RESUME_create LONG;
procedure createTables ( texto in VARCHAR2 ) is
begin
dbms_output.put_line('the parameter is: ' || texto);
expression := 'begin ' || texto || '; end;';
dbms_output.put_line(expression);
execute immediate expression;
end;
RESUME_create := 'CREATE TABLE RESUME (
R_Resume_date DATE DEFAULT SYSDATE NOT NULL ,
R_Resume_source CHAR(3) DEFAULT ''001'' NOT NULL ,
R_Resume_channel CHAR(3) DEFAULT ''001'' NOT NULL )';
createTables('RESUME_create');
end;
/
所以这只是一个例子。
所以想象一下,我需要声明多个 CREATE TABLEs 并将 createTable 调用到一个循环中,传递函数必须评估和执行的多个字符串。
【问题讨论】:
-
你真的需要那个吗?通常全局临时表用于此目的。
-
为什么需要动态创建表?通常,表应该在 PL/SQL 之外创建(例如,作为一次性部署脚本的一部分),而不是不断地删除和重新创建。
-
这个想法是得到一个包含所有表名的列表(...例如: tablas := tablesarray('RESUME', 'NOTES', 'ITYPE'); ... )。之后将所有查询声明为如下变量:
codeRESUME_create := 'CREATE TABLE RESUME (R_Resume_Idate NUMBER(3,0) )'; NOTES_create := 'CREATE TABLE RESUME (R_Resume_Idate NUMBER(3,0) )'; ITYPE_create := 'CREATE TABLE RESUME (R_Resume_Idate NUMBER(3,0) )';code之后,进入循环读取tablas,连接“_create”并计算为立即执行 -
@Boneist 我需要它,因为我必须创建 50 个表,并且我不希望所有 sql 脚本都被一个一个地执行(因为准备那个 sql 脚本的人制作了一个 .sql表)
标签: oracle plsql dynamic-sql ddl