1

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

4

2 回答 2

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;
于 2013-07-24T19:53:22.390 回答
1

你可以这样做:

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

于 2013-07-24T20:02:28.443 回答