在execute immediate语句中创建一个具有默认值的表

时间:2013-07-24 19:50:27

标签: sql oracle stored-procedures default-value execute-immediate

我知道不建议使用execute immediate命令创建表,但是我需要创建一个表,在表单之前提示用户输入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值进行比较。 谢谢,

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

您可以这样做:

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',但您可以对参数或用户变量使用相同的方法。