1. 程式人生 > >oracle 自動建表

oracle 自動建表

       目前由於做一個專案,由客戶自己定義表名、表字段、欄位是否允許為空等等,所以寫了一下程式碼:

tab_object表主要用於儲存表名、表空間等。

-- Create table
create table TAB_OBJECT
(
  ID            VARCHAR2(40) not null,
  TAB_NAME      VARCHAR2(100) not null,
  TAB_CNAME     VARCHAR2(100),
  TAB_SPACE     VARCHAR2(100) not null,
  CREATED       DATE not null,
  CREATED_USER  VARCHAR2(50) not null,
  LAST_DDL_TIME DATE,
  LAST_DDL_USER VARCHAR2(50),
  STATUS        NUMBER(1)
)
tablespace JZSOFT
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns
comment on column TAB_OBJECT.TAB_NAME
  is '表名';
comment on column TAB_OBJECT.TAB_CNAME
  is '表中文名';
comment on column TAB_OBJECT.TAB_SPACE
  is '表空間';
comment on column TAB_OBJECT.CREATED
  is '建立日期';
comment on column TAB_OBJECT.CREATED_USER
  is '建立人';
comment on column TAB_OBJECT.LAST_DDL_TIME
  is '最後修改日期';
comment on column TAB_OBJECT.LAST_DDL_USER
  is '最後修改人';
comment on column TAB_OBJECT.STATUS
  is '狀態';
-- Create/Recreate primary, unique and foreign key constraints
alter table TAB_OBJECT
  add constraint PK_TAB_OBJECT primary key (ID)
  using index
  tablespace JZSOFT
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes
create unique index INX_TABNAME on TAB_OBJECT (TAB_NAME)
  tablespace JZSOFT
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

表tab_column 主要儲存表的欄位、資料型別、型別長度、是否為空、是否主鍵等資訊。這裡並沒有對外來鍵進行管理,
-- Create table
create table TAB_COLUMN
(
  TAB_NAME       VARCHAR2(100) not null,
  ID             VARCHAR2(40) not null,
  COLUMN_NAME    VARCHAR2(100) not null,
  COLUMN_CNAME   VARCHAR2(100),
  DATA_TYPE      VARCHAR2(100) not null,
  DATA_LENGTH    NUMBER(10),
  CREATED        DATE,
  ISNULL         NUMBER(1),
  COLUMN_DEFAULT VARCHAR2(500),
  ISPK           NUMBER(1)
)
tablespace JZSOFT
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table
comment on table TAB_COLUMN
  is '表字段+描述';
-- Add comments to the columns
comment on column TAB_COLUMN.TAB_NAME
  is '表名';
comment on column TAB_COLUMN.COLUMN_NAME
  is '欄位名';
comment on column TAB_COLUMN.COLUMN_CNAME
  is '欄位中文名';
comment on column TAB_COLUMN.DATA_TYPE
  is '資料型別';
comment on column TAB_COLUMN.DATA_LENGTH
  is '欄位長度';
comment on column TAB_COLUMN.CREATED
  is '建立時間';
comment on column TAB_COLUMN.ISNULL
  is '是否為空';
comment on column TAB_COLUMN.COLUMN_DEFAULT
  is '預設值';
comment on column TAB_COLUMN.ISPK
  is '是否為主鍵';
-- Create/Recreate primary, unique and foreign key constraints
alter table TAB_COLUMN
  add constraint PK_TAB_COLUMN primary key (ID)
  using index
  tablespace JZSOFT
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
alter table TAB_COLUMN
  add constraint FK_TABNAME foreign key (TAB_NAME)
  references TAB_OBJECT (ID) on delete cascade;


-- Create table

表:CREATETABLE_LOG為日誌表、儲存建表時的錯誤資訊,資訊記錄太少,需要加強日誌記錄。

create table CREATETABLE_LOG
(
  TABLE_NAME VARCHAR2(100),
  C_SQLCODE  VARCHAR2(500),
  BEIZHU     VARCHAR2(1000)
)
tablespace JZSOFT
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

實現儲存過程:
create or replace procedure sp_createtable( l_tabname varchar2 )
is
 ls_create varchar2(4000);
 ls_tablespace varchar2( 4000 );
 --ls_alter varchar2(4000);
 ls_type varchar2( 1000 );
 ls_default varchar2( 4000 );
 ls_isnull varchar2( 30 );
 ls_ispk varchar2( 500 );
 ls_comment_column varchar2(4000);
 ls_comment_tab varchar2(500);
 ls_sqlcode varchar2(500);
 ls_errm varchar2(500);
  TYPE red_cfgdb IS RECORD (
  comment_column varchar2(4000),inx_column varchar2(500));

  li_i integer;

   TYPE type_conarray IS TABLE OF red_cfgdb INDEX BY PLS_INTEGER;
   gv_conarray type_conarray;
begin
  ls_create := null ;
  ls_tablespace := null;
  li_i:=1;
  --ls_alter := null;
for a in ( select x.id,x.tab_name,x.tab_cname,x.tab_space,y.column_name,y.column_cname,y.data_type,y.data_length,y.isnull,y.column_default,y.ispk
  from tab_object x,tab_column y where x.id=y.tab_name and upper(x.id) = upper(l_tabname) ) loop
    ls_type :=  case when upper(a.data_type) = upper('date') then a.data_type
                     when upper(a.data_type) <> upper('date') and a.data_length is null then a.data_type
                     when upper(a.data_type) <> upper('date') and a.data_length is not null then a.data_type||'('||a.data_length||')'
                     end ;
    ls_isnull := case when a.isnull = 1 then ' not null ' else null  end;
    ls_ispk := case when a.ispk = 1 And ls_ispk is null then '  constraint PK_'||l_tabname||' primary key ('||a.column_name
                    when a.ispk = 1 and ls_ispk is not null then ls_ispk||', '||a.column_name
                    else ls_ispk
                    end ;
    ls_tablespace := case when ls_tablespace is  null then 'tablespace '|| a.tab_space || ' pctfree 10  pctused 40  initrans 1
                  maxtrans 255 storage  (  initial 64K  minextents 1   maxextents unlimited )'  end ;

    ls_default := case when a.column_default is not null then   ' default '||a.column_default end ;
    if ls_create is null then
      ls_create := ' create table '||a.tab_name||' ( '
                ||chr(10)||a.column_name||chr( 32 ) ||ls_type|| chr(32)||ls_default||chr( 32 )||ls_isnull ;
    else
      ls_create := ls_create||chr(10)||' , '||a.column_name||chr( 32 ) ||ls_type|| chr(32)||ls_default||chr( 32 )||ls_isnull ;
    end if;
    ls_comment_tab := case when a.tab_cname is not null and ls_comment_tab is null then ' comment on table '||l_tabname ||' is ' ||chr(39)||a.tab_cname||chr(39) else ls_comment_tab end ;

   gv_conarray(li_i).comment_column :=  ' comment on column '||l_tabname||'.'||a.column_name||' is  '||chr(39)||a.column_cname ||chr(39)  ;
    li_i:=li_i+1;
end loop;
ls_create :=    ls_create||chr( 32 )
            ||chr(10)||case when ls_ispk is not null then ' , '||ls_ispk||')' end
            ||chr(10)||' ) '
            ||chr(10)||ls_tablespace ;

execute immediate   ls_create   ;
   insert into createtable_log(table_name,c_sqlcode,beizhu) values( l_tabname,'','建表成功!' );
execute immediate ls_comment_tab ;

li_i := gv_conarray.first;
             WHILE li_i is NOT NULL LOOP
                    execute immediate gv_conarray(li_i).comment_column;
                   li_i := gv_conarray.next(li_i);
             END LOOP;
exception when others then
  ls_sqlcode := sqlcode;
  ls_errm:=sqlerrm;
  insert into createtable_log(table_name,c_sqlcode,beizhu) values( l_tabname,ls_sqlcode,ls_errm );
   dbms_output.put_line( ls_sqlcode ) ;
  commit;
end sp_createtable;

ps:在開始除錯儲存過程的時候,在 execute immediate  時 經常報“ORA-00911 無效字元”錯誤,無論怎麼搞都找不到原因,我把語句copy到plsql中執行通過。   後來找了很久才發現  在execute immediate中 不能執行多行語句和不允許有分號.

相關推薦

oracle 自動

       目前由於做一個專案,由客戶自己定義表名、表字段、欄位是否允許為空等等,所以寫了一下程式碼: tab_object表主要用於儲存表名、表空間等。 -- Create tablecreate table TAB_OBJECT(  ID            VARC

IDEA建立springboot+hibernate+oracle自動遇到的問題

按照貫通的搭建模式  maven空專案+子模組,發現配置好 oracle  ,jpa依賴,yml檔案 配置好,實體類建好 ,自動建表失敗  後來發現原因  springboot載入時 是 預設當前路徑 或者上一級路徑下 ,  而springboot 專案是三維定位 ,

Activiti+oracle 啟動專案時不能自動或更新的問題分析及解決辦法

現象描述:按照正常配置,第一次啟動時不能自動建表 關鍵配置片段如下: <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguratio

oracle案列

oracl png blog ima src img 9.png 技術分享 acl 下面是以商品交易為案列 做的關於用戶、庫存、商品、交易的表格                                    oracle創建表案列

Oracle空間、創用戶以及授權

指定表 count conf fault 除了 max limited 初學 ati Oracle安裝完後,其中有一個缺省的數據庫,除了這個缺省的數據庫外,我們還可以創建自己的數據庫。 對於初學者來說,為了避免麻煩,可以用‘Database Configuratio

oracle

time tab sele wid url eight 跟蹤 from select --創建表create table browser_track( btId number not null , opend_id varchar2(50) not null, url

Oracle空間及用戶

blog -m html rod str ffffff 創建 manage spl 一、創建表空間 1、設置實例名 echo $ORACLE_SID export ORACLE_SID=mvbpbang 2、sqlplus登錄/sqlplus命令登錄   

Hiberntate不能自動的問題:hibernate.(*)

寫代碼 dial ddl ber pro nta auto OS div 今天寫代碼的時候發現啟動服務器之後不能自動建表了?wtf什麽鬼?最後發現了這個問題: hbm2ddl.auto前的hibernate.省略之後出的問題,可能是bug之後的版本應該會修復 <pro

oracle空間

oracle創建表空間參數詳解 語法描述: CREATE?[UNDO]? TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...... [ { MININUM?EXTENT integer [k|m] | BLOCK

第三次 orm自動及遇到的問題

tag ket evaluate jdbc rect clip bstr extra .com Hibernate支持自動建表,在開發階段很方便,可以保證hbm與數據庫表結構的自動同步。 方法很簡單,在hibernate.cfg.xml內加入 <property na

hibernate不能自動:MySQLSyntaxErrorException: Table '' doesn't exist

mysql mysql5 nat nta exist ble property cep exception 修改前: <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect<

oracle空間及oracle 11g空間之最大最小

rop create default 數據文件 32位系統 conn dbf ide 剩余空間 /*分為四步 *//*第1步:創建臨時表空間 */create temporary tablespace emaoyi_temp tempfile ‘D:\app\Adminis

配置資料庫方言為MySQLInnoDBDialect之後不能自動

配置了資料庫方言為MySQLInnoDBDialect之後不能自動建表 dev環境配置為MySQLInnoDBDialect,程式釋出到dev環境沒問題。dev的庫為mariadb5.5.33a。 後來dev資料庫遷移,順便把資料庫版本升級到了mariadb10.0,發

springdata jpa自動

application.properties檔案內容為: spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/demo?characte

hibernate通過pojo自動操作

1. 多對一 如球員和球隊的關係:多個球員在同一個球隊中。 1.1 類圖 TeamPojo:屬性 + set/get public class TeamPojo{ private Integer teamId; private String teamName; private String team

Oracle資料庫前,先判斷是否存在,存在不,不存在則

------建立TABNAME ---------- DECLARE   TOTAL INT := 0; BEGIN   SELECT COUNT(1)     INTO TOTAL     FROM USER_TABLES A

Oracle常用語句

欄位型別: 名稱:SERIES_NAME VARCHAR2(200) 數字:ONWAY NUMBER 標識:FLAG NUMBER(1) 日期:DATE_DAY VARCHAR2(20) create table CUSTOMER_COUNT ( UPDATE_DATE DATE

hibernate關閉自動

表結構和資料總是在程式執行的時候無端的修改,折騰了好長時間,查了很長時間hibernate的資料庫對映檔案和介面程式,始終沒有發現有什麼錯誤,到最後才發現了它!            <prop

出現 Unable to instantiate default tuplizer,hibernate自動失敗,原因是在實體類中聲明瞭成員變數describe,而describe是mysql關鍵字

歡迎使用Markdown編輯器寫部落格 本Markdown編輯器使用StackEdit修改而來,用它寫部落格,將會帶來全新的體驗哦: Markdown和擴充套件Markdown簡潔的語法 程式碼塊高亮 圖片連結和圖片上傳 LaTex數學公式 UML序列圖和

springBoot使用jpa不自動問題

目錄結構 實體類: package test; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;