zoukankan      html  css  js  c++  java
  • 练习七 Procedure中使用DDL

    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-00103: 出现符号 "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: 9
    Text: create table  Table_Name(
    Compilation errors for PROCEDURE CICI.TEST_CREATE_TABLE
    
    Error: PLS-00103: 出现符号 "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: 9
    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');

  • 相关阅读:
    图象处理算法(一)
    使用自定义类实现工程多语言
    SQL的数据类型
    SQL LEFT JOIN
    TADOCommand
    如何获得活动的数据
    TDateTime
    类定义(一)
    mxOutlookBar组件安装和使用
    TADOQuery
  • 原文地址:https://www.cnblogs.com/cici-new/p/4029895.html
Copyright © 2011-2022 走看看