1 在存储过程中使用ddl语句有如下异常:

create or replace procedure test_create_table
(Table_Name in VARCHAR2,
column_name1 in varchar2,
column_name2 in varchar2,
column_name3 in varchar2,
column_type in varchar2) as
/*修改某个表的表结构*/
begin
create table Table_Name( column_name1 column_type,
column_name2 column_type,
column_name3 column_type
);
end test_create_table;
Compilation errors for PROCEDURE CICI.TEST_CREATE_TABLE

Error: PLS-: 出现符号 "CREATE"在需要下列之一时:
( begin
case declare exit for goto if loop mod null pragma raise
return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
Line:
Text: create table Table_Name(
Compilation errors for PROCEDURE CICI.TEST_CREATE_TABLE

Error: PLS-: 出现符号 "CREATE"在需要下列之一时:
( begin
case declare exit for goto if loop mod null pragma raise
return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
Line:
Text: create table Table_Name(

2 将DML封装存入string中

 
create or replace procedure Modify_Table_Structure as
Pstring_droptable varchar2(2000);
Pstring_createtable varchar2(2000);
Pstring_deletetable varchar2(2000);
Pstring_altertable varchar2(2000);
pstring_inserttable varchar2(2000);
v_count integer;
begin
Pstring_droptable := 'drop table CONTRACT_KANGJIA_BACK';
Pstring_createtable := 'create table CONTRACT_KANGJIA_BACK as select * from CONTRACT_KANGJIA ';
Pstring_deletetable := 'delete from CONTRACT_KANGJIA';
Pstring_altertable := 'alter table CONTRACT_KANGJIA modify sell_money number(10,5)';
pstring_inserttable := 'insert into CONTRACT_KANGJIA (id, busiman_name, sell_date, product_type, sell_money) select id, busiman_name, sell_date, product_type, sell_money
from CONTRACT_KANGJIA_BACK'; select count(*)
into v_count
from user_tables
where table_name = 'CONTRACT_KANGJIA_BACK';
dbms_output.put_line('v_count 1 '||v_count);
if (v_count > 0) then
execute immediate Pstring_droptable;
dbms_output.put_line('v_count 2 '||v_count);
end if; execute immediate Pstring_createtable;
execute immediate Pstring_deletetable;
execute immediate Pstring_altertable;
execute immediate pstring_inserttable;
execute immediate Pstring_droptable;
end;

3 进一步提炼.将表名称提取成变量名称

create or replace procedure Modify_Table_Structure(table_name in varchar2) as
Pstring_droptable varchar2(2000);
Pstring_createtable varchar2(2000);
Pstring_deletetable varchar2(2000);
Pstring_altertable varchar2(2000);
pstring_inserttable varchar2(2000);
v_count integer;
begin
Pstring_droptable := 'drop table '||table_name||'_BACK';
Pstring_createtable := 'create table '||table_name||'_BACK as select * from '||table_name;
Pstring_deletetable := 'delete from '||table_name;
Pstring_altertable := 'alter table '||table_name|| ' modify sell_money number(10,5)';
pstring_inserttable :=
'insert into '||table_name|| ' (id, busiman_name, sell_date, product_type, sell_money)
select id, busiman_name, sell_date, product_type, sell_money
from '||table_name||'_BACK' ; select count(*)
into v_count
from user_tables
where table_name = 'table_name'||'_BACK';
dbms_output.put_line('v_count 1 '||v_count);
if (v_count > 0) then
execute immediate Pstring_droptable;
dbms_output.put_line('v_count 2 '||v_count);
end if;
dbms_output.put_line(Pstring_droptable);
dbms_output.put_line(Pstring_createtable);
dbms_output.put_line(Pstring_deletetable);
dbms_output.put_line(Pstring_altertable);
dbms_output.put_line(pstring_inserttable);
execute immediate Pstring_createtable;
execute immediate Pstring_deletetable;
execute immediate Pstring_altertable;
execute immediate pstring_inserttable;
execute immediate Pstring_droptable;
end;

4 执行成功!

call Modify_Table_Structure('contract_kangjia');

练习七 Procedure中使用DDL的更多相关文章

  1. 九、dbms_ddl(提供了在PL/SQL块中执行DDL语句的方法)

    1.概述 作用:提供了在PL/SQL块中执行DDL语句的方法,并且也提供了一些DDL的特殊管理方法. 2.包的组成 1).alter_compile说明:用于重新编译过程.函数和包语法:dbms_dd ...

  2. MySQL中的DDL,DML

    MySQL中的DDL,DMLDDL:数据定义语言:    CREATE,ALTER,DROP        DB组件:数据库.表.索引.视图.用户.存储过程.存储函数.触发器.事件调度器等    CR ...

  3. 关于PLSQL中的一些问题总结:在PLSQL中书写DDL等

    关于问题前导,使用的数据表中涉及到的字段和类型: 在PLSQL中create.drop.truncate等DDL是没有办法直接执行的. 必须要使用: Execute immediate 'DDL语句' ...

  4. percona-toolkit中在线ddl

    percona-toolkit中在线ddl percona-toolkit工具提供了一组用于mysql操作的工具,比如主从复制,在线更改mysql表ddl等 一.安装1.安装perl(略)2.BI&a ...

  5. (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(七)——eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -&g ...

  6. 在Hive中执行DDL之类的SQL语句时遇到的一个问题

    在Hive中执行DDL之类的SQL语句时遇到的一个问题 作者:天齐 遇到的问题如下: hive> create table ehr_base(id string); FAILED: Execut ...

  7. iOS流布局UICollectionView系列七——三维中的球型布局

      摘要: 类似标签云的球状布局,也类似与魔方的3D布局 iOS流布局UICollectionView系列七——三维中的球型布局 一.引言 通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑 ...

  8. SQLDataSet中执行DDL语句

    在SQLDataSet中执行我们输入的DDL语句,并观察执行结果. 这里为了省输入的时间,从先输好的记事本中复制的SQL语句.效果图: ******************************** ...

  9. Oracle中的DDL,DML,DCL总结

    转自http://blog.csdn.net/w183705952/article/details/7354974 DML(Data Manipulation Language,数据操作语言):用于检 ...

随机推荐

  1. django中数据库的配置及相关增删改查

    ORM ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应---- ...

  2. SpringMVC国际化与文件上传

    点击阅读上一章 其实SpringMVC中的页面国际化与上一章的验证国际化基本一致. 1.对页面进行国际化 1)首先我们对Spring配置文件中添加国际化bean配置 <!-- 注册国际化信息,必 ...

  3. 高并发编程基础Synchronized与Volatile

    关键字Synchronized: 当使用Synchrnized (o) ,锁定 o 的时候,锁定的是 o 指向的堆内存中 new 出来的对象,而非 o 引用,当锁定 o 以后,一旦 o 指向了其他对象 ...

  4. java 关键字transient

    http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口 ...

  5. shell 排除目录

    1.新建文件 exclude.txt,在文件中写需要排除的目录(只需要目录名称,不需要路径) 2.--exclude-from='/data/www/vhosts/git_track/git-shel ...

  6. Two Sum【LeetCode】

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  7. 滴水穿石-07Java开发中常见的错误

    1:使用工具Eclipse 1.1 "语法错误" 仅当源级别为 1.5 时已参数化的类型才可用 设置eclipse,窗口—>java—>编译器—>JDK一致性调到 ...

  8. Python os.walk() 方法遍历文件目录

    概述 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 在Un ...

  9. Redis的并发竞争问题

    问题描述:多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 一个key的值是1,本来按顺序 ...

  10. ElasticSearch(五) Elasticsearch-jdbc实现MySQL同步到ElasticSearch

    https://www.cnblogs.com/wt645631686/p/8274722.html