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. SpringBoot集成Shiro

    Shiro是一个安全框架,控制登陆,角色权限管理(身份认证.授权.回话管理.加密) Shiro不会去维护用户,维护权限:这些需要通过realm让开发人员自己注入 1.在pom.xml中引入shiro的 ...

  2. laravel 不理解的call方法

    返回结果: 原来是调用同控制器的这四个方法之一...vendor\zhiyicx\plus-question\src\API2\Controllers\UserQuestionController.p ...

  3. bzoj 1812

    什么鬼noip互测题... 这题很显然是树形dp,但设计状态以及转移是个难点 记状态f[i][j][k]表示以i为根节点的子树,离i最近的祖宗节点编号为j放了虫洞(伐木场?),i的子树内放了k个伐木场 ...

  4. Android学习基础部分

    今天是放寒假的第四天,这几天加上放假前总共弄了一些Android编程的基础部分,比如下载sdk.配置环境.下载Eclipse的插件(ADT).下载Android Studio.VirtualBox.G ...

  5. Jmeter-JDBC Request参数化

    一.参数化 1.选择Query Type(查询类型)为Prepared Select Statement 2.写好sql 3.在Parameter Values中输入参数,多个参数用‘,’隔开 4.P ...

  6. 学习REST

    REST:Representational State Transfer,资源的表现状态转换.可以理解为对资源的操作.   1. 资源 资源就是业务对象,如图片.文本.歌曲或者客户.交易等.这些是用户 ...

  7. JavaScript 高级程序设计 第二版

    function outputNumbers(count) {     (function () {         for (var i =0;i < count; i++) {        ...

  8. The.Glory.of.Innovation 创新之路2科学基石

    犹太民族很早就确立了他们的生存法则:资源.土地,以及一切有形的东西都会消失,一个人最重要的财富是自己的头脑.是知识.是创造.   有些选择是被动的,有些选择是主动的,一旦决心要把技术变成自己的,独立的 ...

  9. [转] 跨域资源共享 CORS 详解

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  10. java传值和传引用区别

    1. 在java中所有的参数都是传值的,引用符号&的传递是C++中才有的:2. 在java传参中,基本类型(byte--short--int--long--float--double--boo ...