在执行立即语句中创建具有默认值的表

Posted

技术标签:

【中文标题】在执行立即语句中创建具有默认值的表【英文标题】:Creating a table with a default value in execute immediate statement 【发布时间】:2013-07-24 19:50:26 【问题描述】:

我知道不建议使用立即执行命令创建表,但我需要创建一个表,该表在执行前提示用户输入 2 条信息。目前我有:

DECLARE
TEST_NAME VARCHAR2(200);  
TEST_VERSION VARCHAR2(200); 
BEGIN
  TEST_NAME := '&1';
  TEST_VERSION := '&2';

EXECUTE IMMEDIATE 'create table TEST_TABLE
(
PROJ_NAME VARCHAR(255) DEFAULT TEST_NAME,
PROJ_VER VARCHAR(255) DEFAULT TEST_VERSION,
COL_1 NUMBER(5)
)';
End;

这会引发错误

Error report:
ORA-00984: column not allowed here
ORA-06512: at line 8
00984. 00000 -  "column not allowed here"
*Cause:    
*Action:

我该如何解决这个问题?另外作为第二个问题,如果我要在不同的脚本中成功创建此表,我将如何使用 if 语句将变量与 proj_name 列的默认值 (test_name) 进行比较?

编辑: 感谢 tbone 和 Parado,我解决了我的第一个问题,但如果有人可以帮助知道如何使用 if 语句来做这样的事情:

If test_var = proj_name.default_value ...

即使没有插入任何行,我也需要能够与默认的 proj_name 值进行比较。 谢谢,

【问题讨论】:

【参考方案1】:

试试这个方法:

DECLARE
TEST_NAME VARCHAR2(200);  
TEST_VERSION VARCHAR2(200); 
BEGIN
  TEST_NAME := '&1';
  TEST_VERSION := '&2';

EXECUTE IMMEDIATE 'create table TEST_TABLE
(
PROJ_NAME VARCHAR(255) DEFAULT '''||TEST_NAME||''',
PROJ_VER VARCHAR(255) DEFAULT  '''||TEST_VERSION||''',
COL_1 NUMBER(5)
)';
End;

【讨论】:

我应该接受一个答案并在编辑中为我的第二个问题发布另一个问题吗? @javakid1993 我认为你应该这样做。【参考方案2】:

你可以这样做:

set serveroutput on

declare
  l_var1 varchar2(100) := 'SOME_VALUE';
  l_sql  varchar2(4000);
begin
  l_sql := 'create table test_tab(
  col1 varchar2(100) default ''' || l_var1 || '''
  )';

  -- show the ddl used
  dbms_output.put_line(l_sql);

  -- create the table
  execute immediate l_sql;

end;

我在这里将 l_var1 硬编码为“SOME_VALUE”,但您可以对参数或用户变量使用相同的方法。

【讨论】:

@javakid1993 很高兴听到,如果它对你有用,你可以接受这个答案(勾选它)。

以上是关于在执行立即语句中创建具有默认值的表的主要内容,如果未能解决你的问题,请参考以下文章

在配置单元中创建表时向列添加默认值

在 C# 的代码隐藏中创建具有值的表脚本

在 C++ 中创建具有 2 个双精度值的类

使用 Dapper 插入具有默认值的表

ORACLE中创建如何创建表,并设置结构和默认值

如何在表中添加具有默认值的列