【问题标题】:Plsql - Evaluate a dynamic stringPlsql - 评估动态字​​符串
【发布时间】: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'); ... )。之后将所有查询声明为如下变量:code RESUME_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


【解决方案1】:

如果我理解不好,您需要运行一组存储在集合中的 DDL 语句。如果是这样,你可以使用类似的东西:

declare
    type   tArray is table of varchar2(1000) index by pls_integer;
    vArray tArray ;
begin
    vArray(1) := 'create table firstTab  ( a number, b number)';
    vArray(2) := 'create table secondTab ( c number, d varchar2(10))';
    --
    for i in vArray.first .. vArray.last loop
        execute immediate vArray(i);
    end loop;
end;
/

【讨论】:

  • 这个想法是得到一个包含所有表名的列表(...例如: tablas := tablesarray('RESUME', 'NOTES', 'ITYPE'); ... )。之后将所有查询声明为如下变量:code RESUME_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”并计算为立即执行
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 2021-12-12
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多