在SQL存储过程中,我希望能够构造表名并创建它。
示例:我刚刚登录公司03下的数据库并且客户表不存在,所以我希望将proc发送到CREATE TABLE CUSTOMER03
。
有没有办法append company_id char(2)
到CUSTOMER
并将其提供给CREATE TABLE
声明?也许像
CREATE TABLE $tablename or $tablename+company_id?
答案 0 :(得分:9)
在Oracle中,语法类似于
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE CUSTOMER_'||v_company_id||' (..)';
END;
然而,这可能是一个非常糟糕的主意。在线下六个月后,您需要在表格中添加一列,然后您需要确定需要将哪些表格添加到表格中。
此外,Oracle中的存储过程需要一个固定的表名(现有表),或者您必须通过动态SQL引用所有内容,这很痛苦。
最好有一个customer_id作为属性的单个customer表。然后使用Fine Grained Access Control安全地过滤company_id,以控制谁看到公司的数据。
答案 1 :(得分:2)
将IF NOT EXISTS
修饰符用于CREATE TABLE
语句。这将导致仅在表尚不存在时才创建表。
答案 2 :(得分:2)
您需要使用动态SQL,例如:
DECLARE @company_id char(2)
SET @company_id = '02'
EXEC('CREATE TABLE CUSTOMER' + @company_id + ' (id int PRIMARY KEY)')
(测试)