是否有与#define
等效的SQL?#define等效于Oracle SQL?
我在我的数据库使用NUMBER(7)
为ID的,我想这样做:
CREATE table Person (
PersonID ID,
Name VARCHAR2(31)
)
此:
#define ID NUMBER(7)
然后,我可以在创建我的表中使用ID如果我意识到我稍后需要更多/更少的空间,将允许我轻松更改所有ID的类型。
是否有与#define
等效的SQL?#define等效于Oracle SQL?
我在我的数据库使用NUMBER(7)
为ID的,我想这样做:
CREATE table Person (
PersonID ID,
Name VARCHAR2(31)
)
此:
#define ID NUMBER(7)
然后,我可以在创建我的表中使用ID如果我意识到我稍后需要更多/更少的空间,将允许我轻松更改所有ID的类型。
在SQL Plus脚本可以使用替代变量是这样的:
DEFINE ID = "NUMBER(7)"
CREATE table Person (
PersonID &ID.,
Name VARCHAR2(31)
);
基本定义(类似于C#define)被称为查询指令。查询指令不能用于定义宏。
你可以阅读关于查询指令here,但我认为你需要它是一个简单的常量。
constant_name CONSTANT datatype := VALUE;
不,在Oracle中无法做出这种动态定义。尽管Oracle确实有用户定义的列类型的概念,可以让您在单个对象中全局定义它,但是一旦创建了一个具有此类列的表,该定义将被冻结,您将得到一个“ORA-02303:如果您尝试重新定义类型,则不能删除或替换具有类型或表格依赖项的类型。
我强烈建议得到PowerDesigner中,你让你通过使用域做到这一点的一个副本。
此代码声明两个常量。我们不打算使用常量本身,而是使用它们的类型。 在create table语句中,我们将Name和Blood声明为“相同类型的blood_type和name_type”。如果后面我们需要更多的空间,我们只需要改变常量的类型,并且脚本中用%TYPE声明的所有字段都会受到影响。我希望它能帮助你。
DECLARE
blood_type CONSTANT CHAR;
name_type CONSTANT varchar2(10);
BEGIN
create table patient (
Name name_type%TYPE,
Blood blood_type%TYPE
)
END;
/
EDITED:作为dpbradley说,与此代码的问题。 Oracle不允许直接在开始块内创建表。必须使用DBMS_SQL包来创建表格,这会使解决方案变得不可读和不舒服。抱歉。
您是否打算允许动态重定义该列,即在创建表后通过一次更改来更改多个表中列的定义?我看到一些答案似乎旨在全局定义表格的首次创建属性。 – dpbradley 2009-07-13 18:08:34
我只想在创建表格时第一次使用该变量。我有很多表将使用ID'类型',如果我决定通过创建模式来改变ID大小,我希望能够在一个地方进行更改。 – jjnguy 2009-07-13 18:10:14
但是那么你会不会有一半ID与一个ID大小一半? – dpbradley 2009-07-13 18:19:40